SimpleRCE Hackbar版小白保姆级WP把每一条payload的来路、每一层套娃的含义、每一步点哪里都讲明白项目内容题目[Dest0g3 520迎新赛]SimpleRCE地址http://b5bb463e-e5fe-4f47-8375-01e4eb5bb141.node5.buuoj.cn:81/核心考点Hackbar版黑名单绕过RCE最终 Flag动态flag{0df8cf53-de9f-4b84-9656-f6b66222ab51}推荐工具浏览器 Hackbar一、先说结论这题本质上就是网站会把你提交的 aaa 参数当成 PHP 代码执行但是在执行之前会先拿黑名单把敏感词替换成 hacker。我们的任务不是硬碰硬去写 system、cat、readfile 这些高危词而是绕开它们换成没被拦住的函数组合。最终能一把出 flag 的 Hackbar payload 是下面这一条aaashow_source(join(array_slice(glob(/*),4,1)));它已经实测成功最后拿到的 flag 是flag{0df8cf53-de9f-4b84-9656-f6b66222ab51}二、Hackbar里到底该怎么填先正常打开题目链接。你会看到页面直接把 PHP 源码显示出来。打开浏览器里的 Hackbar。不同浏览器版本界面长得可能不完全一样但关键点都一样要能改请求方法要能发 POST 数据。把请求方法从 GET 改成 POST。因为题目源码里写的是 $_POST[aaa]也就是它只认 POST不认地址栏那种 GET。把目标网址保持为题目链接本身不要乱改路径。在参数区、请求体区或者 Raw Data 区里填写形如 aaa你的payload 这样的内容。你可以把 Hackbar 想成一个“更方便发包的小面板”。平时浏览器点开网页大多是帮你自动发 GET 请求而 Hackbar 让你手动决定我要发 POST我要带哪个参数我要塞什么内容。这题里你真正要提交的只有一个参数就是 aaa。所以你在 Hackbar 里盯着一件事就够了有没有成功发出 POST里面有没有 aaa。三、先把题目源码翻译成人话?phphighlight_file(__FILE__);$aaa$_POST[aaa];$black_listarray(...);$aaa str_ireplace($black_list,hacker,$aaa);eval($aaa);?逐句翻译如下。highlight_file(__FILE__)把当前这个 PHP 文件自己的源码显示出来。相当于门口直接贴了内部说明书。$_POST[aaa]从你发来的 POST 请求里把 aaa 这个参数取出来。str_ireplace(...)把黑名单里的词不分大小写统统替换成 hacker。注意它不是拒绝你而是偷偷改坏你的代码。eval($aaa)把字符串当真正的 PHP 代码执行。这一步就是整题的核心危险点。所以你要养成一个习惯先看输入点在哪里再看有没有过滤最后看过滤完以后是怎么被执行的。这里就是最典型的“输入可控 黑名单替换 eval 执行”。四、为什么普通payload全部会死很多新手第一反应会写 system(cat /flag);。看起来很合理但这题里会当场报废。因为 system、cat、flag 都在黑名单里。题目不会温柔地提醒你不行而是直接改成 hacker。system(cat /flag);会被替换成类似hacker(hacker /hacker);同理下面这些你熟悉的写法也会死。readfile(/flag)里面有 file 和 flag。highlight_file(/flag)函数名里有 file路径里还有 flag。scandir(/)scan 在黑名单里。$a...美元符号 $ 和等号 也在黑名单里连变量都不让你好好用。这一步特别关键。你不要再想着“我常用什么函数”而是要改成“现在什么还活着我就用什么”。CTF 里很多题不是拼记忆而是拼临场换路。五、一步一步推payload先别急着最终一把梭真正适合小白的做法是像摸黑找门把手一样一步一步试不要一口气跳最终答案。下面这三条 payload 的顺序非常重要。六、第0条测试先确认代码真的能执行先发一条最傻、最短、最不容易踩雷的测试。aaaecho(123);为什么是它因为 echo 不在黑名单里123 是纯数字不会触发敏感词替换。如果页面返回里出现 123就说明我们确实能控制 eval 执行代码。这一条相当于先对讲机里喊一声“喂”确认线路是通的。线路都没通你后面谈再复杂的利用都没意义。七、第1条payload先让服务器自己把根目录名单报出来aaaecho(join(glob(/*)));这条要从最里面往外面看。glob(/*)去根目录把所有项目找出来。这里的 * 可以理解成“全部都给我”。join(...)把找出来的一串项目粘成一整条文字。因为 glob 返回的是列表不是单个字符串。echo(...)把那条文字显示到页面上。你看到这里要形成一个思路我们本来想知道 flag 在不在服务器上但又不能直接写 flag 这个单词那就退一步先让服务器自己把目录名单吐出来。为什么不用 scandir因为 scan 被拦了。为什么不用 print_r、var_dump因为 print 和 var 也在黑名单里。绕来绕去最后能活着完成“列目录并输出”的就是 glob join echo 这一组。这条 payload 发出去以后页面会出现类似下面这样的内容。/bin/boot/dev/etc/flag/home/lib/lib64/media/mnt/opt/proc/root/run/sbin/srv/sys/tmp/usr/var这时你就得到一个非常重要的信息根目录里真的有 /flag。不是猜的是服务器自己告诉你的。八、第2条payload为什么要想到数组切片现在问题来了。我们已经知道有 /flag可还是不能直接在 payload 里写 flag。那怎么办答案是别按名字拿改按位置拿。上一步 glob(/*) 给你的本质是一个列表。按看到的顺序大致是0 /bin1 /boot2 /dev3 /etc4 /flag注意这里的下标从 0 开始不是从 1 开始。所以第 5 个元素 /flag它的下标其实是 4。现在我们需要一个工具从这个大列表里只切出第 5 项。这时就轮到 array_slice 上场。array_slice(glob(/*),4,1)这句翻成人话就是从 glob(/*) 这个大列表里从下标 4 的位置开始只切 1 个出来。结果就是一个只装着 /flag 的小列表。注意它切出来后还是列表不是字符串。所以还得再用 join 把它粘回字符串。join(array_slice(glob(/*),4,1))这时候它的结果就等价于 /flag 了。但妙就妙在我们从头到尾没有在输入里直接写出 flag 这个单词所以不会触发黑名单。九、第3条payload最后为什么选show_source现在路径问题解决了只剩最后一步怎么把文件内容显示出来。你可能会想到 readfile、file_get_contents、highlight_file但这些都带 file要么还带 get都会被黑名单拦住。这时我们去找一个功能差不多、但名字没踩雷的函数结果就找到了 show_source。aaashow_source(join(array_slice(glob(/*),4,1)));还是从里往外拆。glob(/*)列出根目录所有项目。array_slice(...,4,1)切出第 5 项也就是 /flag。join(...)把只含一个元素的小列表变回字符串路径。show_source(...)把这个路径对应的文件内容显示出来。到这里整个利用链就闭环了。不能直接写目标文件名就先列目录不能用变量就把函数一层一层套起来不能用常见读文件函数就换一个没被禁的 show_source。十、Hackbar里直接可用的payload清单下面这几条你可以按顺序直接复制到 Hackbar 里。发送方式统一都是 POST统一提交到题目主页统一放在 aaa 参数里。测试执行aaaecho(123);列根目录aaaecho(join(glob(/*)));读 flagaaashow_source(join(array_slice(glob(/*),4,1)));如果你的 Hackbar 是键值对表单界面就新建一个参数名字填 aaa值填 echo(123); 或后面的代码。如果你的 Hackbar 是原始请求体界面就直接整行填 aaaecho(123); 这种格式。十一、给纯小白的完整操作流程打开题目链接看见源码。先用眼睛锁定一句$aaa$_POST[aaa]; 这说明参数名是 aaa提交方式是 POST。打开 Hackbar把 Method 改成 POST。先发 aaaecho(123); 看页面有没有 123。有就说明代码执行链是通的。再发 aaaecho(join(glob(/*))); 看返回内容里有没有 /flag。最后发 aaashow_source(join(array_slice(glob(/*),4,1))); 页面里就会直接出现 flag。复制结果flag{0df8cf53-de9f-4b84-9656-f6b66222ab51}这一套流程的重点不是死记答案而是明白每一步在验证什么。第 1 步验证能执行第 2 步验证目标文件的位置第 3 步才是真正读内容。十二、把最终payload每一层掰开揉碎show_source(join(array_slice(glob(/*),4,1)));show_source把文件内容展示出来。你可以把它想成“打开文件并把里面的字念给你听”。join把一小段列表重新拼成一条字符串。像把几张小纸条粘回一张纸。array_slice从大列表里切一小块。像从一排抽屉里只抽出第 5 个。glob按条件找文件。像告诉管理员把根目录下面的东西都列出来。/*斜杠 / 表示根目录星号 * 表示全部。合起来就是“根目录下面所有项目”。4下标 4也就是第 5 个元素。1只切一个元素。你以后看到这种“函数套函数”的 payload不要怕长。最简单的拆法永远是从最里面开始看先做了什么再把结果交给外面一层继续处理。像剥洋葱一样一层一层看。十三、PHP里常见输出函数大白话总结echo最常见的输出像拿喇叭把内容喊出来。优点是短、常见、好用。print也能输出和 echo 很像但这题被拦了。print_r适合输出数组、对象像把一堆抽屉里的东西按结构摆给你看。CTF 里经常拿来快速看数组内容。var_dump比 print_r 更啰嗦不只告诉你内容还告诉你类型和长度。像老师批作业时连细节都标出来。做题时如果 print_r 和 var_dump 没被封它们特别适合看数组返回值。但本题里 print 和 var 被黑名单点名了所以我们只能走 echo join 这条路。十四、PHP里常见目录读取函数大白话总结scandir直接列目录像打开一个文件夹看里面有哪些文件。CTF 里很常用但这题因为 scan 被拦不能用。glob按条件找文件像你对管理员说名字符合这个规律的都给我列出来。带 * 时尤其好用。opendir / readdir像你先打开一个抽屉柜再一格一格往外掏。写起来比 scandir 麻烦一点。dirname / basename不是列目录但经常用来处理路径。basename 像只取文件名dirname 像只取上一级目录。CTF 里你要形成一个意识列目录不是只有 scandir 一种办法。被拦了就找同功能替代品。像这题用 glob 一样能摸到根目录结构。十五、PHP里常见显示文件内容的函数大白话总结readfile直接把文件内容输出出来像把纸上的字一口气念完。file_get_contents把文件内容读进字符串里像先把整张纸拿到手再决定怎么处理。highlight_file / show_source把文件内容高亮显示出来常用于看源码。对于纯文本文件也经常能直接把内容展示出来。include / require本意是把另一个 PHP 文件拉进来执行CTF 里经常和文件包含题绑定出现。这里你要特别记住很多函数目标一样但名字不一样。黑名单只拦住它想到的那些名字不一定拦得住所有同类工具。十六、CTF里经常见到的PHP函数和危险点eval把字符串当代码执行危险程度非常高。assert老版本或特殊配置下也可能把字符串当代码执行。system / exec / passthru / shell_exec调用系统命令常见于命令执行题。preg_replace老题里如果带 /e 修饰符也可能导致代码执行。call_user_func / array_map有时会被拿来间接调用函数。base64_encode / base64_decode经常被拿来藏 payload或者绕某些简单过滤。chr / ord经常被用来一位一位拼字符串绕过直接写敏感词。implode / join数组转字符串的常用工具很多绕过题都用得上。你不需要一下子把这些全背下来但要知道它们大致属于哪一类。输出类、读文件类、列目录类、执行命令类、字符串处理类。以后遇到过滤题就是在这些类别里找替补队员。十七、这题最容易踩的坑把请求发成 GET。源码明明写的是 POST结果你还在地址栏拼参数。一上来就直接写 /flag。这样会触发黑名单payload 直接被改坏。忘了数组下标从 0 开始。第 5 项的下标是 4不是 5。忘了 glob 返回的是列表不能直接拿来给 echo 当普通字符串看所以要 join。以为黑名单拦住一个函数就彻底没路了。其实 CTF 很多时候考的就是替代函数。十八、最后再把整题压成一句通关口诀先用 echo(123) 确认代码能跑再用 glob(/*) 把根目录名单报出来发现 /flag 后不直接写名字而是用 array_slice 按位置切出第 5 项再用 join 拼回路径最后交给 show_source 读出来。aaashow_source(join(array_slice(glob(/*),4,1)));最终 flag动态flag{0df8cf53-de9f-4b84-9656-f6b66222ab51}