浏览器不执行XSS代码原因探究


0x01:

早晨和90sec的表哥们讨论起这个问题。是因为某大佬进入后台发现他的XSS代码没被过滤但是并没有执行所导致的。

0x02:

深入看了下,目标script标签代码是由dom进行创建的,测试代码如下:

<div id="xxx">aaaaa</div>
<a href="javascript:" onclick="a();">cli</a>
<script>

function a(){
    var td = document.getElementById('xxx');
    td.innerHTML = "<script>alert(1)<\/script>";
}
</script>

在单击cli后,html代码改了,但是并没有执行js:
Snipaste_2019-07-09_15-22-21.png
经过探究后,发现这个和浏览器DOM解析有关系,在点击onclick后,dom修改了HTML的text值。并且浏览器进行了渲染
这里浏览器只对dom进行了渲染,但是没有进行执行。其原因是浏览器对于html的解析模式为打印机模式
什么是打印机模式?
打印机模式就是一个字符一个字符的读取。当我们点击cli的时候,浏览器是已经解析完毕了。而打印机是不会倒回去在给你进行打印一次的。

生动的说就是:吃饭。 食物从口腔进入胃,期间你的味觉就可以比作是js解析器在解析js。当你把食物(html)一点点吃进去的时候,由于经过了味蕾所以解析了味道。但是如果是医生直接用导管给你灌到胃里面去,并没有经过味蕾,所以你虽然饱了(html渲染成功)但是并没有解析js。

0x03:

发现改为img标签可以弹框,测试代码:

<div id="xxx">aaaaa</div>
<a href="javascript:" onclick="a();">cli</a>
<script>

function a(){
    var td = document.getElementById('xxx');
    td.innerHTML = "<img src=1 onerror=alert(1)>";
}
</script>

Snipaste_2019-07-09_15-22-21.png
原因:
因为img标签使用了onerror,属于事件驱动,虽然浏览器解析完了html但是浏览器其实会开线程去监听标签所触发的各种事件。

0x04

既然弄清楚了原理要插入远程js就很容易了,可以调用img的事件去插入标签,测试代码:

<div id="xxx">aaaaa</div>
<a href="javascript:" onclick="a();">cli</a>
<script>

function a(){
    var td = document.getElementById('xxx');
    td.innerHTML = "<img src=1 onerror='&#x76;&#x61;&#x72;&#x20;&#x73;&#x3d;&#x64;&#x6f;&#x63;&#x75;&#x6d;&#x65;&#x6e;&#x74;&#x2e;&#x63;&#x72;&#x65;&#x61;&#x74;&#x65;&#x45;&#x6c;&#x65;&#x6d;&#x65;&#x6e;&#x74;&#x28;&#x27;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x27;&#x29;&#x3b;&#x73;&#x2e;&#x69;&#x6e;&#x6e;&#x65;&#x72;&#x54;&#x65;&#x78;&#x74;&#x3d;&#x22;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;&#x22;&#x3b;&#x64;&#x6f;&#x63;&#x75;&#x6d;&#x65;&#x6e;&#x74;&#x2e;&#x62;&#x6f;&#x64;&#x79;&#x2e;&#x61;&#x70;&#x70;&#x65;&#x6e;&#x64;&#x43;&#x68;&#x69;&#x6c;&#x64;&#x28;&#x73;&#x29;&#x3b;'>";
}
</script>

Snipaste_2019-07-09_15-38-26.png

声明:小透明 | 渗透测试,代码审计,Web安全|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 浏览器不执行XSS代码原因探究


emmmmmmmmmmm............