热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

34Dom形XSS详解以及演示

学习DOM型XSS前,先搞清楚什么是DOM通过JavaScript,可以重构整个HTML文档。您可以添加、移除、改变或重排页面上的项目。要改变页面的某
学习DOM型XSS前,先搞清楚什么是DOM

在这里插入图片描述

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

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

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

举个栗子来理解一下DOM

这是标题

点击标题,会提示出它的值。

#From w3school#

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

我们再把js代码给添进去


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

这是标题


点击标题,会提示出它的值。


在这个标题里面,有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 = "what do you see?";}

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

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

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

what do you see?

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


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

'>what do you see?

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

#' 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 = "就让往事都随风,都随风吧";}

他在这个地方,定义了一个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标签,就会去执行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来注入恶意的代码


推荐阅读
author-avatar
Benson
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有