识别php二次注入漏洞的关键在于追踪数据全生命周期,确认是否经历“存储+延迟执行”两个阶段:恶意输入首次入库时看似安全,后续被读取拼接进sql且未再次过滤或预处理,从而触发注入。

识别 PHP 二次注入漏洞,关键不在于看一次请求是否“安全”,而在于追踪数据的完整生命周期:它从哪来、中间怎么存、最后怎么用。
看数据是否经历“存储+延迟执行”两个阶段
二次注入的核心特征是:恶意输入在第一次操作中看似无害地被存入数据库(比如用户昵称、地址、备注),之后在另一处业务逻辑中被直接拼接进 SQL,且未做任何处理。
- 常见场景包括:用户资料编辑后保存到数据库 → 后台导出报表时读取所有用户地址拼 SQL;前台提交订单备注 → 财务对账时按备注字段查询统计
- 如果某处代码读取了数据库字段(如
$remark = $row['remark'];),紧接着又写成"SELECT * FROM logs WHERE remark = '$remark'",就构成高风险路径 - 特别注意那些“非显式表单提交”的入口:日志记录、缓存键生成、邮件模板填充、定时任务中的数据组装
查数据库字段是否被当作 SQL 片段使用
不能只检查 $_POST、$_GET,要逆向审计所有从数据库 SELECT 出来的字符串变量,尤其是 varchar/text 类型字段。
- 搜索代码中类似
mysql_query("...".$db_field.")、mysqli_query($conn, "INSERT...".$name.")的拼接模式 - 重点关注
UPDATE、DELETE、UNION SELECT等高危上下文,攻击者常利用二次注入绕过登录后的权限校验 - 若字段内容含单引号、反斜杠、括号或 SQL 关键字(如
admin' --、test%00),但入库时没转义、读出时又没预处理,基本可确认存在
验证是否存在“过滤与使用脱节”
很多项目在入库前对输入做了 addslashes 或 htmlspecialchars,但这两者目的完全不同——前者防注入,后者防 XSS。用错就等于没防。
- 例如:入库前用
htmlspecialchars($input)存进数据库,读出后直接拼 SQL —— 这毫无意义,因为 htmlspecialchars 不影响 SQL 解析 - 再如:用
addslashes()入库,但读出后调用stripslashes()再拼接 —— 攻击载荷原样复活 - 真正安全的做法是:入库用预处理(或至少 mysqli_real_escape_string 配合正确字符集),读出后仍用预处理执行后续查询,不依赖“已处理过”的假设
用典型 payload 做轻量探测
在可控字段(如用户昵称、签名、收货地址)中尝试提交以下内容,观察后续功能是否异常:
-
test' AND SLEEP(3) --(时间盲注特征,后台页面响应明显变慢) -
admin' UNION SELECT 1,2,3,version() --(报错或回显数据库版本) -
abc' OR '1'='1(导致本不该出现的数据被查出,比如订单列表多显示他人订单)
注意:探测需在业务逻辑允许修改该字段的前提下进行,且优先选测试环境。真实环境中,这类行为可能触发风控或日志告警。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











