环境搭建:
下载IBOS4.5.5建站系统安装成功后源码审计发现zend加密,使用SeayDzend(PHP解密工具)解密然后进行审计
命令执行漏洞:
命令执行漏洞指的是可以执行系统命令或者应用指令(如cmd或者bash命令)的漏洞,简单说就是用户输入的数据被当作系统命令来执行,php的命令执行漏洞主要基于一些函数的参数过滤不全而导致
命令执行函数:
system('whoami')php会操纵计算机执whoami命令并输出返回结果(目标机器是windows执行cmd命令,是Linux执行bash命令)
如果还想写webshell可以尝试cmd命令 echo "<?php @$_REQUEST[8]?>" > 1.php 可以把一句话木马写进1.phpecho exec('whoami') php去操纵计算机执行whoami命令,并只返回最后一行数据
echo shell_exec('whoami')php去操纵计算机执行whoami命令,获取所有数据
passthru('whoami')只调用命令,把命令的运行结果原样地直接输出到标准输出设备
特殊符号:反引号(``) echo `whoami`实际调用shell_exec()
漏洞复现:
定位shell_exec()发现
shell_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最后发现
$backupFileName = self::BACKUP_DIR . "/" . coreutilsstr_replace(array("/", "\", ".", "'"), "", $fileName);
发现$fileName我们可能控制
所以进入后台系统
提交抓包查看
发现$fileName我们可控
所以就有了思路:
既然使用了shell_exec()函数执行mysqldump并且是cmd那么我们可以使用&符号执行多条语句来写shell。
因为shell_exec(string)可以执行cmd命令,而cmd命令中是使用’&’将多条命令分隔开的,我们传入的参数中先把原有的mysqldump闭合。
但是继续跟进$fileName = coreutilsEnv::getRequest("filename");
因为使用getREQUEST很可能因为兼容性来url解码所以$替换成%26
发现成功写入文件
但是因为在上面审计的代码中发现,我们控制传入的$fileName中.会被替换成空并且拼接.sql
但是因为在备份的时候执行cmd命令,这就可以使用切割法来切割PATHEXT环境变量.这样就不会被过滤
写shell,最后再使用&将.sql后缀给绕过
连接菜刀
原文始发于微信公众号(是恒恒呐):通过切割环境变量绕过限制实现命令执行
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论