DVWA-DOM Based Cross Site Scripting (XSS)

实验环境

DVWA靶机:172.16.12.10 靶场用户名:admin 密码:123

windos攻击机:172.16.12.7

kali攻击机:172.16.12.30

实验步骤

DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。

可能触发DOM型XSS的属性:

document.referer属性

window.name属性

location属性

innerHTML属性

documen.write属性

一、Low级

1、源码分析

<?php
//没有保护,什么都没有
# No protections, anything goes

?>

2、漏洞利用

在XSS-DOM型页面选English,点提交,然后点左上角load URL


然后在加载的url中把 English 换成 <script>alert('xss')</script> 点EXecute ,成功弹窗

二、Medium级

1、源码分析

<?php

// Is there any input?
// array_key_exists()检查键是否存在
array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。
提示:如果指定数组的时候省略了键名,将会生成从 0 开始并以 1 递增的整数键名
array_key_exists(key,array)
key 必需	规定键名。
array	必需。规定数组
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
    $default = $_GET['default'];
    
    # Do not alLow script tags
//过滤<script,含scriipt的就不可以
stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
stripos(string,find,start)
string 必需	规定被搜索的字符串。
find 必需	规定要查找的字符。
start 可选	规定开始搜索的位置。
返回值:	返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。注释:字符串位置从 0 开始,不是从 1 开始。
    if (stripos ($default, "<script") !== false) {
//如果参数不含<script
header() 函数向客户端发送原始的 HTTP 报头
header(string,replace,http_response_code)
string 必需	规定要发送的报头字符串。
replace 可选	指示该报头是否替换之前的报头,或添加第二个报头。
默认是 true(替换)。false(允许相同类型的多个报头)。
http_response_code可选	把 HTTP 响应代码强制为指定的值。(PHP 4 以及更高版本可用)

        header ("location: ?default=English");
        exit;
    }
}

?>

这次后端做了限制,前端无变化。
不允许出现script标签,否则就将default的值设为默认的English,stripos
还防止了大小写绕过。

2、漏洞利用

1)利用Url截断机制加#号
url中有一个字符为#,该字符后的数据不会发送到服务器端,从而绕过服务端过滤,构造连接

http://172.16.12.10:81/vulnerabilities/xss_d/?#default=<script>alert('xss')</script> 点Execute,成功弹窗

2)用img标签或其他标签的特性去执行js代码,比如img标签的onerror事
件,构造连接
之前用过img的方法,这次使用svg的方法来完成。
构造链接 http://172.16.12.10:81/vulnerabilities/xss_d/?default=</option></select><svg οnlοad=alert("xss")> ,成功弹窗

三、High级

1、源码分析

<
<?php

// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {

    # White list the alLowable languages
//白名单,只允许French、English、German、Spanish
    switch ($_GET['default']) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # ok
            break;
        default:
            header ("location: ?default=English");
            exit;
    }
}

?>

这次后端做了限制,前端无变化。
在服务器后端判断,要求default的值必须为select选择菜单中的值,这里继
续用上面的#符号绕过即可,构造payload

2、漏洞复现

构造链接

http://172.16.12.10:81/vulnerabilities/xss_d/?default=English #</option></select><img src=xss οnerrοr=alert(/xss/)> ,点Execute,成功弹窗

四、Impossible级

1、源码分析

<?php

# Don't need to do anything, protction handled on the client side

?>

可以发现这里对我们输入的参数(lang)并没有进行URL解码,而在其他级别中是有解码过程的decodeURI(lang)。所以我们输入的任何参数都是经过URL编码,然后直接赋值给option标签。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cwillchris

你的鼓励将让我产出更多优质干货

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值