web前端安全基础与攻防(续篇)


web前端安全基础与攻防(续篇)


继续前面的内容,由于转发到一些论坛时,限制了每个帖子中,添加图片链接的数量,而前篇包含的图片数量已经达到上限,因此开一个新帖继续讨论。

还记得在前篇中有一段针对使用 IE 浏览器用户的攻击载荷,如下所示 :

<script>function XSS(){
        a = new ActiveXObject(‘Microsoft.XMLHTTP‘);
        a.open(‘get‘, ‘http://www.baidu.com‘, false);
        a.send();
        b = a.responseText;
        document.write(b);
        }
        XSS();
</script>

上面代码中,使用 IE 实现的XHR(XMLHttpRequest)对象访问百度首页并且通过javascript读取返回的数据(responseText),并且可以写入当前页面。

这是因为 IE 的同源策略没有很好地对XMLHttpRequest进行约束,例如,上述代码可能位于本地硬盘的一个HTML文本中(C:\Users\shayi\Desktop\XssPayloadTest.html

我们已经在上一篇博文中看到,IE 默认允许XHR跨域加载并读写资源;对于其它浏览器(FireFox 与 chrome)而言,本地文件系统路径与“百度首页”是不同源的,因此它们会限制当前HTML文本所在源中的javascript读写从百度首页返回的数据,换言之,这两个浏览器的同源策略默认仅允许XHR加载,读写相同源中的数据,除非对浏览器以及目标站点的web服务器配置为启用HTML5规范中引入的“跨域资源共享”(CORS)。

下面的示例代码,通过使用非 IE 浏览器支持的XHR对象,尝试跨域加载资源并写入至当前页面DOM中的一个节点:

(引用自《白帽子讲web安全一书》,略作修改)


<!DOCTYPE html>
<html lang="en">
    <head>
        <meta http-equiv="Content-type" content="text/html;charset=utf-8" />
        <title>XssPayloadTest</title>
        <script type = "text/javascript">
        var xmlhttp;
        function LoadXMLDoc(url)
        {
            xmlhttp = null;
            if (window.XMLHttpRequest)
            {
                xmlhttp = new XMLHttpRequest();
            }
            else if (window.ActiveXObject)
            {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            if (xmlhttp != null)
            {
                xmlhttp.onreadystatechange = state_Change();
                xmlhttp.open("GET", url, true);
                xmlhttp.send(null);
                
            }
            else
            {
                alert("your browser does not support XMLHTTP");
            }
        }

        function state_Change()
        {
            if (xmlhttp.readyState == 4)
            {
                if (xmlhttp.status == 200)
                {
                    document.getElementById(‘T1‘).innerHTML = xmlhttp.responseText;
                }
                else
                {
                    alert("problem retrieving data:" + xmlhttp.statusText);
                }
    
            }
        }        
        </script>
    
    </head>
    <body onload = "LoadXMLDoc(‘http://bbs.pediy.com/index.php‘)">
    <div id = "T1" style = "border:1px solid black;height:40;width:300;padding:5"></div><br />
    <button onclick = "LoadXMLDoc(‘http://shayi1983.blog.51cto.com‘)">Click</button>
    </body>
</html>


这个在HTML文档头部(head元素内)引入的javascript定义了两个函数: LoadXMLDoc()通过浏览器支持的XHR类型来跨域发起HTTP GET请求并加载资源;

 state_Change()检查对方web服务器返回的HTTP响应状态码,然后决定是读取响应数据的内容并写入当前页面(状态码为200);还是给出服务器端返回的错误信息(除200以外的其它状态码)。

在HTML文档体(body元素内),通过实际调用LoadXMLDoc()来对看雪论坛首页发起跨域请求(注意,当前“源”是本地文件系统上的测试用HTML页面),然后尝试将对方返回的“响应文本”(responseText)写入当前页面DOM的T1节点的内部HTML文本中,并且在文档体中添加一个按钮,用户点击时将再次通过XHR对象,发起对我的51cto博客页面的跨域请求。

上面代码在FireFox中的测试结果如下所示:


技术分享





本文出自 “自由,平等,共享,互助” 博客,转载请与作者联系!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。