Hello ' . $_GET[ 'name' ] . '
';
}
?>
代码只是判断了name值是否为空,然后再将name打印出来,参数没有做任何的过滤,存在明显的XSS漏洞。
输入成功弹框!
可以弹窗的函数:alert()、confirm()、prompt()
', '', $_GET[ 'name' ] );
// Feedback for end user
echo "Hello ${name}
";
}
?>
$name = str_replace( '
Hello ${name}
";
}
?>
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
//这段正则表达式直接将*s*c*r*i*p*t给过滤了,并且不区分大小写,使得双写绕过和大小写混淆绕过不可行,但同样是使用黑名单策略,仍存在安全隐患。
尝试其他标签:
当图片显示错误时,执行alert(‘0xdawn’)0xdawn
Hello ${name}
";
}
// Generate Anti-CSRF token
generateSessionToken();
?>
Impossible级别的代码使用htmlspecialchars函数把预定义的字符&、"、’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。 当输入时,因为 htmlspecialchars 函数会将 < 和 > 转换成html实体,并且
${name}
取的是$name
的值,然后包围在标签中被打印出来,所以我们插入的语句并不会被执行。
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' );
//mysql_close();
}
?>
low级别的代码对我们输入的message和name并没有进行XSS过滤,而且数据存储在数据库中,存在比较明显的存储型XSS漏洞。
name中填入0xdawn,message中填入代码立即执行
', '', $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( '' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' );
//mysql_close();
}
?>
代码中name值的处理增加了一个str_replace() 函数,用来将字符串中含有的字符串替换为空字符,从而有过滤作用;message值的处理中,在其第二次调用trim()函数时还内嵌了两个函数,先是使用addslashes() 函数、返回在预定义字符之前添加反斜杠的字符串,然后调用strip_tags()函数来剥去字符串中的HTML、XML 以及 PHP 的标签,在最后再调用htmlspecialchars() 函数、把预定义的字符转换为 HTML 实体,对输入的内容先进行HTML的编码然后再存储进服务器中,从而使message的SQL和XSS漏洞几乎不存在。
从name入手,查看元素,修改name值的最大长度为100。
大小写混淆绕过,在name中填入,成功写入。
ipt>alert('0xdawn')
,成功写入。 ' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' );
//mysql_close();
}
?>
在medium级别上,name参数使用了正则表达式进行过滤,仍然可以突破。
查看元素,修改name值最大限制为100.
超链接:name中填入0xdawn
,成功写入
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();
?>
Impossible在high级别的基础上对name参数也进行了更严格的过滤,导致name参数也无法进行XSS攻击。而且使用了Anti-CSRF token防止CSRF攻击,彻底防御XSS漏洞和CSRF漏洞。
代码没有任何的保护措施,对default参数没有任何过滤。
直接构造xss代码,访问连接:
192.168.8.151/dvwa/vulnerabilities/xss_d/?default=English //脚本成功执行
代码先检查default参数是否为空,如果不为空则接受参数的值,同时使用了stripos将进行过滤,并且不区分大小写。
尝试用img标签进行写入:
http://192.168.8.151/dvwa/vulnerabilities/xss_d/?default=English
尝试闭合option标签注入:
http://192.168.8.151/dvwa/vulnerabilities/xss_d/?default=English
继续闭合select标签,使img成为独立标签:
192.168.8.151/dvwa/vulnerabilities/xss_d/?default=English
high级别的代码先判断defalut值是否为空,如果不为空的话,再用switch语句进行匹配,如果匹配成功,则插入case字段的相应值,如果不匹配,则插入的是默认的值。
’#‘字符之后的数据不会发送的服务器端,从而绕过服务器端过滤。
构造http://192.168.8.151/dvwa/vulnerabilities/xss_d/?default=English#
即可成功弹窗。
防御机制写在了客户端里,无XSS漏洞。