【实战复盘】一天通关 PortSwigger SQL 注入 9 关:人机协作打法全记录

〇、协作模式(为什么快)

传统打法是自己开 Burp 抓包、手敲 payload、肉眼判断信号。我们把它拆成流水线:

  • 人:在 PortSwigger 教程页点 Launch,把 0aXX...web-security-academy.net 实例域名丢给 AI

  • AI:Python 走 Burp 代理自动化打(探列数 → 定位文本列 → 拖库 / 盲注抠密码 → CSRF 登录)

  • 人:刷新页面看到绿色 “Congratulations” 横幅,收工进下一关

AI 打一关 30 秒到 10 分钟不等,人全程只需要复制粘贴域名。Burp 开着不白开——HTTP history 里能看到完整的注入弹幕,学习复盘两不误。

铁律:每关先列"有几种解法",再逐条验证。 这条规矩救了我们好几次(见踩坑集)。


一、UNION 攻击 5 关:一套连招打穿

注入点都在 /filter?category=,打法模板化:

1. 探列数(200 = 正确):


2. 找文本列——把随机串塞各列,渲染进 <th>随机串</th> 的才是真命中(防坑:500 错误页会把 URL 里的串回显回来,是假阳性,必须确认状态 200 且进了 HTML 标签)。

3. 拖库(PostgreSQL 用 || 拼接):


4. 单列挤多值(第 5 关考点):输出列不够用时,把两个字段拼成一个字符串塞进去,就是上面这条 ||。

拿明文密码 → /login 页面先抓 csrf token → 带 token 登录 administrator,通关。


二、盲注 4 关:四大信道逐个击破

盲注的本质:数据不回显,但总有一个信道能当信号灯。四关正好四种信道:

信道 1:布尔信号(Conditional responses)

服务器发 TrackingId cookie 且拼进 SQL,页面有 “Welcome back” 字样当信号:


真 → Welcome back 出现;假 → 消失。逐字符抠完 20 位。

信道 2:报错信号(Conditional errors,Oracle 库)

信号灯换成 HTTP 500——条件为真就除零:


Oracle 要点:FROM dual、SUBSTR、TO_CHAR(1/0)。状态码硬邦邦不会抖,这关打得最稳,一发全对。

信道 3:时间延迟(Time delays,PostgreSQL)

先枚举三库延时语法锁定数据库(pg_sleep(3) 有效 = PostgreSQL,MySQL SLEEP 无效,Oracle dbms_pipe 无效),通关只要一句:


冷知识:pg_sleep 对结果集每一行都睡,sleep 10 秒实际响应 30 秒,反向侧写出 tracking 表匹配了 3 行。

信道 4:时间延迟 + 信息窃取(本系列最硬)

没回显没报错,唯一信号是响应时间。信号灯:


20 位密码、每位最多几十发、每发带 5 秒延迟——纯串行要半小时起步。解法:位级并发 + 双发一致才采信。9 分钟磨完,零错位。


三、Visible error-based:报错当回显用

这关报错会直接回显完整后端 SQL,等于开了透视挂。但有两个大坑:

  1. TrackingId 有 62 字符截断——payload 超长被砍尾巴

  2. PostgreSQL 短写法 password::int 更诡异:同长度下含 :: 的 payload 会在传输层被截断

试到差 1 字符卡死,最后看官方 solution 才点醒:把原 TrackingId 整个删掉,空 cookie 从引号开始注入,一下省出 16 字符:


密码转 int 失败,报错把明文原样带出:invalid input syntax for type integer: "xxxxxxxxxxxxxxxxxxxx"。爽关。


四、踩坑集(每一条都是学费)

坑

教训

二分法抠密码只有 10/20 位对

时间/布尔信道会抖,改线性扫描 + 并发 + “恰好命中一个才采信”,一次全对

500 错误页回显 URL 里的注入串

假阳性!必须确认字符串渲染进 <th> 且状态 200

换 lab 沿用上一关的列数

每个 lab 独立 schema,换 lab 必须重探列数(PostgreSQL 2 列 ≠ MySQL 3 列)

Launch 点错按钮开成别的关

拿到新实例别假设关卡类型,先测 TrackingId / category 单引号 + UNION 列数三个信号验明正身

UTL_HTTP / UTL_INADDR 外带无反应

Oracle 默认无 ACL 权限,XML 外带(EXTRACTVALUE + xmltype XXE)才是通用解

OOB 关只认 Burp Collaborator

PortSwigger 防火墙拦截 lab 到一切外部系统的回连,dnslog/interactsh 全没用


五、可复用的工具化成果

全部脚本已沉淀:

  • union_dump.py —— UNION 三步连招(探列数/文本列/拖库/登录)

  • blind_v3.py —— 盲注线性扫描 + 10 线程并发 + 唯一命中校验(布尔/报错信道通用,改 payload 即用)

  • time_based.py —— 时间信道版(双发一致 + 多数决抗抖动)

  • error_based.py —— CAST 报错带数据

盲注 720 发请求十几秒跑完,比手抠快一个数量级。


六、写在最后

最大的体会:把重复劳动交给 Agent,把判断留给人。AI 负责批量探测、并发扫描、payload 迭代;人负责 Launch、看横幅、在 AI 钻牛角尖时一句"要不要我给你答案/邪笑"把它拽回来(真的发生过,见 Visible error-based 那关)。

下一站:OOB 外带(最后一个 SQL 注入 lab,卡在 Collaborator 网络环境,不是技术问题)→ 然后 NOSQL、XSS 系列。

以上。有更骚的打法欢迎回帖交流!

大神牛啊

1 个赞

这九关我也刷过,盲注那两关不看提示真能卡一整晚