一、数据库注入基础与多数据库注入详解
1. MySQL 注入(含堆叠注入)
- 堆叠注入核心条件:源代码使用
mysqli_multi_query函数(支持分号分隔的多语句执行),区别于单语句执行的mysqli_query。 - 核心操作:
- 数据查询:直接通过
select *拿数据,支持联合注入、报错注入。 - 文件读写:
- 读文件:
load_file('绝对路径')(需知道文件绝对路径 + 数据库读权限,如读取 Linux/etc/passwd); - 写文件:
into outfile '路径/文件名'(仅支持文本文件)、into dumpfile '路径/文件名'(支持二进制文件,如图片); - 路径注意:反斜杠需用双反斜杠(
\\)或正斜杠(/)避免转义;引号被过滤时,可将路径转为进制规避。
- 读文件:
- 权限配置:修改 MySQL 配置文件,添加
secure_file_priv=(空值允许任意路径写入),修改后必须重启 MySQL 服务。
- 数据查询:直接通过
- SQL 注入防御方式:
- 过滤:基于黑名单拦截
and 1=1、or 1=2等关键字,优点是业务改动小、部署方便,缺点是易误报、易被绕过。 - 编码:转义用户输入的特殊字符后拼接 SQL,优点是不影响正常请求、不易被绕过,缺点是整改工作量大、数据库需支持,理论存在绕过风险。
- 预编译:先编译 SQL 语句,再传入参数,恶意字符被当作参数而非命令执行,优点是杜绝大部分注入,缺点是业务改动量大,适合新开发项目。
- 过滤:基于黑名单拦截
2. Access 数据库注入
- 数据库判断方法:
- URL 后缀猜测:ASP 语言常与 Access 连用。
- 报错信息判断:特定报错特征可直接识别。
- 系统表访问判断:Access 默认有
objects、queries、relationships三张系统表,外网环境无访问权限,访问报错即可判断。
- 专属函数:
count(计数)、len(字符长度,区别于 MySQL 的length)、asc(返回 ASCII 值,区别于 MySQL 的ascii)、mid(字符串截取)、chr(ASCII 转字符)、if(条件判断)、exists(判断数据存在,返回布尔值)。 - 核心特点:无库名,仅表结构,需猜解表名(如
admin、user)和字段名(如username、password)。 - 注入方式:
- 联合注入步骤:
- 判断注入类型(数字型 / 字符型,数字型可用
ID=8-1验证,加号会被 URL 编码为空格,优先用减号); order by N判断列数(如 11 列);- 猜解表名(通过
exists函数,如and exists(select * from admin)); - 结合表名判断回显位(需拼接
from 表名使语句完整); - 猜解字段名(如
and exists(select username from admin));
- 判断注入类型(数字型 / 字符型,数字型可用
- 联合注入步骤:


