目录

Low

Medium

High

Impossible


Low

源代码:

  1. <?php
  2. if( isset( $_POST[ 'btnSign' ] ) ) {
  3. // Get input
  4. $message = trim( $_POST[ 'mtxMessage' ] );
  5. $name = trim( $_POST[ 'txtName' ] );
  6. // Sanitize message input
  7. $message = stripslashes( $message );
  8. $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)) ? "" : ""));
  9. // Sanitize name input
  10. $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)) ? "" : ""));
  11. // Update database
  12. $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
  13. $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>' );
  14. //mysql_close();
  15. }
  16. ?>

trim(string,charlist) : 移除string字符两侧的预定义字符,预定义字符包括\t 、 \n 、\x0B 、\r以及空格,可选参数charlist支持添加额外需要删除的字符

stripslashes(string): 去除掉string字符的反斜杠\

mysqli_real_escape_string(string,connection) :函数会对字符串string中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义。

$GLOBALS :引用全局作用域中可用的全部变量。$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。

可以看出,low级别的代码对我们输入的message和name并没有进行XSS过滤,而且数据存储在数据库中,存在比较明显的存储型XSS漏洞

我们输入 1 和 <script>alert('hack')</script> ,可以看到,我们的js代码立即就执行了

查看数据库,可以看到我们的js代表插入进去了

查看源代码,可以看到,Message位置显示的是我们的js代码,因为这里显示的数据是调用数据库里的数据

Medium

源代码:

  1. <?php
  2. if( isset( $_POST[ 'btnSign' ] ) ) {
  3. // Get input
  4. $message = trim( $_POST[ 'mtxMessage' ] );
  5. $name = trim( $_POST[ 'txtName' ] );
  6. // Sanitize message input
  7. $message = strip_tags( addslashes( $message ) );
  8. $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)) ? "" : ""));
  9. $message = htmlspecialchars( $message );
  10. // Sanitize name input
  11. $name = str_replace( '<script>', '', $name );
  12. $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)) ? "" : ""));
  13. // Update database
  14. $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
  15. $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>' );
  16. //mysql_close();
  17. }
  18. ?>

addslashes(string) :函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ' 、" 、\ 、NULL

strip_tags(string) :函数剥去string字符串中的 HTML、XML 以及 PHP 的标签

htmlspecialchars(string): 把预定义的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 转换为 HTML 实体,防止浏览器将其作为HTML元素

当我们再次输入1 和 <script>alert('hack')</script> ,strip_tags函数把<script>标签给剥除了,addslashes函数把 '  转义成了  \'

虽然 Message 参数把所有的XSS都给过滤了,但是name参数只是过滤了<script>标签而已,我们依然可以在name参数进行注入

可是发现name参数对长度有限制,最大长度是10

所以我们想到了抓包,然后进行篡改,我们输入如下的,然后抓包

如下框中的数据就是 <script>al 经过URL编码后的数据

我们需要将其修改为 <SCRIPT>alert('hack')</SCRIPT> 经过URL编码后的数据

提交后,就可以看到弹出此框了,说明我们的js代码执行了

查看数据库,可以看到我们的代码插入进数据库了。

查看页面源代码,可以看到name位置插入了我们的js代码

High

源代码:

  1. <?php
  2. if( isset( $_POST[ 'btnSign' ] ) ) {
  3. // Get input
  4. $message = trim( $_POST[ 'mtxMessage' ] );
  5. $name = trim( $_POST[ 'txtName' ] );
  6. // Sanitize message input
  7. $message = strip_tags( addslashes( $message ) );
  8. $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)) ? "" : ""));
  9. $message = htmlspecialchars( $message );
  10. // Sanitize name input
  11. $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
  12. $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)) ? "" : ""));
  13. // Update database
  14. $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
  15. $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>' );
  16. //mysql_close();
  17. }
  18. ?>

可以看到,high级别只是在medium级别上,name参数用了正则表达式进行过滤而已,我们仍然可以在name参数做手脚,抓包,然后改包,只不过这次改成 <img src=1  οnerrοr=alert('hack')>

我们输入如下的

然后将  <img src=1  οnerrοr=alert('hack')> 进行URL编码

可以看到,我们的js代码执行了

查看数据库,我们的代码被插入进数据库了

查看源代码,可以看到name位置插入了我们的img标签

Impossible

源代码:

  1. <?php
  2. if( isset( $_POST[ 'btnSign' ] ) ) {
  3. // Check Anti-CSRF token
  4. checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
  5. // Get input
  6. $message = trim( $_POST[ 'mtxMessage' ] );
  7. $name = trim( $_POST[ 'txtName' ] );
  8. // Sanitize message input
  9. $message = stripslashes( $message );
  10. $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)) ? "" : ""));
  11. $message = htmlspecialchars( $message );
  12. // Sanitize name input
  13. $name = stripslashes( $name );
  14. $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)) ? "" : ""));
  15. $name = htmlspecialchars( $name );
  16. // Update database
  17. $data = $db->prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );
  18. $data->bindParam( ':message', $message, PDO::PARAM_STR );
  19. $data->bindParam( ':name', $name, PDO::PARAM_STR );
  20. $data->execute();
  21. }
  22. // Generate Anti-CSRF token
  23. generateSessionToken();
  24. ?>

可以看到,这次impossible在high级别的基础上对name参数也进行了更严格的过滤,导致name参数也无法进行XSS攻击。而且使用了Anti-CSRF token防止CSRF攻击,完全杜绝了XSS漏洞和CSRF漏洞。

相关文章: XSS(跨站脚本攻击)漏洞详解

DVWA之DOM XSS(DOM型跨站脚本攻击)

DVWA之Reflected XSS(反射型XSS)

DVWA之Stored XSS(存储型XSS)的更多相关文章

  1. DVWA(七):XSS(stored)存储型XSS攻击

    存储型XSS : 存储XSS,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在.提交JS攻击代码存储到数据库然后再输出. low: 观察源码: <?php if( isset( ...

  2. DVWA 黑客攻防演练(十一) 存储型 XSS 攻击 Stored Cross Site Scripting

    上一篇文章会介绍了反射型 XSS 攻击.本文主要是通过 dvwa 介绍存储型 XSS 攻击.存储型 XSS 攻击影响范围极大.比如是微博.贴吧之类的,若有注入漏洞,再假如攻击者能用上一篇文章类似的代码 ...

  3. 存储型XSS

    DVWA系列(二)存储型XSS https://www.imooc.com/article/284686 网络安全:存储型XSS https://blog.csdn.net/qq_41500251/a ...

  4. 利用mysql对特殊字符和超长字符会进行截断的特性 进行存储型XSS攻击——WordPress <4.1.2 & <=4.2 存储型xss

    转自:Baidu Security LabXteam http://xteam.baidu.com/?p=177 漏洞概述 本次漏洞出现两个使用不同方式截断来实现的存储型xss,一种为特殊字符截断,一 ...

  5. Coremail邮件系统存储型XSS两个

    (1):Coremail邮件系统存储型XSS之一 给受害者发送主题如下的邮件: <svg onload='img=new Image();img.src="//x55.me/geo.p ...

  6. 小白日记49:kali渗透测试之Web渗透-XSS(三)-存储型XSS、DOM型XSS、神器BEFF

    存储型XSS与DOM型XSS [XSS原理] 存储型XSS 1.可长期存储于服务器端 2.每次用户访问都会被执行js脚本,攻击者只需侦听指定端口 #攻击利用方法大体等于反射型xss利用 ##多出现在留 ...

  7. Java Web开发 - 持久型/存储型XSS漏洞

    Java Web开发 - 持久型/存储型XSS漏洞 1.什么是XSS漏洞攻击? XSS是跨站脚本攻击(Cross Site Scripting)的简称,之所以叫XSS而不是CSS相比大家都能明白了吧, ...

  8. 【代码审计】大米CMS_V5.5.3 后台多处存储型XSS漏洞分析

      0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...

  9. 【代码审计】QYKCMS_v4.3.2 前台存储型XSS跨站脚本漏洞分析

      0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...

随机推荐

  1. 剑指 Offer 43. 1~n 整数中 1 出现的次数 + 数位模拟 + 思维

    剑指 Offer 43. 1-n 整数中 1 出现的次数 Offer_43 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author ...

  2. LeetCode-二叉树的镜像

    二叉树的镜像 二叉树的镜像 给定一个二叉树,输出二叉树的镜像. 只需要使用一个简单的递归,分别对左右子树反转后再对当前结点进行反转. #include<iostream> #include ...

  3. uwsgi+nginx+virtualenv+supervisor

    一.linux安装Python 1.依赖 `yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl ...

  4. JVM 中的垃圾回收

    说到JVM,总是绕不开垃圾回收,因为其是JVM的核心之一,因为对象的创建是非常频繁的,想要提高程序的执行效率,拥有一个高效的垃圾回收机制是必不可少的. 首先要明确,因为对象的创建只在堆中,所以垃圾回收 ...

  5. NET 5.0 Swagger API 自动生成MarkDown文档

    目录 1.SwaggerDoc引用 主要接口 接口实现 2.Startup配置 注册SwaggerDoc服务 注册Swagger服务 引用Swagger中间件 3.生成MarkDown 4.生成示例 ...

  6. Codeforces 976C Nested Segments

    题面: 传送门 C. Nested Segments Input file: standard input Output file: standard output Time limit: 2 secon ...

  7. c/c++ switch case内括号

    如果在case语句中有定义变量,则必须要加{},否则会报错.

  8. java连接sql server--关于登录验证及对数据库增删改查应用

    一:步骤## 1.sql server建立数据库和相关表 2.建立数据源  (1).打开控制面板找到管理,打开ODBC选项或直接搜索数据源  (2).打开数据源配置后点击添加,选择sql server ...

  9. 普通 Javaweb项目模板的搭建

    普通 Javaweb项目模板的搭建 1. 创建一个web项目模板的maven项目 2.配置 Tomcat 服务器 3.先测试一下该空项目 4.注入 maven 依赖 5.创建项目的包结构 6.编写基础 ...

  10. 「Unity卡牌自走棋」项目NABCD分析

    项目 内容 这个作业属于哪个课程 2021学年春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-初次邂逅,需求分析 在这个课程的目标是 锻炼在大规模开发中的团队协作能力 这个作业在哪个具体方 ...