DVWA之Stored XSS(存储型XSS)

目录

Low

Medium

High

Impossible


Low

源代码:

' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); //mysql_close(); } ?>

trim(string,charlist) : 移除string字符两侧的预定义字符,预定义字符包括\t 、 \n 、\x0B 、\r以及空格,可选参数charlist支持添加额外需要删除的字符

stripslashes(string): 去除掉string字符的反斜杠\

mysqli_real_escape_string(string,connection) :函数会对字符串string中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义。

$GLOBALS :引用全局作用域中可用的全部变量。$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。

可以看出,low级别的代码对我们输入的message和name并没有进行XSS过滤,而且数据存储在数据库中,存在比较明显的存储型XSS漏洞

我们输入 1 和 ,可以看到,我们的js代码立即就执行了

DVWA之Stored XSS(存储型XSS)_第1张图片

DVWA之Stored XSS(存储型XSS)_第2张图片

查看数据库,可以看到我们的js代表插入进去了

DVWA之Stored XSS(存储型XSS)_第3张图片

查看源代码,可以看到,Message位置显示的是我们的js代码,因为这里显示的数据是调用数据库里的数据

DVWA之Stored XSS(存储型XSS)_第4张图片

Medium

源代码:

', '', $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(); } ?>

addslashes(string) :函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ' 、" 、\ 、NULL

strip_tags(string) :函数剥去string字符串中的 HTML、XML 以及 PHP 的标签

htmlspecialchars(string): 把预定义的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 转换为 HTML 实体,防止浏览器将其作为HTML元素

当我们再次输入1 ,strip_tags函数把 经过URL编码后的数据

DVWA之Stored XSS(存储型XSS)_第9张图片

提交后,就可以看到弹出此框了,说明我们的js代码执行了

DVWA之Stored XSS(存储型XSS)_第10张图片

查看数据库,可以看到我们的代码插入进数据库了。

DVWA之Stored XSS(存储型XSS)_第11张图片

查看页面源代码,可以看到name位置插入了我们的js代码

DVWA之Stored XSS(存储型XSS)_第12张图片

High

源代码:

' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); //mysql_close(); } ?>

可以看到,high级别只是在medium级别上,name参数用了正则表达式进行过滤而已,我们仍然可以在name参数做手脚,抓包,然后改包,只不过这次改成

我们输入如下的

DVWA之Stored XSS(存储型XSS)_第13张图片

然后将   进行URL编码

DVWA之Stored XSS(存储型XSS)_第14张图片

可以看到,我们的js代码执行了

DVWA之Stored XSS(存储型XSS)_第15张图片

查看数据库,我们的代码被插入进数据库了

DVWA之Stored XSS(存储型XSS)_第16张图片

查看源代码,可以看到name位置插入了我们的img标签

DVWA之Stored XSS(存储型XSS)_第17张图片

Impossible

源代码:

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漏洞。

相关文章: XSS(跨站脚本攻击)漏洞详解

                   DVWA之DOM XSS(DOM型跨站脚本攻击)

                   DVWA之Reflected XSS(反射型XSS)

你可能感兴趣的:(DVWA)