一、XSS简介
什么是XSS
XSS全称(Cross Site Scripting)跨站脚本攻击,是最常见的web应用程序安全漏洞之一,位于OWASP top 10 2013年度第三名,XSS是指攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的危险代码,当用户使用浏览器浏览网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。
从上面的一段话,可以得知,xss属于客户端攻击,受害者最终是用户,但特别要注意的是网站管理人员也属于用户之一。这就意味着xss可以进行“服务端”攻击,因为管理员要比普通用户的权限大得多,一般管理员都可以对网站进行文件管理,数据管理等操作,而攻击者一般也是靠管理员身份作为“跳板”进行实施攻击。
xss攻击最终目的是在网页中嵌入客户端恶意代码,最常用的攻击代码是JavaScript语言,但也会使用其他的脚本语言,例如:ActionScript、VBScript。而如今的互联网客户端脚本基本上是基于JavaScript,所以如果想要深入研究xss,必须要精通JavaScript。
xss换句话说,JavaScript能够到什么效果,xss的胃里就有多大。这完全不是危言耸听。JavaScript可以用于获取用户的cookie,弹出窗口,那么存在xss漏洞的网站,xss就可以用来盗取用户cookie,废掉页面,导航到恶意网站!更高端的xss代码完全可以进行监控你的键盘操作,模仿windows注销界面,诱导你输入开机密码!而攻击者需要做的仅仅是向你的代码中注入JavaScript代码!
如何挖掘xss
寻找脚本程序的输出显示代码,搜索关键字,显示输出那个变量,跟踪变量是否过滤。
二、xss的类型
(一)反射型xss或不持久型xss
实例1
<?php $name = $_GET['name'];
echo "Welcome $name</br>"; ?>
测试结果
在这段代码中程序接受name的值,并且输出,如果提交xss1.php?name=111,那么程序将输出111,如果恶意用户输入nam=<sCrIpT>恶意代码</sCrIpT>,因为程序并没有进行xss代码过滤,最终造成反射型xss漏洞。
实例2
在线xss跨站网站:https://public-firing-range.appspot.com/
(二)存储型xss或持久型xss
实例1
与反射型xss相比,唯一的区别就是xss代码被带入数据,在下次浏览时,又被读取出来使用DVWA
mysql -uroot -p
use dvwa;
show tables;
select * from guestbook;
delete from guestbook;
<script>alert(/xss/)</script>
此时xss脚本已经存入数据库
实例2
新建一个xss/index.php文件:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title></title> </head> <body> <div> <?php if(isset($_POST['input'])) { $data = $_POST['input']; echo $data; } ?> </div> <form action="" method="post"> <p> <textarea name="imput" rows="20" cols="60"></textarea> </p> <p> <input type="submit" value="Go" /> </p> </form> </body> </html>
(三)DOM xss
隐蔽性比较好,扫描器很难扫出!
实例1
DOM
<script> var urls = document.URL; var index = document.URL.indexOf("url=")+4; var par = urls.substring(index); document.write(decodeURI(par)); </script>
实验如下:
不知道为什么突然上传不了图片了
(四)变异 xss
http://www.thespanner.co.uk/2014/05/06/mxss/
变异xss是从安全范围引导入到不安全的过滤范围。大多数的常见的变异xss结构是源于错误的阅读innerHTML之间的代码。一个好的变异xss例子是使用listing元素使xss条件满足
<listing><img src=1 onerror=alert(1)>listing>
当listing的innerHTML之间被读,它转变进入一个image元素,即使原始的HTML被避开。
下面的代码例子显示出实际是如何被解析的。
<listing id=x><img src=1 onerror=alert(1)>listing> <script>alert(document.getElementById('x').innerHTML)</script>
alert的预期的结果是将输出 “ <img src=1 onerror=alert(1)> ”,然后IE10实际解析返回的结果是 “ <img src=1 onerror=alert(1)> ”。引导者从安全范围引导入不安全的过滤范围。变异xss影响数据多次被读,第一层是真实的HTML,而且每次读innerHTML之间是被看作其它变异,取决于它变异的次数。
http://www.businessinfo.co.uk/lab/mxss/
通过使用mxss tool可以轻松知道矢量变异和执行。因为变异xss影响多个等级,根据下面的HTML将完美有效的,如果你改变等级到2.这读写HTML两次,你当然能增加变异值和无限编译。
<listing id=x>&lt;img src=1 onerror=alert(1)></listing>
HTML编译器解析经常混乱而又可理解,因为复杂的相互作用的HTML、实体和不同的文本类型。那些混淆发生在HTML和XHTML。在IE9实际文档格式将会被解析软件混乱编译这是一个XHTML元素而不是HTML元素。
(五)专业或相对路径覆盖 xss
http://challenge.hackvertor.co.uk/xss_horror_show/chapter7/rpo.php
(六)不存储型 xss
只要是输入的地方都可以插入恶意xss代码
四 xss测试技巧
工具扫描
APPscan
awvs
burpsuite
XSSERXSSF
http://www.domxsscanner.com/
手动测试
使用手工检测web应用程序是否存在xss漏洞,最重要的是考虑那里有输入,输入的数据在什么地方输出。
在进行手工检测xss时,人毕竟不像软件那样不知疲倦,所以一定要选择有特殊意义的字符,这样可以快速测试是否存在xss。比如测试某输入是否存在xss漏洞,请不要直接输入xss跨站语句进行测试一步一步来,这样更有利于测试。
第一种情况:可得知输出位置
输入一些敏感字符,例如<、>、"、'、() 等等,在提交请求后去查看HTML源代码,看这些输入的字符是否被转义。
在输出这些敏感字符的时候,很有可能程序已经做过了过滤,那么你在寻找这些字符的时候就不是那么容易了,这时候你可以直接输入“XXSER<>"'&”折床字符串,然后再查找源代码的时候直接进行查找XXSER或许比较方便一些。
第二种情况:无法得知输出位置
非常多的web应用程序源代码是不对外开放的,这时在进行测试xss时就有可能无法得知输入数据到底在何处显示,比如测试某留言本是否存在xss,那么在留言之后,你必须要经过管理员的审核才能进行显示,这时你是无法得知,你输入的数据在后台管理页面处于何种状态,例如:
在<div>标签之中:<div>XSS test</div>
在<input>标签之中:<input type="text" name="content" value="xsst test"/>
对于这种情况通常会采用输入" ">... "来进行测试
万能测试xss漏洞代码:“ /></textarea><script>alert(1)</script> ”
有些情况手工检测漏洞效率比全自动检测软件更快(漏洞验证),因为测试人员通过经验可以快速的发现输入点,这是扫描器所无法比拟的。
另外,一些xss漏洞也不仅仅是直接注入到HTML,或者数据库中才能触发,比如在上传文件时修改文件名“<script>alert(/xss/)</script>”,那么程序在读取文件名后并将文件名显示在HTML文档中,也会触发xss漏洞。
有着输入的地方就有可能存在着风险,如果连输入都没有了,xss也不必检测了,包括其他安全漏洞。