RCE安全漏洞 贷齐乐系统Sql注入漏洞

  1. 远程代码执行介绍
  2. 在phpstudy上创建网站
  3. 在本地数据库中创建数据库--ctf,并创建users表,往表中插入数据

远程代码执行(Remote Code Execution,RCE)是一种严重的网络安全漏洞,它允许攻击者通过输入恶意代码直接操控目标系统的执行权限。SQL注入(SQL Injection)则是针对数据库应用程序的安全威胁,攻击者通过构造恶意SQL语句,欺骗应用程序执行非预期的操作。

在RCE方面,值得关注的复现点包括:

1漏洞利用示例:提供一些常见的RCE漏洞案例,如服务器端命令执行、文件包含漏洞等,以及相应的攻击向量和PoC(Proof of Concept)代码。
2.防御措施失效:展示如何绕过防火墙规则、认证机制,或是如何利用软件配置疏漏找到入口。
3修复过程和防范手段:解释如何检测这类漏洞,例如使用静态代码分析工具,并演示安全配置最佳实践。

对于SQL注入,值得注意的复现点有:

1.基本原理演示:展示如何构造SQL查询,嵌入非法字符,导致数据库执行非授权操作。
2.盲注技术展示:如时间戳盲注、错误消息注入,以及如何识别它们。
3.防止SQL注入的防护策略:讲解参数化查询、ORM框架的安全使用,以及Web应用防火墙的作用。

在phpstudy上创建网站

然后

在本地数据库中创建数据库--ctf,并创建users表,往表中插入数据

CREATE DATABASE ctf
 
use ctf
CREATE TABLE `users` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `pass` varchar(255) DEFAULT NULL,
  `flag` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

mysql> INSERT INTO `users` (`name`, `pass`, `flag`) VALUES ('admin', 'admin', 'hrctf{R3qeeeee_Is_1nterEst1ng}');

插入源码

<?php
header("Content-type: text/html; charset=utf-8");
require 'db.inc.php';
// 定义函数 dhtmlspecialchars,用于过滤 HTML 特殊字符
  function dhtmlspecialchars($string) {
      if (is_array($string)) {
         // 如果 $string 是数组,递归调用 dhtmlspecialchars 函数处理数组元素
          foreach ($string as $key => $val) {
              $string[$key] = dhtmlspecialchars($val);
          }
      }
      else {
        // 如果 $string 不是数组,替换 HTML 特殊字符为对应的转义序列
          $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;
  }
  // 定义函数 dowith_sql,用于检查 SQL 注入攻击
  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 数组,对用户输入的数据进行 SQL 注入检查和 HTML 特殊字符过滤
      $_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=mysql_query($sql);
      while($row = mysql_fetch_array($result))
      {
          echo "<tr>";
          echo "<td>" . $row['name'] . "</td>";
          echo "</tr>";
      }
  }
?>

waf1

 foreach ($_REQUEST as $key => $value) {
    // 遍历 $_REQUEST 数组,对用户输入的数据进行 SQL 注入检查和 HTML 特殊字符过滤
      $_REQUEST[$key] = dowith_sql($value);
  }

调用dowith_sql函数,过滤了select、union等关键字 

waf2

$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]));
          }
      }
  }

过滤了括号等一些恶意字符 

注入思路:
如果有一种方法让第一道WAF检测不到恶意字符再通过第二道WAF的覆盖,从而将恶意字符传入到$REQUEST中,就可以绕过WAF,完成注入。要让第一道WAF找不到恶意字符,那么我们就得再$REQUET中不得有恶意字符。其二便是$_SERVER可以有恶意字符,但是必须过我们的第二道WAF,然后再REQUEST接收。

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值