渗透测试就是对系统安全性的测试,经过模拟恶意黑客的攻击方法,来评估系统安全的一种评估方法。html
渗透测试能够包括各类形式的攻击,通常来讲会有专门的公司提供这种服务,这里整理了几种常见的渗透测试方法,能够对这web安全有初步的了解。web
首先找到带有参数传递的URL页面,如 搜索页面,登陆页面,提交评论页面等等。sql
<form id="form_search" action="/search/" method="get"> <div> <input type="text" name="q" id="search_q" value="" /> <input name="search" type="image" src="/media/images/site/search_btn.gif" /> <a href="/search/" class="fl">Gamefinder</a> </div> </form>
其次,在URL参数或表单中加入某些特殊的SQL语句或SQL片段,如在登陆页面的URL中输入HTTP://DOMAIN /INDEX.ASP?USERNAME='HI' OR 1=1数据库
根据实际状况,SQL注入请求可使用如下语句:安全
' or 1=1- - " or 1=1- - or 1=1- - ' or 'a'='a " or "a"="a ') or ('a'='a
为何是OR, 以及',――等特殊的字符呢?服务器
例如在登陆时进行身份验证时,一般使用以下语句来进行验证:cookie
sql=select * from user where username='username' and pwd='password'web安全
如 输入http://duck/index.asp?username=admin' or 1='1&pwd=11,测试
SQL语句会变成如下:sql=select * from user where username='admin' or 1='1' and password='11'
' 与admin前面的'组成了一个查询条件,即username='admin',接下来的语句将按下一个查询条件来执行。
接下来是OR查询条件,OR是一个逻辑运算符,网站
在判断多个条件的时候,只要一个成立,则等式就成立,后面的AND就再也不时行判断了,也就是说咱们绕过了密码验证,咱们只用用户名就能够登陆。
如输入http://duck/index.asp?username=admin'--&pwd=11,
SQL语 句会变成如下sql=select * from user where name='admin' --' and pasword='11',
'与admin前面的'组成了一个查 询条件,即username='admin',接下来的语句将按下一个查询条件来执行
接下来是"--"查询条件,“--”是忽略或注释,上 述经过链接符注释掉后面的密码验证(注:对ACCESS数据库无效)。
最后,验证是否能入侵成功或是出错的信息是否包含关于数据库服务器 的相关信息;若是 能说明存在SQL安 全漏洞.
试想,若是网站存在SQL注入的危险,对于有经验的恶意用户还可能猜出数据库表和表结构,并对数据库表进行增\删\改的操 做,这样形成的后果很是严重。
从应用程序的角度来说,咱们要作如下三项工做:
转义敏感字符及字符串(SQL的敏感字符包括“exec”,”xp_”,”sp_”,”declare”,”Union”,”cmd”,”+”,”//”,”..”,”;”,”‘”,”--”,”%”,”0x”,”><=!-*/()|”,和”空格”).
屏蔽出错信息:阻止攻击者知道攻击的结果
在服务端正式处理以前提交数据的合法性(合法性检查主要包括三 项:数据类型,数据长度,敏感字符的校验)进行检查等。最根本的解决手段,在确认客 户端的输入合法以前,服务端拒绝进行关键性的处理操做.
从测试人员的角度来说,在程序开发前(即需求阶段),咱们就应该有意识的将安全性检查应用到需求测试中,例如对一个表单需求进行检查时,咱们通常检验如下几项安全性问题:
需求中应说明表单中某一FIELD的类型,长度,以及取值范围(主要做用就是禁止输入敏感字符)
需求中应说明若是超出表单规定的类型,长度,以及取值范围的,应用程序应给出不包含任何代码或数据库信息的错误提示.
固然在执行测试的过程当中,咱们也需求对上述两项内容进行测试。
首先,找到带有参数传递的URL,如 登陆页面,搜索页面,提交评论,发表留言 页面等等。
其次,在页面参数中输入以下语句(如:Javascrīpt,VB scrīpt, HTML,ActiveX, Flash)来进行测试:
<scrīpt>alert(document.cookie)</scrīpt>
最后,当用户浏览 时便会弹出一个警告框,内容显示的是浏览者当前的cookie串,这就说明该网站存在XSS漏洞。
试想若是咱们注入的不是以上这个简单的测试代码,而是一段常常精心设计的恶意脚本,当用户浏览此帖时,cookie信息就可能成功的被 攻击者获取。此时浏览者的账号就很容易被攻击者掌控了。
从应用程序的角度来说,要进行如下几项预防:
对Javascrīpt,VB scrīpt, HTML,ActiveX, Flash等 语句或脚本进行转义.
在 服务端正式处理以前提交数据的合法性(合法性检查主要包括三项:数据类型,数据长度,敏感字符的校验)进行检查等。最根本的解决手段,在确认客户端的输入合法以前,服务端 拒绝进行关键性的处理操做.
从测试人员的角度来说,要从需求检查和执行测试过程两个阶段来完成XSS检查:
在需求检查过程当中对各输入项或输出项进行类型、长度以及取 值范围进行验证,着重验证是否对HTML或脚本代码进行了转义。
执行测试过程当中也应对上述项进行检查。
CSRF尽管听起来像跨站脚本(XSS),但它与XSS很是不一样,而且攻击方式几乎相左。
XSS是利用站点内的信任用户,而CSRF则经过假装来自受信任用户的请求来利用受信任的网站。
XSS也好,CSRF也好,它的目的在于窃取用户的信息,如SESSION 和 COOKIES,
Email Header Injection:若是表单用于发送email,表单中可能包括“subject”输入项(邮件标题),咱们要验证subject中应能escape掉“\n”标识。
由于“\n”是新行,若是在subject中输入“hello\ncc:spamvictim@example.com”,可能会造成如下
Subject: hello cc: spamvictim@example.com
若是容许用户使用这样的subject,那他可能会给利用这个缺陷经过咱们的平台给其它用 户发送垃圾邮件。
目录遍历产生的缘由是:程序中没有过滤用户输入的“../”和“./”之类的目录跳转符,致使恶意用户能够经过提交目录跳转来遍历服务器上的任意文件。
测试方法:在URL中输入必定数量的“../”和“./”,验证系统是否ESCAPE掉了这些目录跳转符。
限制Web应用在服务器上的运行
进 行严格的输入验证,控制用户输入非法路径
首 先找到一些错误页面,好比404,或500页面。
验证在调试未开经过的状况下,是否给出了友好的错误提示信息好比“你访问的页面不存 在”等,而并不是曝露一些程序代码。
测试人员在进行需求检查时,应该对出错信息 进行详细查,好比是否给出了出错信息,是否给出了正确的出错信息。
整理自论坛等