一、存储XSS(low)
1.1、代码分析,可以看到我们提交的内容会提交到数据库当中进行存储的
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = stripslashes( $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)) ? "" : ""));
// Sanitize name input
$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();
}
?>
1.2、输入,弹框成功,并且这是持久性的,当我们再次访问页面也会存在
二、存储XSS(medium)
2.1、代码分析,和反射型xss一样,过滤了script,并且在Message栏加入了htmlspecialchars进行实体转换
2.2、在Message栏不能绕过,可以在Name栏通过大小写绕过,但是Name栏输入有限制,可以通过审查元素修改
三、存储XSS(high)
3.1、代码分析,massage栏进行了实体转换,name栏通过正则过滤了script
3.2、和反射型XSS一样,可以通过<img src='1' onerror=alert(/xss/)/>
替换script
四、存储XSS(impossible)
4.1、代码分析,都使用了htmlspecialchars函数将字符转为实体
常见防范措施
1、过滤用户输入
2、使用htmlspecialchars()过滤
3、使用owasp等安全xss处理API