创建时间:2022年5月16日21:56:10
作者:在下小黄


存储区:后端数据库
插入点:HTML

  • 定义:

攻击者直接将恶意JS代码上传或者存储到漏洞服务器中,当其他用户浏览该页面时,站点即从数据库中读取恶意用户存入的非法数据,即可在受害者浏览器上来执行恶意代码;持久型XSS常出现在网站的留言板、评论、博客日志等交互处

  • 特点:

不需要用户单击特定URL便可执行跨站脚本

  • 利用方式:

直接向服务器中存储恶意代码,用户访问此页面即中招
XSS蠕虫

  • 总结:

存在用户交互的地方,带有用户保存数据功能的地方,就容易出现存储型XSS(留言板、论坛发帖、商品评论、用户私信、博客日志等)


一、Stored Low 级别:

  1. 我们拿到这个题目的时候,首先对代码进行审计:
<?phpif( isset( $_POST[ 'btnSign' ] ) ) {// Get input$message = trim( $_POST[ 'mtxMessage' ] );$name    = trim( $_POST[ 'txtName' ] );// Sanitize message input 对 message 输入进行过滤$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)) ? "" : ""));// Sanitize name input 对 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();
}?>
---------------------------------------------------------------------------------------
PHP $_POST 变量:在 PHP 中,预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值。isset()函数在php中用来检测变量是否设置,该函数返回的是布尔类型的值,即true/false
trim()函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括\0、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符。
stripslashes()函数用于删除字符串中的反斜杠
is_object() 函数用于检测变量是否是一个对象。
$GLOBALS :引用全局作用域中可用的全部变量。$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。
trigger_error() 函数创建用户自定义的错误消息。函数用于在用户指定的条件下触发一个错误消息。它可以与内建的错误处理程序一起使用,或者与由 set_error_handler() 函数设置的用户自定义函数一起使用。
SQL INSERT INTO 语句用于向表中插入新记录。此代码中涉及到的是第二种用法,需要指定列名和被插入的值
mysqli_query() 函数执行某个针对数据库的查询。
mysqli_real_escape_string()函数会对字符串中的特殊符号(\x00,\n,\r,\,',",\x1a)进行转义在代码中对message,name输入框内容没有进行XSS方面的过滤和检查。且通过query语句插入到数据库中。所以存在存储型XSS漏洞
  1. 代码含义:
  • 首先判断输入,接收前台传递的method="post"表单数据
  • 对接收到的数据进行预处理一次,清除传递表单数据以外的东西
  • stripslashes(string)函数对'txtName',无处理
  • stripslashes(string)函数对'mtxMessage'清除传递数据中的反斜杠/ , 利用mysqli_real_escape_string()函数对namemessage 进行转义,一般用于防止数据库撞库。
  • 下面就是对数据进行处理,更新写入数据库
  • 接下来我们在name框中插入恶意代码,可以发现输入框对长度有所限制,一种方法我们通过bp抓包修改长度,另一种方法我们直接在控制台中修改maxlength来触发xss,如下图所示
  • <script>alert(document.cookie)</script>


二、Stored Medium 级别:

  1. 还是老套路,我们拿到一个题的时候,先去审一下代码:
<?phpif( 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 = 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();
}?>
---------------------------------------------------------------------------------------
strip_tags() 函数剥去字符串中的 HTMLXML 以及 PHP 的标签。该函数始终会剥离 HTML 注释。这点无法通过 allow 参数改变。
addslashes()函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。
可以看到,由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码,但是对于name参数,只是简单过滤了<script>字符串,仍然存在存储型的XSShtmlspecialchars(string): 把预定义的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 转换为 HTML 实体,防止浏览器将其作为HTML元素
  1. 双写绕过
  • Burpsuite抓包改name参数为:
  • <sc<script>ript>alert(/xss/)</script>

  1. 大小写混淆绕过
  • Burpsuite抓包改name参数为<ScRipt>alert(/xss/);</ScRipt>:

  1. 使用非** script **标签的** xss payload**
  2. 例如:img标签:
  • Burpsuite抓包改name参数为<img src=1 onerror=alert(/xss/)>>

  • 其他标签和利用还有很多很多….
  • 以上抓包修改数据Forward后,均成功弹窗:

三、Stored High 级别:

<?phpif( 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 = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
可以看到,这里使用正则表达式过滤了<script>标签,但是却忽略了img、iframe等其它危险的标签,因此name参数依旧存在存储型XSS
  • Burpsuite抓包改name参数为<img src=1 onerror=alert(/xss/)>:
  • Forward后,成功弹窗:


四、Stored **Impossible **级别:

<?phpif( 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();?>
----------------------------------------------------------------------------------------
可以看到,通过使用htmlspecialchars函数将几种特殊字符转义为HTML实体,mysqli_real_escape_string函数对单引号'转义,防止进行SQL注入,彻底防治了存储型 XSS 的利用和危害。
  • 可以看到,这次impossible在high级别的基础上对name参数也进行了更严格的过滤,导致name参数也无法进行XSS攻击。而且使用了Anti-CSRF token防止CSRF攻击,完全杜绝了XSS漏洞和CSRF漏洞。

五、参考链接:

https://www.runoob.com/sql/sql-insert.html
https://www.runoob.com/php/func-mysqli-query.htmlhttps://www.w3school.com.cn/php/func_string_strip_tags.asp

了XSS漏洞和CSRF漏洞。


五、参考链接:

https://www.runoob.com/sql/sql-insert.html
https://www.runoob.com/php/func-mysqli-query.htmlhttps://www.w3school.com.cn/php/func_string_strip_tags.asp

三、详解 DVWA_Stored存储型XSS相关推荐

  1. 富文本存储型XSS的模糊测试之道

    富文本存储型XSS的模糊测试之道 凭借黑吧安全网漏洞报告平台的公开案例数据,我们足以管中窥豹,跨站脚本漏洞(Cross-site Script)仍是不少企业在业务安全风险排查和修复过程中需要对抗的&q ...

  2. 【前端安全系列】【万字详解】如何防止XSS攻击?

    本文我们会了解 XSS ,主要包括: XSS 攻击的介绍 XSS 攻击的分类 XSS 攻击的预防和检测 XSS 攻击的总结 XSS 攻击案例 一.XSS攻击的介绍 跨站脚本攻击(XSS)是指通过存在安 ...

  3. Java SSM框架+jsp处理存储型XSS和反射型XSS漏洞

    关于存储型XSS和反射型XSS漏洞的修复 *这里是java中SSM框架,前端页面为JSP,仅在服务端做处理,思路是对脚本转义* 存储型XSS漏洞 1:表现形式 2:解决方式 第一步:创建过滤器XssR ...

  4. 【安全牛学习笔记】存储型XSS和BEEF浏览器攻击框架

    存储型XSS 长期存储于服务器端 每次用于访问都会被执行javascript脚本 Name:客户端表单长度限制 客户端.截断代理 <script src=http://1.1.1.1/a.js& ...

  5. 大神论坛 UEditor 富文本web编辑器最新漏洞版XML文件上传导致存储型XSS

    一.Ueditor最新版XML文件上传导致存储型XSS 测试版本:php版 v1.4.3.3 下载地址:https://github.com/fex-team/ueditor 复现步骤: 1. 上传一 ...

  6. 存储型XSS结合XSS平台获取cookie信息进后台——efucms

    百度搜索:efucms-含有存储型XSS漏洞的源码包 下载即可 实验目的:利用存储型XSS获取管理员Cookie信息,修改本地Cookie信息为管理员Cookie,以管理员身份不输入用户名.密码直接登 ...

  7. 反射型XSS,存储型XSS,Dom型XSS,如何获取cookie,XSS钓鱼,XSS获取键盘记录

    XSS: 反射型XSS,存储型XSS,Dom型XSS,如何获取cookie,XSS钓鱼,XSS获取键盘记录 一.跨站脚本漏洞(XSS) XSS漏洞一直被评估为web漏洞中危害较大的漏洞 XSS是一种发 ...

  8. DVWA通关--存储型XSS(XSS (Stored))

    目录 LOW 通关步骤 源码分析 MEDIUM 通关步骤 源码分析 HIGH 通关步骤 源码分析 IMPOSSIBLE 源码分析 存储型XSS也叫持久型XSS,从名字就知道特征是攻击代码会被存储在数据 ...

  9. 代码审计之Catfish CMS v4.5.7后台作者权限越权两枚+存储型XSS一枚

    首先本地搭建环境,我所使用的是Windows PHPstudy集成环境.使用起来非常方便.特别是审计的时候.可以任意切换PHP版本. 本文作者:226safe Team – Poacher 0×01 ...

最新文章

  1. 学习AI方向大半年,为什么你还没有别人几个月更精通?
  2. CTO:再写if-else,逮着一个罚款1000!
  3. 解密华为云原生媒体网络如何保障实时音视频服务质量
  4. Lua基础之math(数学函数库)
  5. perl中DBD-oracle安装,Linux下安装perl的DBI和DBD
  6. [INS-20802] Oracle Net Configuration Assistant failed
  7. 强烈推荐 | 算法/深度学习/NLP面试笔记
  8. 解决Sqlite Developer过期的办法
  9. 两个平面的位置关系和判定方程组解_高中必修二数学知识点
  10. php搜索功能与jquery搜索功能,JavaScript_基于jQuery实现页面搜索功能,jQuery实现页面搜索,搜索筛选 - phpStudy...
  11. linux查看文件夹的命令是,linux查看文件夹大小命令是什么
  12. css中给文字加框,让CSS3给你的文字加上边框宽度,并实现镂空效果
  13. 北京邮电大学计算机专业录取名单,祝福!“跪地谢母”考生被北京邮电大学计算机类专业录取...
  14. 牛刀杀鸡-开源社区API之抢楼大作战
  15. hp linux 禁用u盘启动不了,u盘启动禁用旧版启动模式并启用UEFI
  16. 菱形是一种特殊的平行四边形,是四条边均相等的平行四边形。题目给出菱形的边长n,用*画出菱形。如n=1,输出:
  17. 制作OpenCV相机标定板棋盘格图像
  18. 中国Linux早期历史的回眸
  19. 【SQL】leetcode 584.寻找用户推荐人(知识点:SQL的三值逻辑)
  20. bzoj1787.紧急集合(倍增LCA)

热门文章

  1. VMS Software, Inc.
  2. oss多线程 上传_Jmeter测试多线程并发请求 与 OSS 对象存储 测试报告
  3. 外商投资产业指导目录(2007年修订)
  4. ffmpeg-给视频添加字幕(二十四)
  5. Photoshop CC 2017 One-on-One: Mastery Photoshop CC 2017系列进阶教程之成为大师 Lynda课程中文字幕
  6. HTML文件保存时关闭自动换行,如何禁止html自动换行
  7. POJ 2547 No Tipping 笔记
  8. vue子组件修改父组件上的属性
  9. ./和../以及/和~之间的区别
  10. SAS MACRO Debugging option