[SWPUCTF 2021 新生赛]finalrce
先进行代码审计,可以看出需要利用get传入一个参数,并且利用if和preg_match()函数过滤了一系列的字符串
在这里深入的再次介绍exec()函数
1 | exec(string $command, array &$output = null, int &$result_code = null): string|false |
exec()执行command参数所指定的命令,如果提供了output参数,会将命令执行的输出填充此数组,每行输出填充数组中的一个元素。如果同时提供output和result_code参数,命令执行后返回 的结果会被写到result_code ,返回命令执行结果的最后一行内容
所以这里直接执行命令是没有回显的,这里需要用到一个tee命令
tee命令会读取标准输入数据,并将其内容输出成文件。
基本的结构为
1 | command |tee file.txt |
|命令连接符,前语句假直接报错,后面不执行。反之,前语句真,后面执行。
还需要绕过ls
1 | /?url=l\s / |tee 1.txt |
这里的\转义字符是用于在外壳程序中转移字符,使控制字符成为字面量,而失去其在外壳程序中控制符的含义
然后去访问/1.txt
看到文件,且没有过滤tac,直接去读取
1 | /?url=tac /flllll\aaaaaaggggggg |tee 2.txt |
访问2.txt
得到了flag
[UUCTF 2022 新生赛]ez_rce
1 |
|
首先进行代码审计,首先可以看见过滤了一大堆符号,然后看见了eval()函数
构造payload:/?code=printf(l\s /
);
然后会看到fffffffffflagafag,然后获取文件的内容
因为过滤了cat和tac,因此再次使用\字符
payload:/?code=printf(c\at /fffffffffflagafag
);
得到flag