文章总结: 本文介绍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 是专门的参数发现工具,它的工作方式不一样:
-
内置 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\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>
控制批次大小
默认每次请求塞 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
未认证状态和已认证状态下,后端接受的参数可能完全不同。已认证状态下往往有更多隐藏参数(因为后端假设你是可信用户)。
本文所有内容仅供安全研究和授权测试使用。未经授权对他人系统进行参数探测可能违反法律法规。请始终在获得书面授权的前提下使用本工具。
关注我,持续不断地成长!
往期推荐:
【工具学习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个参数》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。





![[中秋悦安]DataCon祝您中秋安康,岁岁长乐!](/images/random/titlepic/15.jpg)




评论