往期博文:
DVWA靶场-Brute Force Source 暴力破解
DVWA靶场-Command Injection 命令注入
DVWA靶场-CSRF 跨站请求伪造
DVWA靶场-File Inclusion 文件包含
DVWA靶场-File Upload 文件上传
DVWA靶场-SQL Injection SQL注入
DVWA靶场-Weak Session IDs 脆弱的Session
靶场环境搭建
https://github.com/ethicalhack3r/DVWA
[网络安全学习篇附]:DVWA 靶场搭建
目录
DOM XSS DOM型XSS
LOW DOM XSS
核心代码:
Medium DOM XSS
核心代码:
绕过方法:
High DOM XSS
核心代码:
绕过方式
Impossible DOM XSS
核心代码:
Reflected XSS 反射型XSS
Low Reflected XSS
核心代码
Medium Reflected XSS
核心代码
绕过方法
High Reflected XSS
核心代码
Impossible Reflected XSS
核心代码
Stored XSS 存储型XSS
Low Stored XSS
核心代码
trim
stripslashes
mysql_real_escape_string
Medium Stored XSS
核心代码
addslashes
htmlspecialchars
绕过方法
High Stored XSS
核心代码
Impossible Stored XSS
核心代码
Please choose a language:
DOM XSS 是通过修改页面的DOM 节点,会通过select 按钮创建新的DOM节点
document.write("");
document.write("");
这里的lang 变量没有进行任何过滤,就解码输出在option 标签中,直接攻击
?default=
这段代码会过滤default 提交参数中的”
1、img标签
首先将option标签和select 标签闭合,
?default=English
2、利用input 标签
?default=English
这里使用白名单过滤规则,凡是不在白名单中的,强制修改其为English
1、&
?default=English&
?default=English&
2、#
?default=English#
?default=English#
Please choose a language:
分析代码可知,impossible 没有对输入的参数进行URL解码,这样自然就导致无法XSS
document.write("");
document.write("");
Hello ' . $_GET[ 'name' ] . '
';
}
?>
可以看出没有对变量name 的输入做任何的过滤,直接攻击
', '', $_GET[ 'name' ] );
// Feedback for end user
echo "Hello ${name}
";
}
?>
这里使用str_replace() 函数对name 变量中的敏感字符
2、大小写
3、尝试使用其他标签
Hello ${name}
";
}
?>
这里对
', '', $name );
$name = mysqli_real_escape_string($name );
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
}
?>
addslashes(string)
在预定义字符前添加反斜杠
预定义字符 ' " \ NULL
strip_tags(string,allow)
去除字符串中的HTML、XML、PHP 的标签
allow 参数可选,规定允许这些标签
htmlspecialchars(string,flags,character-set,double_encode)
把预定义的字符转换为HTML实体
预定义字符 & " ' < >
可以看到对message 变量过滤的很彻底,但是对name变量,只对其进行简单的过滤
但是我们的浏览器本地对name参数的输入的字符长度做了限制,这个简单,本地浏览器手动修改
也可以使用BP抓包,修改name参数值之后提交
别忘了!!!
1、嵌套
name
ript>alert(/XSSMED1/) message XXX
2、大小写
name
message XXX
3、其他标签
name
message XXX
分析代码,发现这里message 是没有希望了,继续看一下name,发现还有绕过的希望
name
message xxx
prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );
$data->bindParam( ':message', $message, PDO::PARAM_STR );
$data->bindParam( ':name', $name, PDO::PARAM_STR );
$data->execute();
}
// Generate Anti-CSRF token
generateSessionToken();
?>
message和name变量都进行了严格的过滤,而且还检测了用户的token,没得办法!
https://www.sqlsec.com/2020/05/dvwa.html#toc-heading-31
https://www.freebuf.com/articles/web/119467.html