随着因特网的不断发展,人们对网络的使用越来越频繁,通过网络进行购物、支付等其他业务操作。而一个潜在的问题是网络的安全性如何保证,一些黑客利用站点安全性的漏洞来窃取用户的信息,使用户的个人信息泄漏,所以站点的安全性变得很重要。
Web 系统的安全性测试包括以下内容:
(1)Web 漏洞扫描
(2)服务器端信息测试
(3)文件和目录测试
(4)认证测试
(5)会话管理测试
(6)权限管理测试
(7)文件上传下载测试
(8)信息泄漏测试
(9)输入数据测试
(10)跨站脚本攻击测试
(11)逻辑测试
(12)搜索引擎信息测试
(13)Web Service 测试
(14)其他测试
本章节主要给大家介绍第(10)点——跨站脚本攻击测试
XSS 又叫CSS(Cross Site Script,跨站脚本攻击),是指恶意攻击者在Web 页面里插入恶意HTML 代码。当用户浏览该页时,嵌入其中的HTML 代码会被执行,从而达到恶意攻击的目的。
XSS 属于被动式攻击,因为其被动且不好利用,所以容易被忽略其危害性。
XSS 攻击分成两类:一类是来自内部的攻击,另一类是来自外部的攻击。内部攻击是指利用程序自身的漏洞,构造跨站语句;外部攻击是指自己构造XSS 跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。
测试包括两方面的内容:GET 方式跨站脚本测试和POST 方式跨站脚本测试
(1)GET 方式跨站脚本测试
GET 方式跨站脚本测试主要是测试以GET 方式提交的请求页面是否存在漏洞。如下面的页面,
假设访问的UTL 为http://127.0.0.1:81/testget.php。
该页面输出的内容为“欢迎您,[name]”,name 为输入的参数,如输入URL 为http://127.0.0.1:81/testget.php?name=test,页面显示的内容为“欢迎您,test”。
浏览器对网页的展现通过解析HTML 代码来实现,那么如果name 的参数为HTML 代码,结果会怎么样呢?具体的测试步骤如下:
步骤1:将URL 修改为http://127.0.0.1:81/testget.php?name=<script>alert(hello)</script>,如果alert 函数弹出一个hello 对话框,则说明系统存在漏洞。
步骤2:如果没有弹出hello 对话框,则需要在页面上单击右键,在弹出菜单中选择“查看源文件”命令,如果源文件的内容为“欢迎您,<script>alert(hello)</script> ”,不管会不会弹出hello对话框,都说明系统存在跨站脚本漏洞。
步骤3:由于HTML 元素(比如<textarea>或")会影响脚本的执行,所以不一定能够正确地弹出hello 对话框,在测试过程中可以根据实际需要来构造name 的value 值,如多行文本输入框:
(2)POST 方式跨站脚本测试
POST 方式跨站脚本测试主要是测试以POST 方式提交的请求页面是否存在漏洞。如下面的页面,假设访问的UTL 为http://127.0.0.1:81/testpost.php
POST 方式跨站脚本攻击测试相对复杂一点,测试步骤如下:
步骤1:新建一个HTML 文件,假设为test.html,文件中的源代码如下:
<form action=" http://127.0.0.1:81/testpost.php " method="post">
<input name="name" value="<script>alert(hello)</script>" type="hidden" />
<input name="ss" type="submit" value="XSS 测试" />
</form>
步骤2:运行test.html 文件,如果alert 函数会弹出一个hello 对话框,则说明系统存在漏洞。
步骤3:如果没有弹出hello 对话框,则需要在页面上单击右键,在弹出菜单中选择“查看源
文件”命令。如果源文件的内容为“欢迎您,<script>alert(hello)</script> ”,那么不管会不会弹出hello 对话框,都说明系统存在跨站脚本漏洞。
步骤4:由于HTML 元素(比如<textarea>或")会影响脚本的执行,所以不一定能够正确地弹出hello 对话框,在测试过程中可以根据实际需要来构造name 的value 值,如多行文本输入框:
</textarea><script>alert(123456)</script>
文本输入框:
</td><script>alert(123456)</script>
'><script>alert(123456)</script>
"><script>alert(123456)</script>
</title><script>alert(123456)</script>
--><script>alert(123456)</script>
[img]javascript:alert(123456)[/img]
<scrip<script>t>alert(123456)</scrip</script>t>
</div><script>alert(123456)</script>
说明:以上两种方式都是手工方式,在测试过程中由于网页太多,使用手工测试很难测试全面,可以借助测试工具(如AppScan 工具)进行扫描测试。但是扫描工具只能提高效率,并不能完全代替手工测试,因为扫描工具受到规则和技术的限制,可能误报甚至漏报,所以手工测试还是必不可少的。