首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Arjun:高效的HTTP参数发现工具

Arjun:高效的HTTP参数发现工具

作者头像
qife122
发布2025-11-13 16:56:30
发布2025-11-13 16:56:30
650
举报

Arjun是一款专业的HTTP参数发现工具,能够快速识别URL端点中的查询参数。Web应用程序使用参数(或查询)来接受用户输入,例如:

代码语言:javascript
复制
http://api.example.com/v1/userinfo?id=751634589

这个URL似乎为特定用户ID加载用户信息,但如果存在一个名为admin的参数,当设置为True时,端点会提供更多用户信息呢?Arjun就是用来发现这类有效HTTP参数的工具,它拥有包含25,890个参数名的庞大默认字典。

最棒的是?完成这个庞大列表的扫描只需不到10秒,同时仅向目标发送50-60个请求。

功能特性

  • 多请求方法支持:支持GET、POST、POST-JSON、POST-XML请求
  • 智能异常检测:采用9因素异常检测算法,提高参数发现准确性
  • 速率限制处理:自动处理速率限制和超时问题
  • 多种导出格式:支持导出到BurpSuite、文本文件或JSON文件
  • 灵活的目标导入:可从BurpSuite、文本文件或原始请求文件导入目标
  • 被动参数收集:能够从JS文件或3个外部源被动提取参数
  • 启发式扫描:改进的启发式扫描器,可从JSON/文本响应中提取关键词
  • 参数大小写强制:支持参数命名风格强制转换
  • 稳定模式:处理速率限制的稳定开关

安装指南

推荐使用以下方式安装Arjun:

代码语言:javascript
复制
pipx install arjun

注意:如果使用旧版本Python,请使用pip代替pipx

系统要求

  • Python 3.4或更高版本
  • 依赖包:requests、dicttoxml、ratelimit

使用说明

基本用法

扫描单个URL:

代码语言:javascript
复制
arjun -u https://example.com/api/user

导入多个目标:

代码语言:javascript
复制
arjun -i targets.txt

保存输出到文件:

代码语言:javascript
复制
arjun -u https://example.com -o results.json

使用自定义HTTP头:

代码语言:javascript
复制
代码语言:javascript
复制
arjun -u https://example.com --headers "Authorization: Bearer token"

高级选项

代码语言:javascript
复制
# 设置请求方法
代码语言:javascript
复制
arjun -u https://example.com -m POST
代码语言:javascript
复制
# 设置并发线程数
代码语言:javascript
复制
arjun -u https://example.com -t 10
代码语言:javascript
复制
# 设置请求延迟
代码语言:javascript
复制
arjun -u https://example.com -d 1.5
代码语言:javascript
复制
# 设置块大小
代码语言:javascript
复制
arjun -u https://example.com -c 100
代码语言:javascript
复制
# 启用安静模式
代码语言:javascript
复制
arjun -u https://example.com -q
代码语言:javascript
复制
# 禁用重定向
代码语言:javascript
复制
arjun -u https://example.com --disable-redirects

核心代码

代码语言:javascript
复制
异常检测模块
def define(response_1, response_2, param, value, wordlist):
    """
    通过比较两个HTTP响应定义异常检测规则
    返回字典
    """
    factors = {
        'same_code': None,  # 如果HTTP状态码相同,包含该状态码
        'same_body': None,  # 如果HTTP正文相同,包含该正文
        'same_plaintext': None,  # 如果HTTP正文不同但去除HTML后相同,包含非HTML文本
        'lines_num': None,  # 如果HTTP正文行数相同,包含该数字
        'lines_diff': None,  # 如果HTTP正文或纯文本不同且超过两行,包含哪些行相同
        'same_headers': None,  # 如果头部相同,包含这些头部
        'same_redirect': None,  # 如果两个请求以类似方式重定向,包含该重定向
        'param_missing': None,  # 如果参数名从正文中缺失,包含已存在的单词
        'value_missing': None  # 包含参数值是否从正文中缺失
    }
代码语言:javascript
复制
请求处理模块
@sleep_and_retry
@limits(calls=mem.var['rate_limit'], period=1)
def requester(request, payload={}):
    """
    用于发起HTTP请求的核心函数
    出错时返回字符串,否则返回requests库的响应对象
    """
    if request.get('include') and len(request.get('include', '')) != 0:
        payload.update(request['include'])
    if mem.var['stable']:
        mem.var['delay'] = random.choice(range(3, 10))
    time.sleep(mem.var['delay'])

    try:
        if request['method'] == 'GET':
            response = requests.get(url,
                params=payload,
                headers=request['headers'],
                verify=False,
                allow_redirects=False,
                timeout=mem.var['timeout'],
            )
        # 处理JSON、XML和POST请求...
        return response
    except Exception as e:
        return str(e)
代码语言:javascript
复制
启发式扫描模块
def heuristic(raw_response, wordlist):
    """
    启发式扫描函数,从响应中提取潜在参数
    返回发现的参数列表和是否存在单词的标志
    """
    words_exist = False
    potential_params = []
    headers, response = raw_response.headers, raw_response.text

    # 解析输入字段
    input_names = re_inputs.findall(response)
    potential_params += input_names

    # 解析脚本
    for script in extract_js(response):
        empty_vars = re_empty_vars.findall(script)
        potential_params += empty_vars
        map_keys = re_map_keys.findall(script)
        potential_params += map_keys

    return list(found), words_exist
代码语言:javascript
复制
参数大小写转换
def covert_to_case(string, delimiter, casing):
    """
    处理输入字符串并转换为指定大小写风格
    返回转换后的字符串
    """
    parts = handle(string)
    return transform(parts, delimiter, casing)

def detect_casing(string):
    """
    检测给定字符串的大小写风格和分隔符
    返回分隔符和大小写风格
    """
    delimiter = ""
    casing = ""

    if string.islower():
        casing = "l"
    elif string.isupper():
        casing = "u"
    else:
        casing = casing = "c" if string[0].islower() else "p"

    return delimiter, casing

技术特点

Arjun采用先进的异常检测算法,通过9个因素比较HTTP响应来识别有效参数。

其智能的速率限制处理和错误重试机制确保在复杂网络环境下的稳定运行。

工具还具备被动参数收集功能,可从CommonCrawl、Wayback Machine和AlienVault OTX等外部源获取参数信息。

参数名称词表是通过从CommonCrawl数据集中提取顶级参数名,并将SecLists和param-miner词表中的最佳单词合并而成,确保了扫描的全面性和准确性。

测试使用

如下所示,检测下面两个url的endpoint可能带的查询参数,发现带有参数id:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全技术点滴分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 功能特性
  • 安装指南
  • 使用说明
    • 基本用法
    • 高级选项
  • 核心代码
  • 技术特点
  • 测试使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档