Web 题的观察顺序
Web 题的观察顺序
本文适合
遇到 Web 题时容易一上来乱扫目录、乱贴 payload,却没有保存请求基线的学习者。学完你能:按页面、请求、参数、状态和技术栈五层观察 Web 题,并把每个漏洞假设压成可复现的最小验证。
一句话判断
Web 题先观察"应用给了什么"和"请求怎么走",再决定测哪类漏洞;没有基线请求,就不要急着下漏洞结论。
高效顺序是:
题目中常见信号
优先假设:SQL 注入、参数污染、越权
最小动作:正常值、异常字符、布尔差异
优先假设:XSS、SSTI
最小动作:插入无害标记,看输出上下文
优先假设:文件上传、文件包含
最小动作:上传文本文件,确认保存路径和访问行为
优先假设:越权、逻辑漏洞、Cookie/JWT
最小动作:双账号对比资源 ID 和 token
优先假设:SSRF、任意文件读取
最小动作:请求可控外部地址或内网探针
优先假设:API 越权、GraphQL、WS 安全
最小动作:抓包保存接口、字段和鉴权方式
优先假设:注入、路径泄露、框架漏洞
最小动作:保存完整错误和触发输入
核心概念
Web 观察要分清三件事:
要回答的问题:功能是什么,用户能做什么
证据:页面源码、表单、按钮、JS
要回答的问题:浏览器实际发了什么
证据:URL、Method、Header、Cookie、Body
要回答的问题:哪些位置可控,影响哪里
证据:响应体、状态码、响应头、时间差
漏洞不是 payload 命中的瞬间才存在,而是"可控输入进入了危险上下文并产生稳定影响"。
最小分析流程
- 打开页面但不输入 payload:记录功能、路由、提示、报错和版本信息。
- 查看源码和静态资源:查 HTML 注释、隐藏字段、JS API、source map。
- 保存正常请求基线:用浏览器 Network 或 Burp 保存一次完整请求。
- 列所有可控位置:GET、POST、JSON、Cookie、Header、文件名、路径段。
- 一次只测一个参数:每次保留原请求,只改一个字段。
- 记录响应差异:状态码、长度、跳转、报错、时间、响应头、JSON 字段。
- 按信号转知识点:SQL、XSS、上传、SSRF、越权等各自进入对应文章。
- 保留失败证据:无差异、被过滤、无权限也要记录,避免重复测试。
记录模板:
功能:
正常请求:
可控位置:
修改内容:
响应变化:
判断:
下一步:最小验证示例
1. 保存请求基线
curl -i 'http://target/search?q=test'
curl -i 'http://target/search?q=admin'如果两个正常值导致页面内容变化,说明 q 参与后端逻辑;如果完全相同,先怀疑前端渲染、缓存或参数未使用。
2. SQL 注入观察
curl -i "http://target/item?id=1'"
curl -i 'http://target/item?id=1 and 1=1'
curl -i 'http://target/item?id=1 and 1=2'判断:
单引号触发 SQL 报错 -> 参数可能进入 SQL
1=1/1=2 页面稳定不同 -> 布尔注入假设成立
无报错但响应时间异常 -> 继续测时间盲注3. 输出上下文观察
curl -s 'http://target/profile?name=MARK_WEB_123'
curl -s 'http://target/profile?name=%3Csvg%20onload%3Dalert(1)%3E'判断:
MARK_WEB_123 原样出现在 HTML 文本 -> 可能是 HTML 上下文 XSS
出现在属性值、JS 字符串或响应头 -> 按上下文选择转义绕过
完全不出现 -> 参数可能未进入输出或被后端过滤常见利用 / 解题路线
路线总览:
路线:参数基线 -> 报错/布尔/时间差 -> [[SQL注入入门]] 或 [[非MySQL数据库注入]]
路线:标记回显 -> 上下文定位 -> [[XSS入门]] 或 [[XSS进阶]]
路线:上传文本 -> 访问路径 -> 后缀/MIME/内容/解析 -> [[文件上传基础]]
路线:正常文件 -> 路径穿越 -> 配置/源码读取 -> [[任意文件读取与下载]]
路线:双账号对比 -> ID/角色/状态绕过 -> [[访问控制与越权]]
路线:外带服务 -> 内网探测 -> 协议绕过 -> [[SSRF基础]]
路线:枚举接口 -> 鉴权/字段/方法差异 -> [[API安全基础]]、[[GraphQL安全]]
路线:抓 WS 帧 -> 改身份/频道/消息字段 -> [[WebSocket安全]]
常见失败原因
可能原因:真正入口在 POST、JSON、Cookie 或 Header
排查动作:从 Network 面板重新列请求
可能原因:参数未被使用或被前端覆盖
排查动作:改正常值做基线对比
可能原因:路径、方法、Header、身份条件不同
排查动作:测 Method、Referer、X-Forwarded-For、双账号
可能原因:没和业务入口对应
排查动作:先确认功能和参数影响
可能原因:Cookie、CSRF token、编码或缓存差异
排查动作:保存完整请求,检查 token 和 URL 编码
可能原因:flag 可能在后续接口或权限链
排查动作:继续看 API、下载、后台、配置文件
迷你案例
页面只有一个搜索框。先访问 q=test 和 q=admin,发现结果数量不同,说明参数参与查询。查看源码没有提示,Network 里发现实际请求是 /api/search,返回 JSON。
提交 q=MARK_WEB_123,JSON 中原样回显。提交 q=' 返回 SQL syntax 报错;再测 q=test' and '1'='1 与 q=test' and '1'='2,两次结果数量不同。
最终记录:
入口:GET /api/search?q=
基线:正常关键词影响结果数量
证据:单引号报错,布尔条件影响 JSON 数组长度
结论:SQL 注入假设成立
下一步:列数、回显位、读取 flag 表如果第一步没有看 Network,只盯页面表单,很容易漏掉真实 API 路径和 JSON 响应差异。