【工具学习27】Arjun:帮你找到了藏起来的第25890个参数

admin 2026-09-28 05:18:24 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍Arjun参数发现工具,通过二分查找与响应差异分析,仅需50-60个请求即可从25890个候选参数中定位隐藏参数。文章详述安装、基础与进阶用法、五个实战场景及注意事项,强调与ffuf互补使用,并提醒仅限授权测试。 综合评分: 85 文章分类: 渗透测试,安全工具,红队


【工具学习27】Arjun:帮你找到了藏起来的第25890个参数

原创

CabinQ CabinQ

逆熵寻生

2026年9月25日 09:13 浙江

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

你看到的参数只有id,Arjun帮你找到了藏起来的第25890个

渗透测试时,你最常遇到的是这种接口:

GET /api/userinfo?id=751634589

看起来就一个 id 参数,你能干什么?改改 id 值试试越权,跑个 SQL 注入,差不多了。

但你有没有想过——这个接口背后,可能还藏着 admin、debug、role、internal 这些参数?只是前端页面没有暴露出来而已。

如果有个参数叫 admin=true,传进去之后接口返回的数据量翻了十倍,你是不是就找到了一条新的攻击面?

Arjun 就是干这个的:用 25,890 个参数名去探测一个 URL 端点,找出那些后端接受但前端没有暴露的隐藏参数。关键是,它只需要发 50-60 个请求,10 秒内搞定。

为什么需要专门的参数发现工具

你可能会说:我有 ffuf,我用 -v id=FUZZ 不也能 fuzz 参数吗?

能,但体验完全不同。

ffuf 是通用 fuzz 工具,你需要自己准备参数字典、自己处理请求方式(GET/POST/JSON/XML)、自己判断哪些响应差异代表”参数有效”。每次 fuzz 一个参数,都要发一个完整的请求。字典有 1000 个词,就发 1000 个请求。

Arjun 是专门的参数发现工具,它的工作方式不一样:

  1. 内置 25,890 个参数名(从 CommonCrawl 数据集 + SecLists + param-miner 词表合并而来)

  2. 采用二分查找策略,把参数分批塞进一个请求里

  3. 通过响应差异分析(response size / word count / line count 的变化)判断哪一批里包含了有效参数

  4. 递归缩小范围,最终精确定位每个有效参数

结果就是:25,890 个候选参数,只需要 50-60 个请求。

这不是”更快”的问题,这是”思路不同”的问题。ffuf 是一把万能瑞士军刀,Arjun 是一把专门开这把锁的钥匙。

安装

Arjun 是 Python 工具,一行命令安装:

pipx install arjun

老版本 Python 用 pip install arjun。

装完直接验证:

arjun -h

基础用法

最简单的场景——扫描一个 URL 的 GET 参数:

arjun -u https://api.example.com/v1/userinfo

就这么简单。Arjun 会自动用默认字典探测,输出所有找到的有效参数。

指定 HTTP 方法

默认探测 GET 参数。如果目标是 POST 接口:

arjun -u https://api.example.com/v1/login -m POST

支持的方法:GET、POST、JSON(POST JSON body)、XML(POST XML body)。

JSON 方式实战中用得很多,因为现在很多 API 都是 JSON 格式:

arjun -u https://api.example.com/v1/users -m JSON

导入和导出

批量扫描时,从文件导入目标:

arjun -i urls.txt

urls.txt 每行一个 URL。Arjun 能自动识别纯文本文件、Burp Suite 导出文件、原始 HTTP 请求文件。

导出结果到 JSON:

arjun -u https://api.example.com/v1/userinfo -oJ result.json

导出到纯文本:

arjun -u https://api.example.com/v1/userinfo -oT result.txt

导出到 Burp Suite(直接送进 Intruder 继续测试):

arjun -u https://api.example.com/v1/userinfo -oB127.0.0.1:8080

进阶用法

控制并发和速度

默认 2 线程。调高:

arjun -u https://api.example.com/v1/userinfo -t10

加延迟(自动降到单线程):

arjun -u https://api.example.com/v1/userinfo -d2

保守模式(单线程 + 6-12 秒随机延迟,不容易被 WAF 拦截):

arjun -u https://api.example.com/v1/userinfo –stable

精确控制速率:

arjun -u https://api.example.com/v1/userinfo –ratelimit2

自定义请求头

带 Cookie 或 Token 扫描需要认证的接口:

arjun -u https://api.example.com/v1/dashboard –headers”Cookie: session=abc123\nAuthorization: Bearer token_xxx”

不带任何参数直接敲 --headers,会打开默认编辑器(nano),把请求头粘进去,Ctrl+S 保存。

指定注入位置

JSON 和 XML 模式下,可以指定参数注入的精确位置:

arjun -u https://api.example.com/v1/data -m JSON –include'{“root”:{“a”:”b”,$arjun$}}’

$arjun$ 是占位符,Arjun 会在这里逐个插入候选参数名。

XML 模式同理:

arjun -u https://api.example.com/v1/data -m XML –include’<?xml>$arjun$‘

控制批次大小

默认每次请求塞 500 个参数。如果目标 URL 长度有限制:

arjun -u https://api.example.com/v1/userinfo -c250

-c 10 就是每次只测 10 个参数,更隐蔽,但请求数会增多。

被动参数收集

不主动发请求探测,而是从 JavaScript 文件和外部数据源被动提取参数名:

arjun -u https://api.example.com/v1/userinfo –passive example.com

这会从 CommonCrawl、AlienVault OTX、Wayback Machine 收集 example.com 域名下出现过的参数名,再验证是否存在于目标端点。

用 --passive - 表示直接用目标 URL 的域名:

arjun -u https://api.example.com/v1/userinfo –passive –

自定义字典

默认字典够大了,但如果你有针对特定目标的字典:

arjun -u https://api.example.com/v1/userinfo -w custom_params.txt

内置三档字典可以直接用:

arjun -u https://api.example.com/v1/userinfo -w small arjun -u https://api.example.com/v1/userinfo -w medium arjun -u https://api.example.com/v1/userinfo -w large

五个实战场景

场景一:发现隐藏的特权参数

你拿到一个用户信息接口 /api/userinfo?id=123,正常返回基本资料。

arjun -u https://target.com/api/userinfo -m GET

输出:

[+] Valid parameter found: admin [+] Valid parameter found: include_deleted [+] Valid parameter found: verbose

试一下 ?id=123&admin=true——返回了完整的管理员级别数据,包括其他用户的手机号和身份证号。

这就是参数发现最直接的威力:开发者在后端写了 admin 参数的判断逻辑,只是前端没有暴露入口,不代表后端没有处理它。

场景二:JSON API 的隐藏字段发现

现代 API 大多是 JSON 格式:

arjun -u https://target.com/api/v2/orders -m JSON

可能发现 includeinternalnotes、showcostprice、expand=customer 这些参数。传进去之后,API 返回的 JSON 里可能多了内部备注、成本价、客户详细信息。

场景三:配合管道构建侦察链路

Arjun 的输出可以无缝接入后续工具:

第一步:用 gau 收集历史 URL

echo”target.com” | gau | grep”api” > api_urls.txt

第二步:用 httpx 验证存活

cat api_urls.txt | httpx -silent-mc200-o live_apis.txt

第三步:用 Arjun 批量发现隐藏参数

arjun -i live_apis.txt -m GET -oT hidden_params.json

第四步:用 qsreplace 把发现的参数拼回 URL,准备测试注入

cat hidden_params.json | jq -r’.[] | .url + “?” + .param + “=” + .value’ | qsreplace “test_value” | httpx -silent

这条链路从历史 URL 收集 → 存活验证 → 参数发现 → 注入测试准备,一气呵成。

场景四:调试参数和内部标记

很多开发者会在代码里留调试开关:

arjun -u https://target.com/api/search -m GET

可能找到 debug、trace、loglevel、showsql、benchmark 这些参数。

debug=true 可能返回详细的错误堆栈和内部路径;show_sql=true 可能直接在响应里返回执行的 SQL 语句。这些信息对后续攻击极有价值。

场景五:XML 接口的隐藏参数

少数系统(特别是传统企业系统)用 XML 格式:

arjun -u https://target.com/soap/endpoint -m XML –include’<?xml version="1.0"?>$arjun$‘

可能发现 verbose、includeRawData、bypassCache 等参数。

Arjun 的工作原理

理解 Arjun 的核心思路,有助于在实战中更好地使用它。

Arjun 用的是二分查找 + 响应差异分析的组合策略:

  1. 把 25,890 个参数名分成若干批次(默认每批 500 个)

  2. 对每个批次,构造一个请求,把所有参数名都带上,值设为随机字符串

  3. 发送请求,记录响应的 size / word count / line count

  4. 和一个”不带任何额外参数”的基线请求做对比

  5. 如果某个批次的响应和基线不同,说明这个批次里至少有一个有效参数

  6. 对这个批次递归二分,最终精确定位到每个有效参数

这就是为什么 25,890 个候选只需要 50-60 个请求——它不是暴力逐个测试,而是用信息论的思路高效缩小范围。

注意事项

1. 被动模式很值得用

--passive 不发送额外探测请求,完全从公开数据源收集参数名。在实际测试中,被动模式经常能找到一些默认字典里没有的、目标特有的参数名。建议主动扫描和被动扫描都跑一遍。

2. 注意响应差异的干扰

有些服务器对不同的请求返回不同长度的响应,但不是因为参数有效,而是时间戳、随机 token 之类的动态内容。Arjun 有内置的去噪机制,但不是 100% 准确。遇到误报时,可以:

🔹 降低并发(-t 1)

🔹 加延迟(-d 2 或 --stable)

🔹 手动验证可疑参数

3. JSON/XML 模式下的 –include 很关键

很多 API 不接受额外的未知字段,但如果你在正确的 JSON 结构里插入参数,后端可能会处理。--include 让你精确控制注入位置,大幅提高发现率。

4. 和 ffuf 不冲突,而是互补

ffuf 适合 fuzz 参数值(已知参数名,测试不同的值),Arjun 适合发现参数名(不知道有哪些参数)。两者配合使用效果最好:

先用 Arjun 发现参数名

arjun -u https://target.com/api/search -oT params.txt

再用 ffuf fuzz 参数值

ffuf-u”https://target.com/api/search?id=FUZZ”-w values.txt -mc200

5. 认证接口的扫描

对于需要登录的接口,一定要带认证信息:

arjun -u https://target.com/api/profile –headers”Cookie: session_id=xxx”-m GET

未认证状态和已认证状态下,后端接受的参数可能完全不同。已认证状态下往往有更多隐藏参数(因为后端假设你是可信用户)。

本文所有内容仅供安全研究和授权测试使用。未经授权对他人系统进行参数探测可能违反法律法规。请始终在获得书面授权的前提下使用本工具。

关注我,持续不断地成长!

往期推荐:

【工具学习13】Impacket 工具实战教程(一)

【工具学习14】Impacket 工具实战教程(二)

【工具学习15】Impacket 工具实战教程(三)

【工具学习16】Impacket 工具实战教程(四)

【工具学习17】Impacket 工具实战教程(五)

【工具学习18】Impacket 工具实战教程(六)

【工具学习19】httpx  迅速定位真正存活的 HTTP 服务

【工具学习20】NetExec 内网渗透实战教程

【工具学习21】Subfinder :12000 Star 的被动子域名侦察利器

【工具学习22】RustScan :3秒扫完65535端口

【工具学习23】BloodHound:一条路径从普通域用户到Domain Admin

【工具学习24】BloodHound进阶(二):Cypher查询与三条深度攻击路径

【工具学习25】ligolo-ng:让内网像直连一样打


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。

本文转载自:逆熵寻生 CabinQ CabinQ《【工具学习27】Arjun:帮你找到了藏起来的第25890个参数》

评论:0   参与:  0