cyhfvg/url_enum
GitHub: cyhfvg/url_enum
快速异步URL路径枚举工具,用于安全测试和漏洞发现。
Stars: 0 | Forks: 0
# URL 枚举
[简体中文](README.zh-CN.md)
`url_enum` 是一个命令行工具,用于从单词列表中发现 URL 路径或将值替换到 URL 模板中。它接受一个网络目标或目标列表文件,并生成易于过滤或保存的结果。
## 功能
- 将单词列表条目追加到目标 URL 或替换支持请求位置中的令牌。
- 读取每行包含一个目标 URL 的现有目标列表文件。
- 发送带有自定义头部、代理设置和可配置超时的 `GET` 或 `HEAD` 请求。
- 控制并发、添加请求抖动并可选地跟随重定向。
- 随机化完全展开的目标和单词列表请求序列。
- 生成扩展变体并按状态码或响应大小过滤结果。
- 将扫描结果写入 CSV 或 JSON Lines。
## 安装
### 下载发布版本
当可用时,从 [GitHub 发布](https://github.com/cyhfvg/url_enum/releases) 下载您平台的二进制存档,提取它,并将 `url_enum`(或在 Windows 上为 `url_enum.exe`)放置在您的 `PATH` 中。
发布构建的目标:
- Linux x86_64: `x86_64-unknown-linux-musl`
- Windows x86_64: `x86_64-pc-windows-gnu`
### 从源代码构建
安装稳定的 Rust 工具链,然后运行:
```
git clone https://github.com/cyhfvg/url_enum.git
cd url_enum
cargo build --release
```
编译的二进制文件位于 `target/release/url_enum`(或在 Windows 上的 `target\release\url_enum.exe`)。
## 快速入门
创建一个单词列表,每行一个条目:
```
admin
login
api/v1
```
在授权的目标上探测这些路径:
```
url_enum -t https://example.com -d paths.txt --filter-http-code 200,403
```
默认情况下,结果以 CSV 格式打印。要保存 JSON Lines 格式,请:
```
url_enum -t https://example.com -d paths.txt \
--filter-http-code 200,403 \
--format jsonl -o results.jsonl
```
## 使用示例
### 将路径追加到现有 URL
```
url_enum -t https://example.com/base -d paths.txt --concurrency 100
```
具有 `admin` 和 `api/v1` 等条目的此操作探测 `https://example.com/base/` 下的 URL。
### 扫描目标列表
当传递给 `-t/--target` 的值命名一个现有文件时,它被读取为目标列表,每行一个目标 URL:
```
https://one.example.com
https://two.example.com/base
```
```
url_enum -t targets.txt -d paths.txt --concurrency 50
```
默认情况下,请求按目标主要顺序生成:第一个目标的每个单词列表条目,然后是下一个目标的每个单词列表条目。
### 随机化请求顺序
使用 `--random-sequence` 来打乱完整的目标和单词列表请求序列:
```
url_enum -t targets.txt -d paths.txt --random-sequence
```
对于两个目标和三个单词列表条目,打乱的序列是从所有六个配对中抽取的,而不仅仅是打乱的目标列表。
### 减少请求突发
默认情况下,每个请求在发送之前都会从 `0` 到 `100` 毫秒获得确定的抖动,以减少意外的请求突发。增加界限以进一步分散请求开始时间,同时保留选定的并发限制:
```
url_enum -t https://example.com -d paths.txt \
--concurrency 20 \
--request-jitter-ms 250
```
每个 HTTP 请求在发送之前等待 `0` 到配置的毫秒数。这有助于减少短突发,但它不能替代授权、保守的并发或商定的测试窗口。
为了在受控环境中故意禁用此保护,请明确传递 `--request-jitter-ms 0`。
### 替换占位符
`--replace TOKEN` 支持以下位置的占位符:
- URL
- 头部名称
- 头部值
这些位置中 `TOKEN` 的每个出现都将替换为当前的单词列表条目。例如:
```
url_enum -t http://example.com/ENUM/a -d words.txt --replace ENUM \
-H 'X-ENUM-TRACE: ENUM.example.com'
```
对于单词列表条目 `word1`,这会发送一个相当于以下请求的请求:
```
curl http://example.com/word1/a -H 'X-word1-TRACE: word1.example.com'
```
### 尝试常见的文件扩展名
```
url_enum -t https://example.com -d paths.txt --extensions php,bak,txt
```
每个单词都尝试作为提供的内容以及每个请求的扩展名。
### 添加请求头部
`-H/--header` 可以指定多次:
```
url_enum -t https://example.com -d paths.txt \
-H 'Authorization: Bearer TOKEN' \
-H 'X-Trace: scan'
```
可以将 Cookie 作为请求头部提供:
```
url_enum -t https://example.com -d paths.txt -H 'Cookie: session=VALUE'
```
### 使用代理
```
url_enum -t https://example.com -d paths.txt --proxy http://127.0.0.1:8080
url_enum -t https://example.com -d paths.txt \
--proxy 'socks5h://username:password@127.0.0.1:1080'
```
支持的代理 URL 方案是 `http`、`https`、`socks5` 和 `socks5h`。
当需要身份验证时,在代理 URL 中包含凭据。
### 从标准输入读取目标
```
printf '%s\n' 'https://example.com' | url_enum -t - -d paths.txt
```
标准输入必须提供一个目标 URL。
## 选项
| 选项 | 描述 | 默认值 |
| --- | --- | --- |
| `-t, --target ` | 目标 URL、现有目标列表文件或 `-` 以从标准输入读取一个 URL。 | 必需的 |
| `-d, --dict ` | 每行一个条目的单词列表文件。 | 必需的 |
| `-r, --replace ` | 在 URL、头部名称或头部值中替换 `TOKEN`。 | 追加路径 |
| `--concurrency ` | 最大并发请求数量。 | `50` |
| `--request-jitter-ms ` | 在发送请求之前添加每个请求的确定抖动;明确传递 `0` 以禁用。 | `100` |
| `--random-sequence` | 打乱完全展开的目标和单词列表请求序列。 | 禁用 |
| `--timeout ` | 请求超时时间(秒)。 | `10` |
| `--method ` | HTTP 方法。 | `get` |
| `--user-agent ` | User-Agent 值。 | 浏览器风格的值 |
| `-H, --header <'NAME: VALUE'>` | 添加请求头部;根据需要重复指定。 | 无 |
| `--proxy ` | 使用 HTTP(S) 或 SOCKS5 代理;凭据可以包含在 URL 中。 | 无 |
| `--follow-redirect ` | 跟随重定向并包含返回的响应。 | `false` |
| `--insecure ` | 允许无效的 HTTPS 证书。 | `true` |
| `--filter-http-code ` | 仅包含逗号分隔的 HTTP 状态码。 | 所有 |
| `--black-http-code ` | 排除逗号分隔的 HTTP 状态码。 | 无 |
| `--black-size ` | 排除响应大小,例如 `612` 或 `612-614`。 | 无 |
| `--extensions ` | 添加逗号分隔的扩展变体。 | 无 |
| `-o, --output ` | 将结果写入文件而不是标准输出。 | 标准输出 |
| `--format ` | 输出格式。 | `csv` |
运行 `url_enum --help` 以获取构建中可用的命令行帮助。
## 基准测试
存储库包含一个可重复的本地基准测试,它比较了不同并发值和 CSV/JSONL 输出格式之间的吞吐量。它使用回环 HTTP 服务器,不接触外部目标:
```
cargo bench --bench throughput
```
## 输出
CSV 和 JSON Lines 输出都包含以下字段:
| 字段 | 描述 |
| --- | --- |
| `word` | 用于请求的单词列表条目。 |
| `url` | 报告的结果 URL。 |
| `status` | 当收到响应时,HTTP 状态码。 |
| `size` | 可用时的响应大小。 |
| `elapsed_ms` | 毫秒级的经过时间。 |
| `error` | 当请求失败时,错误消息。 |
## 安全注意事项
- 需要授权:仅扫描您拥有或明确授权测试的系统。
- 从保守的 `--concurrency` 值开始,并遵循商定的测试界限。默认的 `--request-jitter-ms 100` 有助于减少意外的短突发;仅当零延迟是故意的时才传递 `--request-jitter-ms 0`。
- 默认接受无效的 HTTPS 证书。当需要证书验证时,使用 `--insecure false`。
- 将输出文件和单词列表视为可能敏感的数据。
## 许可证
本项目根据 [BSD 3-Clause License](LICENSE) 许可。
标签:CSV 输出, HTTP 请求, JSON 输出, Rust 语言, URL 枚举, Web 安全, 代理设置, 可视化界面, 响应大小, 响应状态码, 并发控制, 异步编程, 扩展名生成, 结果保存, 结果格式化, 结果过滤, 网络测试, 词表攻击, 超时配置, 路径发现, 通知系统, 重定向处理, 随机化序列