存储型xss与反射型xss的区别在于存储型会将用户输入的数据存入服务器,在用户下一次点击时便会触发,由于其隐蔽性较高,所以危害也普遍大于反射型xss。
首先来看low级别的源代码
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '' ); //mysql_close(); } ?>
代码中用到的几个函数
trim函数,语法如下:trim(string,charlist),其用于移除字符串两侧的空白字符或其他预定义字符,
mysqli_real_escape_string函数,语法如下:mysql_real_escape_string(string,connection)用于转义 SQL 语句中使用的字符串中的特殊字符,一般用于防止数据库撞库,这个例子将展示不使用mysql_real_escape_string(string,connection)所带来的后果
结果如下
SELECt * FROM users WHERe user='john' AND password='' OR ''=''
意味着攻击者无需输入合理的密码便可以进行登录
注:本实例来自w3school
stripslashes(string)函数用于删除反斜杠,可以看到此段代码并未对xss语句进行过滤,并且是存放在数据库中的,因此可以产生存储型XSS,如下图所示,首先我们在message框中插入恶意代码,执行效果如下接下来我们在name框中插入恶意代码,可以发现输入框对长度有所限制,一种方法我们通过bp抓包修改长度,另一种方法我们直接在控制台中修改maxlength来触发xss,如下图所示在长度限制这里,国内有位白帽子曾提出过分割拼接语句来触发xss这一方法,即由于长度限制,将语句分割成几部分分别输入,由于存在数据库中,当其成为一个完整的语句时便会被触发。
接下来来看middle级别的源代码
', '', $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();
}
?>
首先来看关键函数strip_tags其用于剥去字符串中的 HTML、XML 以及 PHP 的标签,但允许使用标签。addslashes(string)函数返回在预定义字符之前添加反斜杠的字符串。预定义字符是:单引号(’)双引号(")反斜杠()以及NULL,通过这段代码可以看到,message由于对输入的内容进行了实体化编码,所以无法触发xss,而name仅对


