1. RCE漏洞基础入门从eval执行开始RCERemote Code Execution漏洞是CTF比赛中常见的题型之一也是实际渗透测试中的高危漏洞。简单来说就是攻击者能够通过某种方式在目标服务器上执行任意命令。我们先从最基础的eval执行开始讲起。eval函数在PHP中是个危险的存在它会把字符串当作PHP代码来执行。在CTFHUB的eval执行关卡中通常会给出类似这样的代码?php $cmd $_GET[cmd]; eval($cmd); ?看到这段代码我第一反应就是这不就是明摆着让我们执行任意命令吗实际操作中我们可以通过URL参数传递PHP代码。比如想要查看当前目录下的文件可以构造这样的payload/?cmdsystem(ls);这里有几个关键点需要注意必须使用system()等执行系统命令的函数语句结尾的分号不能省略空格需要用%20替代否则会被URL解析为参数分隔符我在实际测试中发现有时候直接执行ls可能看不到flag文件这时候就需要查看上级目录/?cmdsystem(ls%20/);找到flag文件后用cat命令读取内容/?cmdsystem(cat%20/flag_29475);这种基础关卡主要考察对PHP函数和系统命令的基本理解算是RCE的Hello World。2. 文件包含漏洞的利用技巧文件包含是另一个常见的RCE入口点特别是当allow_url_include配置开启时危险性会大大增加。在CTFHUB的文件包含关卡中通常会遇到以下几种情况2.1 基础文件包含典型的漏洞代码长这样?php $file $_GET[file]; include($file); ?这种情况下我们可以尝试包含系统文件比如/etc/passwd/?file../../../../etc/passwd但我们的目标是执行命令这时候就需要用到php://input这个特殊的协议。它的妙处在于可以把POST请求体作为PHP代码执行。操作步骤是用Burp Suite拦截请求改为POST方法设置目标为/?filephp://input在请求体中写入PHP代码比如?php system(ls /); ?2.2 使用php://filter读取源码当直接执行命令被限制时我们可以用php://filter来读取源代码/?filephp://filter/readconvert.base64-encode/resourceindex.php这样会返回经过base64编码的源码解码后就能分析更多漏洞点。我在一次比赛中就靠这个方法找到了隐藏的后门函数。3. 命令注入的进阶技巧命令注入比单纯的eval执行更常见于实际场景比如下面这个网络延迟测试的题目?php $ip $_GET[ip]; system(ping -c 3 .$ip); ?3.1 命令分隔符的使用Linux提供了多种命令分隔符各有特点;顺序执行无论前一个命令是否成功只有前一个命令成功才会执行下一个||只有前一个命令失败才会执行下一个|管道符将前一个命令的输出作为后一个命令的输入后台执行在测试中我发现最常用的是;和127.0.0.1 ls3.2 绕过输出限制有时候命令执行了但看不到输出这时候可以用base64编码输出127.0.0.1 cat flag.php | base64解码后就能看到完整内容。记得在实战中如果遇到特殊字符显示问题base64是个好帮手。4. 过滤绕过的艺术现在的CTF题目越来越注重考察过滤绕过的能力下面分享几种常见情况4.1 过滤cat怎么办Linux下查看文件的命令可不止cat一个more分页显示less可上下翻页head/tail显示开头/结尾nl带行号显示tac倒序显示比如127.0.0.1 more flag.php4.2 过滤空格怎么办空格可以用这些替代或重定向符号${IFS}内部字段分隔符%09tab的URL编码例如127.0.0.1catflag.php4.3 过滤运算符怎么办如果|、、;都被过滤了可以尝试%0a换行符的URL编码%0d回车符的URL编码\n换行的转义字符payload示例?ip127.0.0.1%0als4.4 综合过滤绕过实战最棘手的题目会把cat、flag、空格、运算符都过滤掉。这时候就需要组合技用more代替cat用${IFS}代替空格用通配符代替flag比如f*用%0a代替命令分隔符最终payload可能长这样?ip127.0.0.1%0amore${IFS}f*在最近一次比赛中我花了两个小时才构造出正确的绕过姿势。关键是要耐心尝试各种组合同时注意URL编码的问题。