前言
本篇文章,是对自己学习XSS的一次总结,说一些学习过程遇到的一些问题,也希望可以为大家解决一些问题。
从标签的角度讲XSS
因为要说到HTML,所以先给大家普及下HTML标签的知识,只说一些跟XSS有关的地方
HTML标签: <a href="javascript:alert(1)">Click me</a>
这里我们把HTML标签分为三个部分,标签,属性和文本
下面用一张图来给大家说明一下
标签:<a></a>
属性:href=javascript:alert(1)
文本:Click me
一般我们的输入点是在属性,例如:value=””。或者文本里面
当在属性中,我们可以用事件或者闭合来建立一个XSS
而在文本中就简单了,直接一个JS语句即可,例如:<script>alert("1");</script>
什么是基于DOM XSS
我的理解,就是用一些可以修改DOM节点的语句来建立XSS,例如document.write(innerHTML)
都是一些修改DOM节点的语句。
XSS绕过方法
1:大小写绕过。产生原因:写Filter的时候,完全匹配,或者正则中没有加大小写
代码:"> <a Href="javascript:alert('xss')">111</a> //
2:利用事件绕过。当我们的输入点在属性中,且过滤<>,就可以用到事件的绕过了
代码: ' oninput=alert'xss'//
3:把某些敏感代码过滤为空,可以中间加敏感代码
代码:"> <a HHrefref="javascscriptript:alert('xss')">111</a> //
4:换行 空格 tab。产生原因:只有当出现;或者出现结尾标签才算一句代码结束
5:伪协议绕过。Href="javascript:alert('xss')"
6:编码绕过。产生原因:解析的顺序问题。下面谈
为什么有些时候编码可以绕过XSS Filter
先给大家说下三种编码方式(来自Freebuf 一篇文章)
1:URL编码
2:HTML编码。
命名实体:以&开头,分号结尾的,例如"<"
的编码是"<"
字符编码:十进制、十六进制ASCII码或unicode字符编码,样式为”&#数值;”, 例如”<”可以编码为”<”和”<”
3:JS编码,js提供了四种字符编码的策略
三个八进制数字,如果不够个数,前面补0,例如"e"
编码为"\145"
两个十六进制数字,如果不够个数,前面补0,例如"e"
编码为"\x65"
四个十六进制数字,如果不够个数,前面补0,例如"e"
编码为"\u0065"
对于一些控制字符,使用特殊的C类型的转义风格(例如\n
和\r
)
说了一些编码,还要谈谈一些解析顺序,才好理解绕过的原理
下面说说浏览器对符合编码的解析顺序
以下一段代码
<a);>Click ME</a>
name的内容首先出现在一个URL中,这个URL在一段javascript中,而javascript代码又是html的一部分。
所以解码的顺序就是HTML解码 -> js解码 -> url解码,
那么正确的编码顺序就应该是url编码 -> js编码 -> html编码。
浏览器解析服务器传来的数据的顺序:先HTML,遇到JS,就JS解析
当我们可控参数所在的节点的结构不同时,解析的顺序也就不同
1 | <?php |
以上代码可以看到,过滤了尖角号,script等标签,当输入javascript:alert(/xss/)
时,系统返回的为:<pre><a></a>Click this url</pre>
我们现在分析一下$name
的环境,$name
先在HTML环境中,然后在JS环境中
浏览器解析的顺序是HTML解码->JS解码,
当我们对javascript:alert(/xss/)
进行HTML编码之后
正好绕过了上面的过滤函数
当解码的时候,先HTML,又变成了javascript:alert(/xss/)
在JS解码,弹窗出来
详情请看:http://www.freebuf.com/articles/web/43285.html(Freebuf文章)
XSS实战
给大家提供两个闯关PT。
好好做一遍,绝对受益良多。
表示做的时候看到了这个
熟悉么?就是前段时间Tools那个XSS漏洞~QAQ