【工具学习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 是专门的参数发现工具,它的工作方式不一样:
-
内置 25,890 个参数名(从 CommonCrawl 数据集 + SecLists + param-miner 词表合并而来)
-
采用二分查找策略,把参数分批塞进一个请求里
-
通过响应差异分析(response size / word count / line count 的变化)判断哪一批里包含了有效参数
-
递归缩小范围,最终精确定位每个有效参数
结果就是: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\
Authorization: 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>
控制批次大小
默认每次请求塞 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\"?>
可能发现 verbose、includeRawData、bypassCache 等参数。
Arjun 的工作原理
理解 Arjun 的核心思路,有助于在实战中更好地使用它。
Arjun 用的是二分查找 + 响应差异分析的组合策略:
-
把 25,890 个参数名分成若干批次(默认每批 500 个)
-
对每个批次,构造一个请求,把所有参数名都带上,值设为随机字符串
-
发送请求,记录响应的 size / word count / line count
-
和一个\"不带任何额外参数\"的基线请求做对比
-
如果某个批次的响应和基线不同,说明这个批次里至少有一个有效参数
-
对这个批次递归二分,最终精确定位到每个有效参数
这就是为什么 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
未认证状态和已认证状态下,后端接受的参数可能完全不同。已认证状态下往往有更多隐藏参数(因为后端假设你是可信用户)。
本文所有内容仅供安全研究和授权测试使用。未经授权对他人系统进行参数探测可能违反法律法规。请始终在获得书面授权的前提下使用本工具。
关注我,持续不断地成长!
往期推荐:
*【工具学习19】httpx 迅速定位真正存活的 HTTP 服务*
*【工具学习21】Subfinder :12000 Star 的被动子域名侦察利器*
*【工具学习22】RustScan :3秒扫完65535端口*
*【工具学习23】BloodHound:一条路径从普通域用户到Domain Admin*
*【工具学习24】BloodHound进阶(二):Cypher查询与三条深度攻击路径*
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论