ctfshow easy_include

image-20240510214104282

简单读一下代码

定义了个 waf 函数,去除参数中所有的点,并且要求参数必须以小写符号开头。

但是后面仅仅只是判断了waf的返回值,返回值为真则执行下面的语句,需要保证这个 post 参数的值必须以小写字母开头(文件名前面拼接上 localhost 就可以绕过了)

下面的 include 直接包含了$_POST[‘1’] 的原内容(根本就没经过过滤嘛……)

看了下版本为 7.3

image-20240511005145030

在 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 配置项

image-20240511010207966

  1. 安装了 pear 扩展
  2. 知道了 pearcmd.php 这个文件的路径
  3. docker 环境下大概率会默认开启 register_argc_argv 这个选项
  4. 有包含点

在以上前提下,可以包含 pearcmd.php ,利用 $_SERVER[‘argv’] 的特性,创建特殊配置文件(写入一句话木马)

利用 pearcmd.php + $SERVER[‘argv’] 的特性写入特殊文件

首先利用题目包含 pearcmd.php(注意用 localhost 开头,保证以小写字母开头

1
2
3
4
5
6
7
8
9
10
<?php

function waf($path){
$path = str_replace(".","",$path);
return preg_match("/^[a-z]+/",$path);
}

if(waf($_POST[1])){
include "file://".$_POST[1];
}

image-20240511011305670

然后利用 $SERVER[‘argv’] 的特性,向这个 pearcmd.php 传入参数

image-20240511011718748

这里有个坑:HackBar的请求构造默认会进行url编码

尖括号和单引号会被编码,导致写入的文件里的一句话无法生效

可以使用 burp 抓包,并手动修改参数里的编码为原来的尖括号和引号

image-20240511012124554

此时包含创建的文件(/tmp/cmd.php),并执行命令 (密码为cmd)

即可 获取flag

image-20240511012726082

image-20240511012759337

image-20240511012828959

image-20240511012908525

image-20240511012946237

image-20240511013003638