XSS存储型攻击攻击者事先将恶意代码上传或储存到漏洞服务器中只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这就意味着只要访问了这个页面的访客都有可能会执行这段恶意脚本因此储存型XSS的危害会更大。因为存储型XSS的代码存在于网页的代码中可以说是永久型的。存储型 XSS 一般出现在网站留言、评论、博客日志等交互处恶意脚本存储到客户端或者服务端的数据库中Low我们先试着添加留言正常弹框了这个级别应该是没有做任何过滤数据也正常被储存进了数据库源码分析?php if( isset( $_POST[ btnSign ] ) ) { // Get input // trim(string,charlist) 函数移除字符串两侧的空白字符或其他预定义字符预定义字符包括、\t、\n、\x0B、\r以及空格可选参数charlist支持添加额外需要删除的字符。 $message trim( $_POST[ mtxMessage ] ); $name trim( $_POST[ txtName ] ); // Sanitize message input // stripslashes(string) 函数删除字符串中的反斜杠。 $message stripslashes( $message ); // mysql_real_escape_string(string,connection) 函数会对字符串中的特殊符号\x00\n\r\‘“\x1a进行转义。 $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(); } ?源码中出现的函数1trim()函数语法trim(string,charlist)参数描述string必需。规定要检查的字符串。charlist可选。规定从字符串中删除哪些字符。如果被省略则移除以下所有字符\0 - NULL\t - 制表符\n - 换行\x0B - 垂直制表符\r - 回车 - 空格2stripslashes()函数语法stripslashes(string)参数描述string必需。规定要检查的字符串。用于删除反斜杠可用于清理从数据库中或者从 HTML 表单中取回的数据。这里对XSS方面没有做过滤与检查而且数据将被存储到数据库中因此存在存储型XSS大家做下一题记得清理下数据库Medium按照之前的思路先用双写绕过试试被正常放进了数据库但没有触发弹框观察储存的数据应该是过滤了script标签不妨试试在用户名框中试试注入似乎做了长度限制打开F12开发者工具找到限制长度的元素改变它的参数也可以使用BP抓包修改因为它的检验在前端在用户名框中输入scscriptriptalert(/xss/)/script弹框出现了源码分析?php if( isset( $_POST[ btnSign ] ) ) { // Get input $message trim( $_POST[ mtxMessage ] ); $name trim( $_POST[ txtName ] ); // Sanitize message input // strip_tags() 函数剥去字符串中的HTML、XML以及PHP的标签但允许使用b标签 // addslashes() 函数返回在预定义字符单引号、双引号、反斜杠、NULL之前添加反斜杠的字符串 $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 $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(); } ?1Message处使用了htmlspecialchars()函数将字符全部转为了HTML实体因此Message处无法使用XSS形成攻击。2name处做了长度限制因此考虑使用抓包在BP中修改name的值还有就是他会将 script 转化为空因此使用双写或者大小写去绕过。High有了前两个xss漏洞的经验估计这一关的high级别也过滤了script标签所以我们换一个使用img标签注入跟刚刚一样先F12改变长度限制用户名处输入img src1 οnerrοralert(1)正常弹窗源码分析?php if( isset( $_POST[ btnSign ] ) ) { // Get input $message trim( $_POST[ mtxMessage ] ); $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 $name preg_replace( /(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i, , $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(); } ?1Message处相比Medium难度没有做太多的变化因此不在考虑这里2Nmae处对 script 做了限制各种形式的 script 都不行了Impossible源码分析?php if( isset( $_POST[ btnSign ] ) ) { // Check Anti-CSRF token checkToken( $_REQUEST[ user_token ], $_SESSION[ session_token ], index.php ); // 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)) ? : )); $message htmlspecialchars( $message ); // Sanitize name input $name stripslashes( $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)) ? : )); $name htmlspecialchars( $name ); // Update database $data $db-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(); ?使用 Anti-CSRF Token 防御跨站请求伪造 htmlspecialchars()对 进行 HTML 实体编码从而彻底防御 XSS 使用 PDO 预编译语句带参数绑定彻底防御 SQL 注入。
DVWA靶场——XSS(Stored) 存储型XSS
XSS存储型攻击攻击者事先将恶意代码上传或储存到漏洞服务器中只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这就意味着只要访问了这个页面的访客都有可能会执行这段恶意脚本因此储存型XSS的危害会更大。因为存储型XSS的代码存在于网页的代码中可以说是永久型的。存储型 XSS 一般出现在网站留言、评论、博客日志等交互处恶意脚本存储到客户端或者服务端的数据库中Low我们先试着添加留言正常弹框了这个级别应该是没有做任何过滤数据也正常被储存进了数据库源码分析?php if( isset( $_POST[ btnSign ] ) ) { // Get input // trim(string,charlist) 函数移除字符串两侧的空白字符或其他预定义字符预定义字符包括、\t、\n、\x0B、\r以及空格可选参数charlist支持添加额外需要删除的字符。 $message trim( $_POST[ mtxMessage ] ); $name trim( $_POST[ txtName ] ); // Sanitize message input // stripslashes(string) 函数删除字符串中的反斜杠。 $message stripslashes( $message ); // mysql_real_escape_string(string,connection) 函数会对字符串中的特殊符号\x00\n\r\‘“\x1a进行转义。 $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(); } ?源码中出现的函数1trim()函数语法trim(string,charlist)参数描述string必需。规定要检查的字符串。charlist可选。规定从字符串中删除哪些字符。如果被省略则移除以下所有字符\0 - NULL\t - 制表符\n - 换行\x0B - 垂直制表符\r - 回车 - 空格2stripslashes()函数语法stripslashes(string)参数描述string必需。规定要检查的字符串。用于删除反斜杠可用于清理从数据库中或者从 HTML 表单中取回的数据。这里对XSS方面没有做过滤与检查而且数据将被存储到数据库中因此存在存储型XSS大家做下一题记得清理下数据库Medium按照之前的思路先用双写绕过试试被正常放进了数据库但没有触发弹框观察储存的数据应该是过滤了script标签不妨试试在用户名框中试试注入似乎做了长度限制打开F12开发者工具找到限制长度的元素改变它的参数也可以使用BP抓包修改因为它的检验在前端在用户名框中输入scscriptriptalert(/xss/)/script弹框出现了源码分析?php if( isset( $_POST[ btnSign ] ) ) { // Get input $message trim( $_POST[ mtxMessage ] ); $name trim( $_POST[ txtName ] ); // Sanitize message input // strip_tags() 函数剥去字符串中的HTML、XML以及PHP的标签但允许使用b标签 // addslashes() 函数返回在预定义字符单引号、双引号、反斜杠、NULL之前添加反斜杠的字符串 $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 $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(); } ?1Message处使用了htmlspecialchars()函数将字符全部转为了HTML实体因此Message处无法使用XSS形成攻击。2name处做了长度限制因此考虑使用抓包在BP中修改name的值还有就是他会将 script 转化为空因此使用双写或者大小写去绕过。High有了前两个xss漏洞的经验估计这一关的high级别也过滤了script标签所以我们换一个使用img标签注入跟刚刚一样先F12改变长度限制用户名处输入img src1 οnerrοralert(1)正常弹窗源码分析?php if( isset( $_POST[ btnSign ] ) ) { // Get input $message trim( $_POST[ mtxMessage ] ); $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 $name preg_replace( /(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i, , $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(); } ?1Message处相比Medium难度没有做太多的变化因此不在考虑这里2Nmae处对 script 做了限制各种形式的 script 都不行了Impossible源码分析?php if( isset( $_POST[ btnSign ] ) ) { // Check Anti-CSRF token checkToken( $_REQUEST[ user_token ], $_SESSION[ session_token ], index.php ); // 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)) ? : )); $message htmlspecialchars( $message ); // Sanitize name input $name stripslashes( $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)) ? : )); $name htmlspecialchars( $name ); // Update database $data $db-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(); ?使用 Anti-CSRF Token 防御跨站请求伪造 htmlspecialchars()对 进行 HTML 实体编码从而彻底防御 XSS 使用 PDO 预编译语句带参数绑定彻底防御 SQL 注入。