news 2026/7/22 5:30:56

DVWA靶场——XSS(Stored) 存储型XSS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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(); } ?>

源码中出现的函数:

(1)trim()函数

语法:

trim(string,charlist)

参数

描述

string

必需。规定要检查的字符串。

charlist

可选。规定从字符串中删除哪些字符。如果被省略,则移除以下所有字符:

  • "\0" - NULL
  • "\t" - 制表符
  • "\n" - 换行
  • "\x0B" - 垂直制表符
  • "\r" - 回车
  • " " - 空格
(2)stripslashes()函数

语法:

stripslashes(string)

参数

描述

string

必需。规定要检查的字符串。

用于删除反斜杠,可用于清理从数据库中或者从 HTML 表单中取回的数据。

这里对XSS方面没有做过滤与检查,而且数据将被存储到数据库中,因此存在存储型XSS

大家做下一题记得清理下数据库

Medium

按照之前的思路,先用双写绕过试试

被正常放进了数据库,但没有触发弹框,观察储存的数据,应该是过滤了<script>标签

不妨试试在用户名框中试试注入

似乎做了长度限制

打开F12开发者工具,找到限制长度的元素,改变它的参数(也可以使用BP抓包修改,因为它的检验在前端)

在用户名框中输入<sc<script>ript>alert(/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(); } ?>

(1)Message处使用了htmlspecialchars()函数,将字符全部转为了HTML实体,因此Message处无法使用XSS形成攻击。

(2)name处做了长度限制,因此考虑使用抓包在BP中修改name的值,还有就是他会将 <script> 转化为空,因此使用双写或者大小写去绕过。

High

有了前两个xss漏洞的经验,估计这一关的high级别也过滤了<script>标签,所以我们换一个,使用<img>标签注入

跟刚刚一样,先F12改变长度限制,用户名处输入<img src=1 οnerrοr=alert(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(); } ?>

(1)Message处相比Medium难度没有做太多的变化,因此不在考虑这里

(2)Nmae处对 <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 注入。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 5:30:07

Bun vs Node.js:新一代JavaScript运行时性能对比

1. Bun与Node.js的性能之争&#xff1a;新一代JavaScript运行时的崛起最近在开发者社区里&#xff0c;Bun这个名词出现的频率越来越高。作为一个长期使用Node.js的后端开发者&#xff0c;我第一次听说Bun能"碾压"Node.js时也是持怀疑态度的。但经过实际测试和源码分析…

作者头像 李华
网站建设 2026/7/22 5:28:54

AI算力紧缺下Kimi Coding Plan价值解析与开发实战指南

最近不少开发者发现&#xff0c;Kimi 的免费服务开始频繁出现"算力不足"的提示&#xff0c;而付费的 Coding Plan 用户却依然能稳定使用。这背后反映的正是当前 AI 大模型行业面临的普遍问题&#xff1a;算力紧缺正在重塑用户的使用体验和付费策略。对于日常需要借助…

作者头像 李华
网站建设 2026/7/22 5:27:31

智能仓储与物流——制造业供应链效率的倍增器

仓储与物流是制造业供应链的“毛细血管”&#xff0c;其效率直接决定了整个生产系统的响应速度和成本水平。在智能制造时代&#xff0c;传统“人找货”的仓储模式正在被“货到人”的智能模式所颠覆。一、传统仓储的三大痛点 空间利用率低&#xff1a;传统仓库依赖人工叉车和货架…

作者头像 李华
网站建设 2026/7/22 5:27:13

程序员如何快速掌握大模型开发技能

1. 为什么程序员需要关注大模型技术&#xff1f;三年前我还在写传统的CRUD业务代码&#xff0c;直到第一次用GPT-3完成了一个本需要3天开发的报表生成模块——整个过程只花了20分钟修改prompt。这个震撼体验让我意识到&#xff1a;大模型正在重构软件开发的工作方式。作为经历过…

作者头像 李华
网站建设 2026/7/22 5:26:53

C++ vector内存模型与性能优化:从原理到实战

1. 项目概述&#xff1a;从“会用”到“精通”的跨越如果你已经写过一些C代码&#xff0c;用过std::vector来存点整数、字符串&#xff0c;知道怎么push_back、怎么用下标访问&#xff0c;那恭喜你&#xff0c;你已经迈出了第一步。但如果你觉得vector就是个“会自己变长的数组…

作者头像 李华