近来在学习XSS,感觉有一些感悟,却又好像缺少一点什么。写这篇博客,既是一种总结,也希望能够通过这种写博客的方式整理一下自己的思路,当然如果有前辈能够不吝赐教的话就更好了。
0X01 理解浏览器对于编码的解析过程
关于这一点,segmentfault上面有一个回答解释的非常好:
当用户点击链接时,服务端首先通过URL解码,将input解析成了"<\u4e00>"。
然后浏览器在渲染的时候,首先进行HTML解码,得到"<\u4e00>"。
然后"javascript:"出发了javascript解释器进行javascript解码,这个过程中\u4e00被按照unicode编码解释成了"一"。
综合上面的例子,我们可以看到解码的过程是按照先URL解码,再HTML解码,然后JS解码的过程进行的。在HTML解码的过程中,是先生成DOM树,然后再对树上的每一个节点进行HTML的解析,因此构造编码的时候,不能导致破坏DOM树结构的情况,否则HTML解析就会出错。
0X02 XSS的类型
反射型
反射型XSS也叫做”非持久性XSS”,在XSS攻击的过程中,数据的流向是:
前端--->后端--->前端
因为不能存储到后台数据库,因此其也是“一次性的”,一般的利用方法是构造链接,诱骗目标点击。
存储型
存储型的XSS顾名思义就是会把输入的数据存放到服务端,数据可以长时间保存。其数据流向是:
浏览器--->后端--->数据库--->后端--->浏览器
因为其可以存储的特性,存储型XSS是最优的选择。
DOM型
DOM型的XSS其实也算是反射型XSS的一种,只不过它是通过修改页面的DOM节点形成的XSS,称之为DOM based XSS。其数据流向是:
URL--->浏览器
0X03 常见的XSS攻(qi)击(ji)方(yin)法(qiao)
(1)比如XSS-challenge stage10中,用户的输入被屏蔽了domain,因此无法正常的输入alert(document.domain)。这时可以考虑通过alert(document.domdomainain)来绕过,原理是中间的domain被过滤掉之后,两边的dom和ain被拼接到了一起,又是一个domain。
(2)<、>、\、"、'、script被过滤。这几个关键的字符都是XSS攻击中非常常见而且使用频率最高的一些字符,很多网站针对XSS的防御也是通过各种规则过滤这些特殊字符来实现的。需要具体情况具体分析,来设计绕过的字符串。
(3)通过编码的方式。javascript中常用函数String.fromCharCode( )可以接受unicode编码然后转成ASCII码输出,而eval()函数接受javascript代码的字符串,并执行这段代码。因此在XSS利用过程中,常常会通过eval(String.fromCharCode(unicodenum1,unicodenum2...))然后在进行URL编码。
PS:后续还会追加更新
0X04 参考资料
详细的讲述了浏览器解码的过程。
2、浏览器的解码顺序(html解码、url解码以及js解码)
本文中参考的例子就来自这个问题。
作者由浅入深用很多实际例子讲解了各种XSS问题
作者用简单的小例子讲解了三种XSS的概念
特别详细的讲了编码解码的过程