DOM-XSS攻击原理与防御

XSS的中文名称叫跨站脚本,是WEB漏洞中比较常见的一种,特点就是可以将恶意HTML/JavaScript代码注入到受害用户浏览的网页上,从而达到劫持用户会话的目的。XSS根据恶意脚本的传递方式可以分为3种,分别为反射型、存储型、DOM型,前面两种恶意脚本都会经过服务器端然后返回给客户端,相对DOM型来说比较好检测与防御,而DOM型不用将恶意脚本传输到服务器在返回客户端,这就是DOM型和反射、存储型的区别,所以我这里就单独的谈一下DOM型XSS。

DOM文档

为了更好的理解DOM型XSS,先了解一下DOM,毕竟DOM型XSS就是基于DOM文档对象模型的。对于浏览器来说,DOM文档就是一份XML文档,当有了这个标准的技术之后,通过JavaScript就可以轻松的访问它们了。

下面举例一个DOM将HTML代码转化成树状结构:

<html>
    <head>
        <meta charset="gbk" />
        <title> TEST </title>
    </head>
    <body>
        <p>The is p.<p>
        <h1>Product:</h1>
        <ul>
            <li>Apple</li>
            <li>Pear</li>
            <li>Corn</li>
        </ul>
    </body>
</html>

转化成模型如下图:

这样做的好处就是,通过这种简单的树状结构,就能把元素之间的关系简单明晰的表示出来,方便客户端的JavaScript脚本通过DOM动态的检查和修改页面内容,不依赖服务端的数据。

利用原理

客户端JavaScript可以访问浏览器的DOM文本对象模型是利用的前提,当确认客户端代码中有DOM型XSS漏洞时,并且能诱使(钓鱼)一名用户访问自己构造的URL,就说明可以在受害者的客户端注入恶意脚本。利用步骤和反射型很类似,但是唯一的区别就是,构造的URL参数不用发送到服务器端,可以达到绕过WAF、躲避服务端的检测效果。

为了更方便大家的理解,下面我举几个场景给大家理解。

场景一:innerHTML

<html>
    <head>
        <title> DOM-XSS TEST </title>
        <style>
            #box{width:250px;height:200px;border:1px solid #e5e5e5;background:#f1f1f1;}
        </style>
    </head>
    <body>
        <script>
            window.onload= function(){
                var oBox=document.getElementById("box");
                var oSpan=document.getElementById("span1");
                var oText=document.getElementById("text1");
                var oBtn=document.getElementById("Btn");
                oBtn.onclick = function(){
                    oBox.innerHTML = oBox.innerHTML + oSpan.innerHTML + oText.value + "<br/>";
                    // oBox.innerHTML += oSpan.innerHTML + oText.value +  "<br/>";//这是简便的写法,在js中 a=a+b ,那么也等同于 a+=b
                    oText.value=""
                };
            }
        </script>

        <div id="box"></div>
        <span id="span1">小明:</span>
        <input type="text" id="text1"/>
        <input id="Btn" type="button" value="发送消息" name=""/>
    </body>
</html>

第一次是正常访问:

hellow

第二次是将JavaScript代码作为参数写入值中:

<svg/onload=alert(1)>

这里我只在火狐浏览器利用成功,在chrome利用失败,我猜可能chrome对安全防护做得比较好,这里不继续各个浏览器版本问题。

使用innerHTML、outerHTML 时要注意,标签需不进行编码处理,可能会导致XSS。防护方法就是替换成innerText,它自动将HTML标签解析为普通文本,所以HTML标签不会被执行,避免XSS攻击。

oBox.innerText = oBox.innerHTML + oSpan.innerHTML + oText.value + "<br/>";

场景二:跳转

<html>
    <head>
        <title> DOM-XSS TEST </title>
    </head>
    <body>
        <script>
            var hash = location.hash;
            if(hash){
                var url = hash.substring(1);
                location.href = url;
            }
        </script>
    </body>
</html>

正常访问是用#去实现页面跳转,但是因为跳转部分参数可控,可能导致Dom xss。

通过 location.hash 的方式,将参数写在 # 号后,既能让JS读取到该参数,又不让该参数传入到服务器,从而避免了WAF的检测。

变量hash作为可控部分,并带入url中,变量hash控制的是#之后的部分,可以使用伪协议#javascript:alert(1)。常见的几种伪协议有javascript:vbscript:data:等。而现在的移动端(android和ios),都可以自定义这种协议从浏览器打开本地app,具体可以看看https://www.cnblogs.com/WuXiaolong/p/8735226.html

#javascript:alert(1)

场景三:eval

#‘;alert(1);//

直接将用户输入数据拼接到代码里。

eval("var x = ‘" + location.hash + "‘");

场景四:cookie、referrer

从localStorage、SessionStorage、Cookies储存源中取数据,这些值往往会被开发者忽略,认为这些值都是在浏览器获取的,是安全的,就未进行处理。

var cookies = document.cookie;
document.write(cookies);

场景五:document.write 、document.URL.indexOf("id=")

var ids = document.URL;
document.writeln(ids.substring(ids.indexOf("id=")+3,ids.length));

indexOf获取url里面的参数,然后通过writeln( )或者write( )输出到HTML,造成xss,不过我现在(2020.3)在chrome和firefox浏览器测试,write()函数很难利用,除非结合一些特殊场景。

防护策略

还有一些正则匹配缺陷、业务逻辑型缺陷、配合移动端跳转等、使用第三方前端框架(比如多媒体编辑框)等场景没有一一进行说明(精力实在有限了...),后期有空可能会继续补全这些场景。

检测的流程就是通过查看代码是否有document.write、eval、window之类能造成危害的地方,然后通过回溯变量和函数的调用过程,查看用户是否能控制输入。如果能控制输入,就看看是否能复习,能复习就说明存在DOM XSS,需要对输入的数据进行编码。

代码审计时审计的特征点(包括但不限于):

            var elements = location.hash;
            elements.indexOf

            var oBtn=document.getElementById("Btn");
            oBtn.innerHTML
            oBtn.outerHTML

            document.createElement
            oBtn.setAttribute
            oBtn.appendChild

            document.write
            document.writeln

            eval("var x = ‘" + location.hash + "‘");
            setTimeout("alert(‘xss‘)", 1000)
            window.setTimeout
            document.setTimeout
            window.setInterval

            document.execCommand(‘ForeColor‘,false,‘#BBDDCC‘);
            document.createElement
            document.createElementNS
            document.createEvent
            document.createXxx

js语法很灵活、库函数也很多,这里没法完全列举全,我觉得需要对js语法体系有一定了解,才可能更多的找全这些特征。

当业务需要必须得将用户输入的数据放入html,那就要尽量使用安全的方法,比如innerText(),testContent()等。在使用框架时尽量使用框架自带的安全函数。

参考文档

《XSS跨站脚本-攻击剖析与防御》

《Web漏洞防护》

https://xz.aliyun.com/t/5181

https://domgo.at/cxss/example

https://www.secpulse.com/archives/92286.html

原文地址:https://www.cnblogs.com/mysticbinary/p/12542695.html

时间: 2024-11-05 19:04:21

DOM-XSS攻击原理与防御的相关文章

XSS攻击原理及防御措施

概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列 表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实 施比如SQL注入攻击服务器和数据库.Click劫持.相对链接劫持等实施钓鱼,它带来的危害是巨 大的,是web安全的头号大敌. 攻击的条件 实施XSS攻击需要具备两个条件: 一.需要向web页面注入恶意代码: 二.这些恶意代码能

web安全之XSS攻击原理及防范

阅读目录 一:什么是XSS攻击? 二:反射型XSS 三:存储型XSS 四:DOM-based型XSS 五:SQL注入 六:XSS如何防范? 1. cookie安全策略 2. X-XSS-Protection设置 3. XSS防御HTML编码 4. XSS 防御HTML Attribute编码 5. XSS防御之javascript编码 6. XSS 防御之 URL 编码 7. XSS 防御之 CSS 编码 8. 开启CSP网页安全政策防止XSS攻击 回到顶部 一:什么是XSS攻击? XSS 即(

CSRF 攻击原理和防御方法

1. CSRF攻击原理 CSRF(Cross site request forgery),即跨站请求伪造.我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息.而CSRF确实,借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为“跨站请求伪造”. 一般而且存在XSS漏洞的网站,也极有可能存在CSRF漏洞.因为CSRF攻击中的那个“伪造的请求”的URL地址,一般是通过XSS攻击来注入到服务器中的.所以其实CSRF是以XSS为基础

浅谈JavaScript DDOS 攻击原理与防御

前言 DDoS(又名"分布式拒绝服务")攻击历史由来已久,但却被黑客广泛应用.我们可以这样定义典型的DDoS攻击:攻击者指使大量主机向服务器发送数据,直到超出处理能力进而无暇处理正常用户的合法请求,最终导致用户无法正常访问网站. 近年来,DDoS攻击手段已日趋多元化——攻击者通过各种奇技淫巧诱使不知情主机参加攻击.比如,[注1]历史上数据量最大(超过400Gbps)的DDoS攻击就是通过[注2]NTP反射完成的.时至今日,我们已经发现一个令人不安的趋势:攻击者通过恶意的JavaScri

界面操作劫持攻击原理与防御方法

1. 攻击原理 界面劫持,分为点击劫持.拖放劫持.触屏劫持.就是我们的点击,拖放,触屏操作被劫持了,而去操作了其它的透明隐藏的界面.其原理是利用透明层+iframe,使用了css中的opacity和z-index等属性,来到达透明和位于其它界面的上方,然后使用iframe来嵌入劫持页面.到达了用户操作的不是它看到的,不是他以为的那个界面,而是那个透明的位于上层的界面. 2. 防御方法 有重要会话的交互页面不允许使用iframe嵌入,或者值允许被同域的iframe嵌入. 2.1 X-Frame-O

CSRF攻击原理及防御

来源于https://www.cnblogs.com/shytong/p/5308667.html 一.CSRF攻击原理 CSRF是什么呢?CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具危险性.想要深入理解CSRF的攻击特性我们有必要了解一下网站session的工作原理. session我想大家都不陌生,无论你用.net或PHP开发过网站的都肯定用过session对象,然而session它是如何工作的呢?如果你不清楚请往下看. 先

XSS攻击-原理学习

本文优先发布于简书https://www.jianshu.com/p/04e0f8971890 1.百度百科XSS,跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆.因此,通常将跨站脚本攻击缩写为XSS.XSS攻击,通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序.这些恶意网页程序通常是JavaScript,但实际上也可以

CC攻击原理和防御方法

很多朋友都知道木桶理论,一桶水的最大容量不是由它最高的地方决定的,而是由它最低的地方决定,服务器也是一样,服务器的安全性也是由它最脆弱的地方决定的,最脆弱的地方有多危险服务器就有多危险.DDOS也是一样,只要你的服务器存在一个很耗资源的地方,限制又不够,就马上成为别人DDOS的对象.比如SYN-FLOOD,它就是利用服务器的半连接状态比完全连接状态更耗资源,而SYN发动方只需要不停的发包,根本不需要多少资源. 一个好的DDOS攻击必须是通过自己极少资源的消耗带来对方较大的资源消耗,否则比如ICM

不可不知 DDoS的攻击原理与防御方法

DoS攻击.DDoS攻击和DRDoS攻击相信大家已经早有耳闻了吧!DoS是Denial of Service的简写就是拒绝服务,而DDoS就是Distributed Denial of Service的简写就是分布式拒绝服务,而DRDoS就是Distributed Reflection Denial of Service的简写,这是分布反射式拒绝服务的意思. 不过这3中攻击方法最厉害的还是DDoS,那个DRDoS攻击虽然是新近出的一种攻击方法,但它只是DDoS攻击的变形,它的唯一不同就是不用占领