【渗透工具系列】极其快速的参数枚举工具Arjun
作者:FancyPig | 发布时间: | 更新时间:
相关阅读
视频讲解
通常在做渗透测试时,我们想要知道一个API接口都有哪些参数,然而普通的模糊测试可能会导致发送请求数量巨大、而且产生的效果也不是很好,因此就有了Arjun这个工具,本质上它通过二分查找的思路,逐步筛选返回长度不一致的参数,多个参数同时请求,直到最终筛选出准确的参数。该工具可以帮助我们在获取到API端点后进行参数的模糊测试,本身支持了25000的字典,如果不够用您还可以使用自己更大的字典……
图文讲解
安装教程
我们先下载该项目
git clone https://github.com/s0md3v/Arjun.git
然后进入项目路径,进行安装
cd Arjun
setup.py
以上安装方式适用性较广,如果您使用的是Ubuntu、Debian Linux环境,您可以直接使用下面命令一键安装
sudo apt install arjun

使用教程
我们如果想针对某一个API接口进行参数枚举,可以输入下面的命令
http://127.1:5000/修改为你要扫描的API端点路径
arjun -u http://127.1:5000/
可以看到我们这里发现了flag参数

当发现参数之后,你可以使用curl命令或者直接打开浏览器进行验证

代理模式
如果我们想要进一步研究,在刚刚输入命令的背后,到底发送了哪些请求?我们可以使用代理方式将请求传递到burpsuite中
HTTP_PROXY=http://127.1:8080/ arjun -u http://127.1:5000/

然后,我们就可以在burpsuite中看到每一次请求的情况了



可以发现其实这里用到了二分查找的思路,当我们发现响应长度不一致时,我们可以丢弃另一半,然后在对现在URL的参数进行二分。




最终只剩下我们要寻找的参数(当然如果有多个参数也是可以支持的)

支持GET/POST请求 JSON/XML格式
我们可以使用-m来调整请求方式

譬如我们想看下POST请求的参数
arjun -u http://127.1:5000/ -m POST

当然,我们也可以支持JSON格式的请求
arjun -u http://127.1:5000/ -m JSON


被动模式
你可以使用本身自带的参数实现被动模式,-oB参数
arjun -u http://127.1:5000/ -oJ json -oT file -oB '127.1:8080'


详细的使用说明
扫描单个 URL
选项:-u
针对单个 URL 运行 Arjun。
arjun -u https://api.example.com/endpoint
指定 HTTP 方法
选项:-m
Arjun 默认查找GET方法的参数。所有可用的方法是:GET/POST/JSON/XML
arjun -u https://api.example.com/endpoint -m POST
导入目标
选项:-i
Arjun 支持从 BurpSuite、简单文本文件和原始请求文件导入目标。Arjun 可以自动识别输入文件的类型,所以你只需要指定路径。
arjun -i targets.txt
注意:在 Burp Suite 中导出项目时取消选中“base64”选项。
导出结果
选项:-oJ/-oB/-oT
您可以使用相应的选项将结果导出到 BurpSuite 或 txt/JSON 文件。
arjun -u https://api.example.com/endpoint -oJ result.json
-oJ result.json
-oT result.txt
-oB 127.0.0.1:8080
指定注入点
JSON默认情况下,Arjun 可以在使用或XML方法参数时检测指定位置的参数。所有可用的方法是:GET/POST/JSON/XML
arjun -u https://api.example.com/endpoint -m JSON --include='{"root":{"a":"b",$arjun$}}'
或者
arjun -u https://api.example.com/endpoint -m XML --include='<?xml><root>$arjun$</root>'
多线程
选项:-t
Arjun 默认使用 2 个线程,但您可以根据您的网络连接和目标限额调整其性能。
arjun -u https://api.example.com/endpoint -t 10
请求之间的延迟
选项:-d
您可以使用该-d选项延迟请求,但它还会将线程数设置为1.
arjun -u https://api.example.com/endpoint -d 2
请求超时
选项:-T
您可以使用选项指定 HTTP 请求的超时时间-T,默认值为15。
arjun -u https://api.example.com/endpoint -T 10
处理速率限制
选项:--stable
--stable将线程数设置为1并在请求之间引入 6 到 12 秒的随机延迟。
arjun -u https://api.example.com/endpoint --stable
包括持久数据
选项:--include
假设您有一个 API 密钥,您需要随每个请求一起发送,以告诉 Arjun 这样做,您可以使用以下--include选项:
arjun -u https://api.example.com/endpoint --include 'api_key=xxxxx'
或者
arjun -u https://api.example.com/endpoint --include '{"api_key":"xxxxx"}'
要包含多个参数,请使用&分隔它们或将它们作为有效的 JSON 对象传递。
控制查询/块大小
选项:-c
默认情况下,Arjun 在请求中包含 500 个参数,有时会超过某些服务器的最大 URL 长度限制。-c您可以通过指定一次发送的参数数量来处理这种情况。
arjun -u https://api.example.com/endpoint -c 250
禁用重定向
选项:--disable-redirects
此开关将阻止 Arjun 遵循目标 URL 上的重定向。建议仅在您知道自己在做什么时才使用它。
arjun -u https://api.example.com/redirects_to_api2 --disable-redirects
从被动源收集参数名称
选项:--passive
您可以从 CommonCrawl、Open Threat Exchange 和 WaybackMachine 收集域(而非子域)的参数名称,并检查它们是否存在于您的目标上。
arjun https://api.example.com/endpoint --passive example.com
如果要使用目标 URL 中的域,请使用--passive -. 它仅适用于单个目标。
使用自定义 HTTP 标头
选项:--headers
您可以简单地从命令行添加自定义标头,分隔符\n如下:
arjun -u https://api.example.com/endpoint --headers "Accept-Language: en-US\nCookie: null"
使用--headers不带任何参数的选项将打开您的文本编辑器(默认为“nano”),您只需将 HTTP 标头粘贴到那里并按Ctrl + S保存即可。

注意:
nano用作Arjun提示的默认编辑器,但您可以通过调整/core/prompt.py.