[TOC]
》前言
之前打比赛遇到过这种题,当时没做出来也忘记复现了,现在正好看到一篇文章顺便进行总结。
》背景
渗透过程中拿到一个 webshell 却一条命令都执行不了,phpinfo 查看禁用了好多命令执行函数。
可以利用的思路有以下五种:
- 寻找没有被禁用的函数
- Windows 中调用 COM 组件执行命令
- Linux 系统通过 LD_PRELOAD 加载自定义的动态库
- 利用 Bash 破壳(CVE-2014-6271)漏洞改变环境限制
- 利用 imap_open() 函数的特性绕过
- 通过 mod_cgi 模式绕过 php.ini 的限制执行脚本
》实现方法
一. 寻找未禁用的漏网之鱼函数
PHP 中执行命令的函数有
system,shell_exec,passthru,exec,popen,proc_open,pcntl_exec,mail,putenv,apache_setenv,mb_send_mail,assert,dl,set_time_limit,ignore_user_abort,symlink,link,map_open,imap_mail,ini_set,ini_alter
通常会有漏网之鱼,我们可以尝试寻找一些偏僻没有被禁用的函数如 proc_open()、pcntl_exec() 等。
二. Windows中调用COM组件执行命令
环境要求
- php.ini中已经开启 com.allow_dcom、extension=php_com_dotnet.dll