CTFshow easy_include
ctfshow easy_include
简单读一下代码
定义了个 waf 函数,去除参数中所有的点,并且要求参数必须以小写符号开头。
但是后面仅仅只是判断了waf的返回值,返回值为真则执行下面的语句,需要保证这个 post 参数的值必须以小写字母开头(文件名前面拼接上 localhost 就可以绕过了)
下面的 include 直接包含了$_POST[‘1’] 的原内容(根本就没经过过滤嘛……)
看了下版本为 7.3
在 7.4 以前php是默认安装 pecl 这个用于管理拓展而命令行工具的(pear扩展)
参考大佬文章 0x06 部分:https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html
在 docker 的php任意版本镜像中, pcel/pear 都会被默认安装,安装的路径为 /usr/local/lib/php,这个工具的文件名为:pearcmd.php (简单好记)
由于 ctf 大多是 docker 环境,因此大概率存在这个命令行工具,并且路径已经确定。
docker 环境下的php镜像,默认会开启一个 register_argc_argv 配置项
- 安装了 pear 扩展
- 知道了 pearcmd.php 这个文件的路径
- docker 环境下大概率会默认开启 register_argc_argv 这个选项
- 有包含点
在以上前提下,可以包含 pearcmd.php ,利用 $_SERVER[‘argv’] 的特性,创建特殊配置文件(写入一句话木马)
利用 pearcmd.php + $SERVER[‘argv’] 的特性写入特殊文件
首先利用题目包含 pearcmd.php(注意用 localhost 开头,保证以小写字母开头
1 |
|
然后利用 $SERVER[‘argv’] 的特性,向这个 pearcmd.php 传入参数
这里有个坑:HackBar的请求构造默认会进行url编码
尖括号和单引号会被编码,导致写入的文件里的一句话无法生效
可以使用 burp 抓包,并手动修改参数里的编码为原来的尖括号和引号
此时包含创建的文件(/tmp/cmd.php),并执行命令 (密码为cmd)
即可 获取flag