RCE Writeup
根据代码中ping可知,这题应该用ping命令攻击者注入:127.0.0.1; ls /(127.0.0.1为本地ip),本题用&链接ls命令,得到一个PHP文件
试着用cat命令打开php文件,但是打不开,考虑应该是文件中包含特殊字符,使用管道运行base64加密内容,所以用127.0.0.1 & cat 1374098296700.php | base64,得到一串编码
用base64解码得到flag
补充:linux中命令的链接符号
1.每个命令之间用;隔开
说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
2.每个命令之间用&&隔开
说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
3.每个命令之间用||隔开
说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
4.| 是管道符号。管道符号改变标准输入的源或者是标准输出的目的地。
5.& 是后台任务符号。 后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。
补充:Linux 基础命令
- 文件和目录操作命令
ls:列出目录内容,如 “ls -l” 以长格式显示文件和目录信息。
cd:切换目录,“cd /home” 切换到 home 目录,“cd..” 返回上一级目录。
mkdir:创建目录,“mkdir test” 创建名为 test 的目录。
rmdir:删除空目录,“rmdir test” 删除 test 目录(目录必须为空)。
rm:删除文件或目录,“rm -r test” 递归删除 test 目录及其内容。
cp:复制文件或目录,“cp file1.txt file2.txt” 复制 file1.txt 为 file2.txt。
mv:移动或重命名文件或目录,“mv file1.txt dir1/” 将 file1.txt 移动到 dir1 目录,“mv file1.txt file3.txt” 重命名 file1.txt 为 file3.txt。
2.文件内容查看命令
cat:查看文件内容,“cat file.txt” 显示 file.txt 的全部内容。
more:分页显示文件内容,按空格键向下翻页。
less:功能与 more 类似,但支持向前翻页(按 b 键)等更多操作。
3.系统信息查看命令
- uname:显示系统信息,“uname -a” 显示详细的系统信息。
- top:实时显示系统中各个进程的资源占用情况。
- df:查看磁盘空间使用情况。
- free:查看系统内存使用情况。
4.用户和权限管理命令
- useradd:添加用户,“useradd newuser” 添加名为 newuser 的用户。
- passwd:设置或修改用户密码,“passwd newuser” 修改 newuser 的密码。
- chmod:修改文件或目录权限,“chmod 777 file.txt” 赋予文件所有者、所属组和其他用户读、写、执行权限。
过滤cat
先127.0.0.1&ls打开目录,发现flag相关php文件,因为代码中有cat过滤,所以不能用cat查看文件内容,就要使用more或less命令
1 | if (!preg_match_all("/cat/", $ip, $m)) { |
与上题类似,用管道运行base64打开文件,再用base64解码
得到flag
补充:linux查看文本的命令
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
过滤空格
根据代码,本题需要过滤空格,用<或/**/代替空格,本题用<
注入127.0.0.1|cat<flag_247993140417425.php|base64,其他操作同上题
补充:空格过滤常用替代符号:
${IFS}
这是 Linux 系统中环境变量IFS(Internal Field Separator,内部字段分隔符)的引用,默认包含空格、制表符、换行符等,常用于替代空格。例如:cat${IFS}/etc/passwd(等效于cat /etc/passwd)。
若${IFS}被过滤,可尝试拼接或变形,如${IFS%??}(利用参数扩展截断,保留空格部分)。$IFS
直接使用环境变量IFS,但通常需要配合命令分隔符,例如:cat$IFS/etc/passwd。- 制表符(
\t)
在 URL 编码中为%09,在命令行中可直接作为分隔符,例如:cat%09/etc/passwd(URL 提交时)或cat\t/etc/passwd(部分环境支持)。 - 换行符(
\n)
URL 编码为%0a,部分场景下可作为分隔符,例如:cat%0a/etc/passwd。 - **反斜杠(
\)**
在部分 shell 中,反斜杠可转义空格,实际等效于空格,例如:cat\/etc/passwd(注意这里是反斜杠 + 空格的组合,实际执行时反斜杠被忽略,等同于cat /etc/passwd) - 其他特殊字符
如$IFS$9($9是当前 shell 的第九个参数,通常为空,用于混淆过滤),例如:cat$IFS$9/etc/passwd。 <或>:重定向符号可分隔命令,如cat</etc/passwd{}:部分 shell 支持,如cat{/etc/passwd}(需紧跟路径)%20:URL 编码空格(基础但可能被过滤)- 多变量拼接:如
a=ls;$a(用变量间接执行,避免空格) - 括号:
(ls)(部分环境中括号内命令可执行,无需空格)
过滤目录分隔符
根据代码不能使用/。用ls打开目录,发现一个子目录flag_is_here
打开这个子目录,需要cd/flag_is_here命令,而这道题不能用/,所以考虑可以用127.0.0.1;cd flag_is_here;ls,来代替这个命令,cd 进入flag_is_here目录,ls 显示flag_is_here目录里的内容。(意思可以理解为,;隔开命令不会影响其它命令的执行,换句话说,各个命令都会执行,所以127.0.0.1;cd flag_is_here;ls这个可以cd和ls命令同时执行,同时打开目录和子目录)
打开子目录,发现php文件,继续用cat打开php文件,127.0.0.1;cd flag_is_here;cat flag_22401669824094.php|base64
得到编码,base64解码得到flag
过滤运算符
根据代码,要过滤一下运算符,所以用;ls打开目录,在用cat打开文件,可以再接查看源代码,找到flag
综合过滤练习
在本题目中我们会用到:
%0a代替换行,%09代替 TAB键 (因为flag被过滤了,所以我们通过TAB来补全flag_is_here)%5c代替\(用 \ 来分隔开 cat ,因为 cat 也被过滤了)
根据代码,本题过滤的字符很多,所以考虑用URL编码来字符绕过,查URL表,发现%0a表示换行,可以代替;连接ls命令,所以注入127.0.0.1%0als,但是运用了URL编码,需要在URL或在hackbar中注入
出现子目录,但是flag被过滤了,所以要用到TAB补全(用%09*代替flag),得到php文件
将ls换成cd,为了打开子目录,cat打开php文件,但是cat被过滤了,所以可以用%5c隔开cat,并且PHP文件中的flag也要用%09*代替
打开文件,在源码中找到flag
编码大全和在线解码工具:CTF常见编码(超全) | 若狸’Blog
URL速查表:
URL编码相关题:CTF——URL编码问题 - 灰信网(软件开发博客聚合)闲着没事看看
[SWPUCTF 2021 新生赛]babyrce

PHP代码解读,要求cookie值为:admin=1,所以bp抓包,改cookie值

得到一个PHP文件,访问一下,又得到PHP代码

代码意思要传参url,并且不能有空格,所以是空格绕过题?url=ls${IFS}/获取文件目录(其中${IFS}是用来代替空格),得到flag相关目录

再cat获取文件内容cat${IFS},得到flag
