在buu上偶然刷到一道题(忘了哪道题了:(),挺有意思的,于是乎便记录了下来。
1 | <?php |
这是源码,phpinfo.php里提示要看看register_argc_argv。
网页访问phpinfo.php,看到register_argc_argv打开了,正常情况下这是关闭的,但在server的情况下会自动开启。
这个参数的大概意思为:
将用户的输入赋值给$argv,$argc,$_SERVER['argv']这三个变量,赋值的过程在php源码里,大体为:
先判断variables_order是否含有S即$_SERVER变量,然后在判断是否开启register_argc_argv,最后判断request_info.argv是否存在,若不存在,则执行:
php_build_argv(SG(request_info).query_string, &PG(http_globals)[TRACK_VARS_SERVER]);
不用管php_build_argv()函数是怎么执行的,主要看中间的参数:SG(request_info).query_string。
意味着http数据包里的query_string会被作为$SERVER[‘argv’]的值。那么这就有可控变量了。
然后再看pearcmd.php中pear获取命令行的代码:
大概是先获取argv,如果获取不到argv就获取$SERVER‘argv’。
那么pear中有什么可利用的参数命令吗?
有一个Config—create:写入文件的命令,需要两个参数,第一个文件的绝对路径,第二个文件路径,作用是将第一个参数写到第二个参数里去,可能比较抽象,举个例子:
pear config-create /<?=@eval($_POST[1]);?> /tmp/nebu.php
就会在/tmp目录下创建一个nebu.php文件,内容是/<?=@eval($_POST[1]);?>,至于为什么要在开头加/,因为第一个参数必须为绝对路径。这样的话就可以利用文件包含利用我们写的马。
所以可以构造?file=/usr/local/lib/php/pearcmd.php&+config-create+/+/tmp/nebu.php
file为文件包含,题目源码里的那个,目的是pearcmd.php文件包含进去。后面传入+config-create+/<?php phpinfo()?>+/tmp/nebu.php,因为$SERVER[‘argv’]获取参数是靠+分割的,所以就会变成config-create,/<?php phpinfo()?>和/tmp/nebu.php,这样就好理解了。
最终在tmp文件下创建了有个nebu.php文件,然后在通过文件包含再次访问nebu.php即可