知识点
命令执行漏洞,指的是可以执行系统命令或者应用指令(如cmd或者bash命令)的漏洞
简单说就是用户输入的数据被当作系统命令来执行,php的命令执行漏洞主要基于一些函数的参数过滤不全而导致
命令执行函数
- system('whoami')php会操纵计算机执whoami命令并输出返回结果(目标机器是windows执行cmd命令,是Linux执行bash命令)
- 如果还想写webshell可以尝试cmd命令 echo "" > 1.php 可以把一句话木马写进1.php
- echo exec('whoami') php去操纵计算机执行whoami命令,并只返回最后一行数据
- echo shell_exec('whoami')php去操纵计算机执行whoami命令,获取所有数据
- passthru('whoami')只调用命令,把命令的运行结果原样地直接输出到标准输出设备
- 特殊符号:
反引号(``) echo `whoami`实际调用shell_exec()
第一步.环境搭建
下载IBOS4.5.5建站系统安装成功后源码审计发现zend加密,使用SeayDzend(PHP解密工具)解密然后进行审计
第二步.漏洞复现
定位shell_exec()
发现
1shell_exec("{$mysqlBin}mysqldump --force --quick $command1 --add-drop-table $command2 $command3 --host=\"{$db["host"]}\" $command5 --user=\"{$db["username"]}\" --password=\"{$db["password"]}\" \"{$db["dbname"]}\" $tablesstr > $dumpFile");
使用了mysqldump
用来备份数据库
同时还发现备份的文件名$dumpFile
我们有可能可以控制
于是我跟进$dumpFile
,最后发现如下
1$backupFileName = self::BACKUP_DIR . "/" . core\utils\str_replace(array("/", "\\", ".", "'"), "", $fileName);
发现$fileName
我们可能控制
所以就可以进入后台系统
提交抓包查看
发现$fileName
我们可控
所以就有了思路:
既然使用了shell_exec()
函数执行mysqldump
并且是cmd
那么我们就可以使用&符号执行多条语句来写shell
因为shell_exec(string)
可以执行cmd命令,而cmd命令中是使用’&’将多条命令分隔开的,我们传入的参数中先把原有的mysqldump
闭合
继续跟进$fileName = core\utils\Env::getRequest("filename");
因为使用getREQUEST
,很可能因为兼容性来url解码,所以将$替换成%26
发现成功写入文件
在上面审计的代码中,我们发现控制传入的$fileName
中,.
会被替换成空,并且拼接.sql
但是因为在备份的时候执行cmd命令,这就可以使用切割法来切割PATHEXT环境变量.
就不会被过滤
写shell,最后再使用&将.sql后缀给绕过
连接菜刀就好了