sql布尔盲注是利用数据库在真假条件判断下返回不同页面内容或响应时间的漏洞,php代码自测需通过模拟构造包含逻辑判断的payload并观察http状态码、响应长度或特定关键字的出现情况来确认风险。具体做法是提取用户输入参数,将其拼接到基于布尔逻辑(如and 1=1)的sql查询中,使用pdo或mysqli执行后对比正常请求与注入请求的响应差异,若存在显著区别则说明存在盲注风险。

如何构造布尔盲注的核心Payload
核心Payload通常利用SQL中的AND运算符结合子查询或比较函数来构建真假分支。例如,使用SUBSTR()或MID()函数截取数据库版本信息的第一个字符,并与ASCII码进行比较。如果条件成立,页面会显示正常内容;如果不成立,页面可能空白或报错。这种机制允许攻击者逐位猜测数据。

import requests
url = "http://target.com/news.php?id=1"
# 测试版本信息第一位是否为 '5'
payload = "1 AND ASCII(SUBSTR((SELECT version()),1,1))=53"
resp = requests.get(url, params={"id": payload})
if "Normal Content" in resp.text:
print("True: First char is likely '5'")
else:
print("False")
PHP后端如何检测此类注入尝试
PHP后端可以通过记录查询语句和输入参数的匹配度来检测潜在的注入行为。虽然WAF可以拦截常见特征,但更可靠的方式是在应用层对输入进行严格的类型检查和白名单过滤。对于必须使用动态SQL的场景,应强制使用预处理语句(Prepared Statements),从根本上消除拼接带来的风险。自测时,可以编写脚本向接口发送一系列布尔型Payload,并监控服务器日志中是否出现异常的SQL语法错误或慢查询。

<?php $id = $_GET['id'];
// 错误示范:直接拼接
$sql = "SELECT * FROM news WHERE id = $id";
// 正确示范:使用预处理语句
$stmt = $pdo->prepare('SELECT * FROM news WHERE id = :id');
$stmt->execute(['id' => $id]);
$result = $stmt->fetch();
?>
当输入参数为空字符串时程序的行为
当输入参数为空字符串时,如果代码未做非空校验直接拼接进SQL,可能导致语法错误或被利用进行宽字节注入等变种攻击。在布尔盲注场景下,空值往往会导致查询返回空集,页面显示异常。开发者应在入口处对所有GET/POST参数进行trim和类型转换,确保进入数据库层的值是预期的整数或特定格式字符串,从而阻断基于空值的模糊试探。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











