浏览器解析与编码绕过

0x00背景

        学习了这么久,我才发现根本不会绕过,以前以为就是简单的编码转换就好了,乱编一通。经过大佬的直接与分享资料之后,才算弄懂。记录,加深理解。

0x01浏览器解析

浏览器的解析可以分为3步:

1. HTML解析(HTML解析器)

2. JS解析(JavaScript解析器)

3. URL解析(URL解析器器)

        这3个解析器协调工作,首先浏览器接收到一个HTMl文档时,会触发HTML解析器对文档进行词法解析,完成HTML解码和DOM树的建立。接下来JavaScript解析器介入开始对内联的脚本进行解析,包括解码操作。如果浏览器遇到需要URL的上下文,URL解析器也会介入开始解析解码。(URL解析会根据文档中URL的实际位置不同而在不同的时间解析,例如遇到Onclick事件需要触发才会执行的代码会跳过,等到事件被触发时才会被解析)

举个栗子:

  <html>

<head>

<script type="text/javascript">

    function open_win()

        {

            window.open("javascript:alert(1)");

        }

</script>

<body>

    <input type="button" name="Open window" onclick="open_win()">

</body>

</head>

</html>

        在这个html文档中,解析的顺序就是:HTML解析-->JavaScript解析(触发onclick事件)-->URL解析-->JavaScript解析

        因此可以看到,如果对以上文档的open函数的参数("javascript:alert(1)") 进行编码的话,应该是URL编码(当然,只要JavaScript被正确解码之后,后面的alert也可以使用JavaScript编码)。

0x02 常见编码

HTML字符实体:< 编码为&lt; &#60;

JavaScript编码:<编码为unicode码\u003C

URL编码:%加上字符的ASCII编码对应的2位数字

因此在进行编码绕过的时候,要根据当前输入点的位置与输入的内容进行正确的编码绕过。

以上面的代码为例:

        如果只是将javascript:alert(1)  整体全部进行URL编码

window.open("%6A%61%76%61%73%63%72%69%70%74:%61%6C%65%72%74%28%31%29");

        那么是绕不过去的,因为整体编码就连协议类型(JavaScript)一起编码了,浏览器在进行URL解析的时候就会默认为无类型,所以只会按照URL的规则进行解析,但是不会涉及到JavaScript解析器,所以在这里这一条命令只像是被一句文本而已。

        如果只编码 alert(1) 的话就能正确执行,如下:

window.open("javascript:%61%6C%65%72%74%28%31%29");

        在这里当URL解析器介入开始解析的时候,能够识别出接下来的内容为JavaScript代码,所以就会再由JavaScript解析器进行解析。

    如果对整体进行Unicode编码的话也能正常解析执行。因为URL解析器运作时JavaScript解析器已经把javascript:alert(1)解析完成。

window.open("\u006a\u0061\u0076\u0061\u0073\u0063\u0072\u0069\u0070

\u0074\u003a\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0029");

如果对整体进行HTML实体编码,一样无法正确解析执行。因为这个函数是在onclick事件之后才会被解析执行,此时参与解析的只有JavaScript和URL解析器,HTML解析器已经不再参与到这个函数内的解码过程了,因此HTML实体编码无法被解析执行。

window.open("javascrip:alert(1)");

        同样的,类似如下场景,将输⼊入数据编码成HTML字符实体并将其放在script块中,也⽆无

法成功解析alert(1),因为script块中的编码解析不会调用HTML实体解析器。

alert(9);

<script>&#97;&#108;&#101;&#114;&#116&#40;&#57;&#41;&#59</script>

        若是如下情景,那么可以成功执行javascript:alert(1),因为整个编码文本是放在HTML的标签里面的,整个解析过程为HTML解析->URL解析->JavaScript解析,在URL解析器⼯作前,HTML解析器已经把字符实体转换成了javascript:alert(1)。

<a  href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#

108;&#101;&#114;&#116;&#40;&#49;&#41;">tkswifty</a>

        同理,如下情景也可以成功执⾏:

<a href=" &#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:%61%6C%

65%72%74%28%32%29 ">tkswifty</a>

0x04 细节:

(1)在字符串串中,Unicode转义序列列(\uXXXX)将永远不不会破坏字符串串的上下⽂文,因为

其只能被解析成字符串串常量量。(JavaScript解析时只有标识符名称不不会当字符串串解析,控制

字符(单双引号、换⾏行行符等)仅会被解析成标示符名称或者字符串串)

Examples:

<input type="button" name="demo" onclick="alert(1)">

对alert进⾏行行Unicode编码:

<input type="button" name="demo"  onclick="\u0061\u006c\u0065\u0072\u0074(1)">

可以解析执行

对alert(1)进⾏行行Unicode编码:

<input  type="button" name="demo" onclick="\u0061\u006c\u0065\u0072\u0074u0028\u0031\u0029">

无法解析执行

(2)URL解析过程的⼀一个细节:不不能对协议类型进⾏行行任何的编码操作,否则URL解析器器

会认为其⽆无类型。

(3)RCDATA元素有个特殊情况,在浏览器器解析RCDATA元素的过程中,解析器器会进

⼊入“RCDATA状态”。在这个状态中,如果遇到"<"字符,会转换到"RCDATA⼩小于号状态"。如

果"<"后没有紧跟"/"和对⾯面的标签名,解析器器会转换回"RCDATA状态"。

常⻅见的RCDATA元素:<textarea>和<title>

Example:

<textarea>中,唯⼀一能被解析器器认作标签的就是</textarea>,在其中新建标签,也不会有脚本可以执行。

<textarea><script type="text/javascript">alert(1)</script></textarea>

具体效果:

具体效果:

(4)当某些函数的执行改变了当前页面的DOM树结构,HTML解析器会再次执行解析。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容