3-4Dom形XSS详解以及演示

学习DOM型XSS前,先搞清楚什么是DOM

在这里插入图片描述

通过 JavaScript,可以重构整个 HTML 文档。您可以添加、移除、改变或重排页面上的项目。

要改变页面的某个东西,JavaScript 就需要获得对HTML 文档中所有元素进行访问的入口。这个入口,连同对 HTML 元素进行添加、移动、改变或移除的方法和属性,都是通过文档对象模型来获得的(DOM)。

所以,你可以把DOM理解为一个可以访问HTML的标准编程接口。

举个栗子来理解一下DOM
<html><head>

<script type="text/javascript">

function getValue(){var  
x=document.getElementById("myHeader")alert(x.innerHTML)}</script>

</head><body>

<h1 id="myHeader" onclick="getValue()">这是标题</h1>

<p>点击标题,会提示出它的值。</p>

</body></html>

#From w3school#

这个例子是从w3school拖下来的,我们直接去w3school看一下,因为上面有具体演示的页面,http://caibaojian.com/w3c/example/hdom_examples.html

在这里插入图片描述

这里有一个document对象,点击getelementbyid()

在这里插入图片描述

首先我们先把js代码给删掉

在这里插入图片描述

那这段就是纯HTML代码,显示出来就是上边这样子

我们再把js代码给添进去

<script type="text/javascript">
function getValue()
{
var x=document.getElementById("myHeader")
alert(x.innerHTML)
}
</script>

function这个地方其实是js的函数,它定义了一个变量x,通过document.getElementById去获取HTML里面,id等于myHeader标签的这个值,那实际上x的值就是这是标题,这是个字符,document.getElementById这个方法,其实就是document提供的方法,当它获取到值后,把这个值给alert出来

<body>

<h1 id="myHeader" onclick="getValue()">这是标题</h1>
<p>点击标题,会提示出它的值。</p>

</body>

在这个标题里面,有onclik,当我们点击这个标题的时候,会去调用getValue()这个方式,然后把这个值复制给x,弹出来

在这里插入图片描述

看到了吧,弹出来了,DOM有一个比较大的特征,这一整个弹窗的过程,其实都是在前端完成的,这一整个过程是没有跟我们的后台交互的,数据并没有通过get、post的方式提交到后台,所以说,DOM是一个前端的操作接口

我们打开pikachu,也就是我们今天要演示的靶场

在这里插入图片描述

输入框那边,我们可以输入一个字符,来看一下,我们点提交

在这里插入图片描述

点提交之后,弹出来一个what do you see?,看起来好像是一个A标签,我们看一下源码,它到底是做了什么操作,搜索一下what

在这里插入图片描述

我们看到这个地方有一段js的代码,我们来读一下它是什么意思

首先,它用document.getElementById的一个方法,来获取id等于text这个标签的值

 function domxss(){
                        var str = document.getElementById("text").value;
                        document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
                    }

实际上这个text就是input,也就是我们输入的内容,它把我们输入的内容赋值给了str,通过字符串拼接的方式,写到了A标签的href属性里面,整个的意思是说,当我们在text标签里面输入字符串之后,它就会把字符串,通过dom方法,把它拼接到a标签里面,这个a标签会被写到id等于dom。这么一个div标签里面来

我们首先确认它的输入点,输入点就是在input里面,通过document.getElementById把数据给获取到了之后,在div里面,把它输出了,直接通过innerHTML把它写到了div里面

我们可以看到,它的输入和输出是没有做任何转义的操作的,我们把这段给复制出来,构造一个闭合,来看一下

<a href='"+str+"'>what do you see?</a>

中间这个str其实就是我们输入的内容,就是一个变量,我们要做的其实就是通过构造一个闭合,来执行我们预期的代码,我们把中间这部分变量,我们可以控制的这部分给删掉,我们首先在这个地方,去把前面的a标签给闭合掉,我们在这里随便输个字符串,或者一个#号,单引号,把前面的href给闭合掉,然后我们在这里用onclick,弹一个窗,然后我们alert,111,然后我们要把前面的a标签给闭合掉,在这里输一个右尖括号,然后

<a href='#' onclick="alert(111)">

这一整段就是我们前面的a标签,因为它后面本身自带了一个a标签,所以这a标签就是一个正确的a标签

<a href='#' onclick="alert(111)">'>what do you see?</a>

后面这一段,我们不用管他,我们把我们刚刚输入的那个部分,把它复制出来

#' onclick="alert(111)">

这其实就是我们构造的payload,就是一旦我们输入这个内容,按照我们的预期,它应该会在我们的div标签里面,通过我们的dom方法,来获取到这个输入,然后把它输出到div里面,我们来试一下

在这里插入图片描述

理论上,这个a标签点一下,就会弹出111

在这里插入图片描述

这就说明,这个地方是存在dom型xss漏洞的

我们接下来讲一下don型漏洞的利用,这一串输入既不会在url里面,也不会在后台存储下来,刷新一下,这个东西就没了,其实在我们场景下,这个例子确实是比较鸡肋的,但是不能不说,它是个问题,只能说这个地方是出现了比较低危的dom型xss

它的原因,其实是前端的输入被dom给获取到了,也就是对dom进行了操作,然后通过dom又在前端输出了,它是不经过后台输出的

因为前端的写法千奇百怪,层级也非常复杂,谁都不知道程序员会怎么去写前端的dom操作,我们来看一下,下一个dom型xss的案例

在这里插入图片描述

我们看到这个地方,有输入框,我们随便输入一串字符串,点一个提交,他弹了一句话,我们看一下后端的源码,看一下,他的逻辑是怎么样的,我们搜一下,定位一下

在这里插入图片描述

我们看到这个地方,也有一段js代码

function domxss(){
                        var str = window.location.search;
                        var txss = decodeURIComponent(str.split("text=")[1]);
                        var xss = txss.replace(/\+/g,' ');
//                        alert(xss);

                        document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
                    }

他在这个地方,定义了一个function,用window.location.search这个dom方法,来获取浏览器的参数,他会把url传参的参数,给获取下来,然后对他进行一个url的解码,用一个字符串进行分割,来获取到对应的内容

var str = window.location.search;
                        var txss = decodeURIComponent(str.split("text=")[1]);
                        var xss = txss.replace(/\+/g,' ');

这一段其实就是从框里面,获取到完整的内容,然后把这个赋值的内容,赋值给xss这么一个变量,然后,他就把xss跟我们刚看到的dom型xss一样,他把他写到了a标签里面,他的输入其实是从浏览器的url里面去获取的,跟我们上面一关不一样的地方,这个场景跟我们反射性的xss,就很像了

我们来构造一下闭合,跟刚刚一样,我们复制一下,然后我们点提交

 <a href='#' onclick='domxss()'>有些费尽心机想要忘记的事情,后来真的就忘掉了</a>

我们点一下a标签,就会去执行function,function会把a标签的内容,写到div里面

在这里插入图片描述

这种情况也是dom型的xss,他只需要把这一段url发送给需要攻击的用户

http://192.168.42.236/pikachu/vul/xss/xss_dom_x.php?text=#'+onclick="alert(111)">#

他只需要打开这个链接,这段恶义的代码,就会被插入到xss里面去,那这个就跟反射型的xss一样了,这个就比我们刚刚讲的dom型xss危害高很多

如果是从url里面获取的参数,那就意味着,我们可以通过js来注入恶意的代码

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值