当前位置: 首页 > news >正文

xray高级扫描:自定义HTTP请求头与Cookie配置实战指南

1. 项目概述:为什么需要自定义请求头与Cookie

在安全测试的日常工作中,我们常常会遇到一些“特殊”的目标。它们可能部署了WAF(Web应用防火墙),对扫描器的默认指纹进行拦截;或者应用本身存在复杂的会话管理逻辑,需要携带特定的认证信息才能访问核心功能。这时候,如果你还只是用xray的基础爬虫模式,大概率会无功而返,要么被疯狂拦截,要么只能扫描到一堆登录页面。这就是“xray高级扫描模式:自定义HTTP请求头与Cookie配置”这个主题的核心价值所在——它让你从被动的“盲扫”转变为主动的、高度定制化的“精准探测”。

简单来说,这个模式允许你像真正的浏览器或一个已登录用户那样,向目标发送请求。你可以定义User-Agent来伪装成Chrome或移动端浏览器,绕过一些基础的设备指纹检测;可以添加Authorization头来测试API接口的认证漏洞;而最关键的,莫过于配置Cookie。很多漏洞,比如越权访问、敏感信息泄露,都隐藏在需要登录后才能访问的页面或接口里。没有正确的Cookie,扫描器连门都进不去,更别提发现漏洞了。因此,掌握这项配置,是让你的xray从“玩具”升级为“专业工具”的关键一步。无论你是安全工程师、渗透测试人员,还是对应用安全感兴趣的开发者,理解并熟练运用这个功能,都能极大提升你发现深层安全问题的能力。

2. 核心思路与配置逻辑拆解

2.1 高级扫描模式的设计哲学

xray的高级扫描模式,其设计核心在于“将控制权交还给测试者”。基础爬虫模式更像一个全自动的探索机器人,它遵循标准的Web协议和常见的爬虫逻辑去发现链接。但在真实的、复杂的网络应用面前,这种标准化行为很容易被识别和限制。高级模式则提供了一个“指令注入”接口,让你能告诉xray:“请按照我指定的方式,去访问这个目标。”

这背后的逻辑是分层递进的。首先,你需要一个有效的入口点,这通常是一个完整的HTTP请求数据包。其次,你需要定义这个请求的“身份”和“状态”,这就是请求头和Cookie扮演的角色。最后,你需要指定扫描的策略和深度。整个配置过程,就是模拟一次真实用户会话的建立和后续操作。理解这一点至关重要,它意味着你的配置质量直接决定了扫描的覆盖面和有效性。一个配置得当的扫描任务,其请求流应该与一个真实用户在浏览器中的操作流高度相似。

2.2 配置载体的选择:YAML文件

xray通过一个YAML格式的配置文件来承载这些高级指令。选择YAML而非命令行参数,是因为其结构清晰、可读性强,能很好地表达复杂的嵌套关系。一个典型的高级扫描配置主要包含以下几个顶层模块:

  • http: 定义HTTP相关的全局配置,如代理、线程池等。
  • plugins: 启用或禁用特定的漏洞检测插件。
  • mitm: 中间人代理相关的设置,用于流量拦截和修改(在被动扫描中常用)。
  • 而我们关注的核心——扫描任务定义,则通过一个独立的配置文件或直接在命令行中指定,其结构同样遵循YAML格式,核心是定义requests序列。

你需要新建一个.yaml.yml文件,例如adv_scan_config.yaml。所有后续的自定义操作都将在这个文件里完成。记住,YAML对缩进非常敏感,必须使用空格(通常为2个空格),而不能使用Tab键,否则解析会失败。

2.3 请求头与Cookie的作用域与优先级

在配置之前,必须理清作用域的概念。配置可以存在于两个层面:

  1. 全局/扫描器级别: 在xray的主配置文件config.yaml中,可以设置一些默认的HTTP头,这些头会附加到xray发出的所有请求上。这适用于一些通用设置,比如你想让所有请求都使用某个特定的User-Agent。
  2. 任务/请求级别: 在我们为本次高级扫描创建的独立任务配置文件中,为每一个具体的request模块设置请求头和Cookie。这里的配置优先级最高,会覆盖全局配置。

对于一次定向深度测试,我们几乎总是在任务级别进行配置。因为不同的请求可能需要不同的Cookie(例如,测试管理员功能和用户功能需要不同的会话),或者需要动态修改头信息。任务级别的配置提供了最大的灵活性。

3. 自定义HTTP请求头实战详解

3.1 基础结构:从捕获一个请求开始

一切自定义的起点,都是一个完整的、有效的原始HTTP请求。最推荐的方式是使用Burp Suite这类代理工具。具体操作是:用浏览器正常访问目标网站,完成登录等必要操作,然后打开开发者工具(F12)的“网络(Network)”标签,或者通过Burp Suite的代理历史,找到你对目标功能点的请求。右键复制这个请求为“Copy as cURL”或“Copy as Raw”。后者会给你一个完整的请求报文。

例如,一个获取用户个人资料的请求原始数据可能如下:

GET /api/v1/user/profile HTTP/1.1 Host: target.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Connection: close Accept: application/json, text/plain, */* Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... X-Custom-Token: some_secret_value Cookie: session_id=abc123def456; csrf_token=xyz789

我们的目标,就是将这个原始请求,准确地“翻译”成xray高级扫描配置中的YAML格式。

3.2 YAML配置语法解析

在任务配置文件中,核心是一个名为requests的列表,列表中的每个元素代表一个要发送的请求或一组请求。每个请求的基本结构如下:

requests: - raw: - | GET /api/v1/user/profile HTTP/1.1 Host: target.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... X-Custom-Token: some_secret_value Cookie: session_id=abc123def456; csrf_token=xyz789

注意raw字段下的字符串,它使用了YAML的“字面块标量”语法(|),可以保留换行符。你需要把复制出来的原始请求,从请求行(GET /path ...)开始,到最后一个请求头结束,完整地粘贴进去。不要包含请求体(如果有的话)的空行之后的部分,请求体需要用单独的body字段配置。

注意Host头在原始请求中是必须的,但在xray的raw格式中,它主要用来构造请求。实际发送时,xray会使用你在命令行中指定的目标URL(--url参数)或基础URL(--basic-crawler参数)来覆盖或确定最终的主机。确保这里不矛盾即可。

3.3 关键请求头的配置与伪装技巧

除了从原始请求中复制,我们经常需要手动添加或修改一些关键请求头,以绕过防御或触发特定逻辑。

  1. User-Agent: 这是最基础的指纹。一些简单的WAF或风控策略会拦截默认的扫描器UA(如包含xrayGo-http-client等)。

    • 技巧: 准备几个常见的浏览器UA库,在配置中随机或轮流使用。例如,可以配置为最新的Chrome Windows版或iOS Safari版。
    • 配置示例: 直接在raw块中修改User-Agent头对应的值即可。
  2. X-Forwarded-For / X-Real-IP: 当目标应用部署在反向代理(如Nginx)之后时,它可能依赖这些头来获取客户端的真实IP。在某些场景下,伪造这些头可能用于IP绕过测试或影响某些日志、风控逻辑。

    • 注意: 这属于更深入的测试范畴,需谨慎使用,并明确测试目的。
  3. Content-Type: 当请求包含Body时,此头至关重要。例如测试SQL注入时,如果后端期望application/json,而你发送的是application/x-www-form-urlencoded,请求可能直接被拒绝。务必与原始请求或API文档保持一致。

  4. Authorization: 用于Bearer Token、Basic Auth等认证。这是访问受保护API的钥匙。Token需要从有效的登录响应中获取。

  5. 自定义头: 许多现代应用会使用自定义头,如X-CSRF-TokenX-Requested-With: XMLHttpRequestX-App-Version等。遗漏它们可能导致请求被视作非法。务必通过分析正常流量来收集这些头。

3.4 动态负载与迭代攻击

高级模式的强大之处在于支持动态内容。你可以在请求的Path、Header或Body中插入占位符{{变量名}},然后通过payloads字段为这些变量定义字典,xray会自动进行排列组合攻击。

requests: - raw: - | GET /api/user/{{id}}/info HTTP/1.1 Host: target.com User-Agent: Mozilla/5.0 X-Token: {{token}} payloads: id: [“admin”, “10001”, “10002”] token: [“token_a”, “token_b”]

这个配置会让xray发送 3 * 2 = 6 个请求,分别测试不同ID和Token的组合。这在测试水平越权(遍历用户ID)或尝试使用不同的认证令牌时非常有用。

4. Cookie配置的艺术与核心步骤

4.1 Cookie的获取与有效性维持

Cookie是维持HTTP会话状态的核心。配置Cookie的第一步是获取它。

  1. 浏览器开发者工具: 这是最直接的方法。登录目标系统后,F12打开开发者工具,进入“应用(Application)”或“存储(Storage)”标签,找到Cookies,选择对应的域名,即可看到所有Cookie键值对。你可以手动复制,但更高效的方法是:

    • 在“网络(Network)”标签中,找到任何一个发送到目标域的请求,在“请求头(Request Headers)”部分找到Cookie:这一行,直接复制整个值。
  2. 代理工具捕获: 使用Burp Suite或Fiddler等工具拦截流量,从拦截到的请求头中复制Cookie值。这种方式可以捕获到包含HttpOnly属性的Cookie(在浏览器JS中无法通过document.cookie访问)。

  3. 从登录响应中提取: 在自动化测试脚本中,通常通过模拟登录请求,从响应的Set-Cookie头中提取Cookie,并用于后续请求。在xray高级模式中,我们可以将登录请求也配置为一个request项,但处理响应并提取Cookie设置到后续请求中,需要更复杂的逻辑或结合其他脚本。

维持有效性: 会话Cookie通常有有效期。长时间扫描时,Cookie可能过期。有几种策略:

  • 缩短扫描时间: 针对核心功能进行快速、聚焦的扫描。
  • 使用长效Token: 如果目标系统支持,使用如JWT等刷新机制的长效令牌。
  • 准备多个账号: 在配置中准备多组Cookie,当一个失效时,可以切换另一组(通过payloads机制实现简单轮换)。

4.2 在YAML中配置Cookie

raw请求块中,Cookie通常以Cookie: name1=value1; name2=value2的形式存在于请求头中。你只需要将获取到的完整Cookie字符串粘贴到对应位置即可。

raw: - | GET /admin/dashboard HTTP/1.1 Host: target.com Cookie: session=eyJhbGciOiJIUzI1NiIs9; csrf_token=abcdef123456; user_role=admin

一个常见的坑: Cookie的值中可能包含特殊字符,如分号;、逗号,、等号=。在HTTP头中,分号是Cookie之间的分隔符。如果一个Cookie的值里包含了分号(例如某些序列化后的值),就必须对这个值进行URL编码,否则解析会出错。在粘贴前,检查一下Cookie值,如果看起来是乱码或包含%,那很可能已经是编码过的,不要再去动它;如果是明文且包含特殊字符,则需要考虑编码问题。

4.3 处理复杂认证与Session

许多系统不止依赖一个简单的sessionidCookie。认证流程可能更加复杂:

  1. 多Cookie协同: 如session用于会话保持,csrf_token用于防跨站请求伪造。两者必须同时存在且匹配,请求才有效。你必须同时捕获并配置它们。

  2. Cookie与Token混合认证: 某些API可能在Cookie中存放会话标识,同时在请求头(如AuthorizationX-Token)中存放访问令牌。两者缺一不可。

  3. 动态CSRF Token: 在一些表单提交场景,CSRF Token可能每次访问页面时都会变化。这种情况下,你需要先配置一个请求去获取包含新Token的页面,然后使用正则表达式或-等提取器从响应中提取Token,再将其设置到后续提交请求的Cookie或表单数据中。xray的高级模式支持这种“请求-提取-再请求”的链式操作,但这需要编写更复杂的配置,定义多个request并通过extractorsvariables关联。

对于大多数入门和中级场景,我们更常见的做法是:手动完成整个登录和获取Token/CSRF的过程,然后将稳定状态下的所有必要Cookie和请求头,一次性配置到扫描任务的raw请求中。这虽然不够“自动化”,但对于定向深度测试来说,是最可靠、最直接的方法。

5. 完整实战:从配置到扫描执行

5.1 编写一个完整的扫描任务配置文件

假设我们要对一个后台管理系统https://target.com/admin进行漏洞扫描,我们已经通过账号admin/password登录,并获取到了稳定的Cookie。下面是一个完整的admin_scan.yaml示例:

# admin_scan.yaml - 针对目标后台管理系统的深度扫描配置 requests: # 第一个请求:访问管理后台首页,用于爬虫发现链接 - raw: - | GET /admin/ HTTP/1.1 Host: target.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.9 Connection: close Cookie: admin_session=z5k7x9c1v3b8n0; admin_csrf=f7g8h9j0k1l2 Upgrade-Insecure-Requests: 1 # 第二个请求:测试用户管理API(假设存在IDOR漏洞) - raw: - | GET /admin/api/user/{{user_id}} HTTP/1.1 Host: target.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Accept: application/json Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWRtaW4ifQ Cookie: admin_session=z5k7x9c1v3b8n0; admin_csrf=f7g8h9j0k1l2 X-Requested-With: XMLHttpRequest payloads: user_id: ["1", "2", "100", "1000", "../../../etc/passwd"] # 测试ID遍历和路径遍历 # 第三个请求:测试配置更新功能(POST请求,带Body) - raw: - | POST /admin/api/system/config HTTP/1.1 Host: target.com Content-Type: application/json Content-Length: 46 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Cookie: admin_session=z5k7x9c1v3b8n0; admin_csrf=f7g8h9j0k1l2 {"config_name":"{{key}}","config_value":"{{value}}"} payloads: key: ["site_title", "smtp_host", "debug_mode"] value: ["test\"};alert(1);//", "127.0.0.1 | whoami", "true"]

这个配置文件定义了三个请求模板。第一个是基础访问,让xray能够爬取/admin/下的链接。第二个和第三个使用了payloads进行模糊测试,分别针对用户查询接口和配置更新接口,测试越权和命令注入等漏洞。

5.2 启动xray并执行高级扫描

准备好配置文件后,使用以下命令启动扫描:

./xray_linux_amd64 webscan --url https://target.com/admin --plugins xss, sqldet, dirscan --config admin_scan.yaml

命令解释:

  • ./xray_linux_amd64: 你的xray可执行文件。
  • webscan: 启动Web漏洞扫描模块。
  • --url https://target.com/admin: 指定扫描的基础URL。注意,这里指定的URL会与配置文件中raw请求的路径进行拼接。如果raw请求中是绝对路径(以/开头),则直接使用此路径;如果是相对路径,则相对于--url
  • --plugins xss,sqldet,dirscan: 指定要启用的漏洞检测插件。为了提升扫描效率,建议只开启与目标可能相关的插件。例如,对JSON API可能不需要xss插件,但需要sqldetpath-traversal
  • --config admin_scan.yaml:关键参数,指定我们编写的高级扫描任务配置文件。

执行后,xray会读取admin_scan.yaml中的requests列表,按照定义发送请求,并根据payloads展开所有组合,同时使用指定的插件对每一个请求及其响应进行漏洞检测。

5.3 结果分析与报告解读

扫描结束后,xray会生成报告。在高级扫描模式下,你需要特别关注:

  1. 请求与漏洞的对应关系: 报告中每个漏洞都会关联到触发它的具体HTTP请求。点击查看详情,确认这个请求是否是你配置的某个raw请求模板的实例。这能帮你判断漏洞是在哪个测试点(哪个接口、哪个参数)被触发的。

  2. 误判分析: 由于你配置的请求可能带有高权限Cookie或特殊头,扫描器可能会访问到普通用户看不到的页面,从而报告一些“敏感信息泄露”漏洞(如目录列表、备份文件)。这些需要人工复核,判断其真实风险。

  3. 漏报分析: 如果预期中的漏洞没有扫出来,需要排查:

    • Cookie/Token是否已过期?检查扫描过程中的错误日志,是否有大量的403、401状态码。
    • 请求是否成功到达了目标接口?查看xray的“扫描中”输出,或使用--log-level debug参数运行,观察实际发出的请求和收到的响应。
    • 插件是否启用?确认命令行中启用了对应的漏洞检测插件。
    • Payload是否被正确应用?检查payloads部分的语法,以及生成的请求URL/Header/Body是否正确。

6. 高级技巧与疑难问题排查

6.1 处理登录与Session维护自动化

对于需要先登录的场景,虽然可以在配置文件中硬编码Cookie,但更自动化的方式是编写一个前置的登录请求。这需要处理Cookie的自动传递。xray的高级模式支持通过session属性来实现简单的会话保持。在一个request中,可以设置session: true,xray会自动保存这个请求响应中的Set-Cookie头,并将其应用到后续所有设置了session: true的请求中。

但是,对于复杂的登录流程(如需要先获取CSRF Token,再提交表单),使用单个YAML文件配置会变得非常复杂且难以维护。我的个人经验是,对于复杂的认证流程,更推荐使用Python等脚本语言配合requests库模拟登录,将获取到的稳定Cookie提取出来,再动态写入到xray的扫描配置模板中,或者直接使用xray的HTTP API启动扫描。这样逻辑更清晰,也便于调试。

6.2 绕过WAF与风控的请求头组合策略

面对严格的WAF,仅靠修改User-Agent是不够的。你需要构建一个看起来完全合法的请求指纹集:

  1. 完整性: 确保请求包含目标浏览器通常发送的所有头,如AcceptAccept-LanguageAccept-EncodingConnectionUpgrade-Insecure-Requests(对于HTTPS到HTTP的跳转)、Sec-Fetch-*系列头(现代浏览器会发送)等。
  2. 顺序性: 一些WAF会检查请求头的顺序。虽然不常见,但如果遇到问题,可以尝试调整头的顺序,使其与浏览器发送的顺序一致。Burp Suite的“Copy as Raw”功能会保留顺序。
  3. 速率限制: 在配置文件中,可以通过-字段(虽然更常用于设置间隔)来控制请求速率,避免触发基于频率的风控。在http全局配置中也可以设置max_qps

6.3 常见错误与排查清单

  • 错误:invalid yaml format

    • 原因: YAML语法错误,最常见的是缩进使用了Tab键,或者字符串格式不正确。
    • 排查: 使用在线的YAML校验工具检查配置文件。确保缩进是空格,raw块下的多行字符串正确使用了|
  • 错误:扫描器发送的请求返回大量403/401

    • 原因: Cookie或认证Token失效、错误或格式不对。
    • 排查
      1. 手动用浏览器或curl命令,使用配置文件中的相同Cookie和头,访问目标URL,确认是否能成功。
      2. 检查Cookie值中是否有未编码的特殊字符(如分号、逗号)。
      3. 确认认证头(如Authorization)的格式正确(例如Bearer后面有空格)。
  • 错误:扫描器似乎没有使用我配置的Payload

    • 原因: Payload占位符{{变量名}}书写错误,或payloads字典的键名与占位符不匹配。
    • 排查: 开启调试日志--log-level debug,查看xray解析配置文件后实际构造的请求是什么样子。确认占位符被正确替换。
  • 问题:扫描速度太慢

    • 原因: 可能启用了过多插件,或者payloads组合爆炸导致请求量巨大。
    • 优化
      1. 在命令行中通过--plugins精准指定需要的插件。
      2. 合理设计payloads,避免不必要的笛卡尔积。有时可以拆分成多个配置文件分批扫描。
      3. 调整http配置中的max_parallel(最大并行数)和max_qps(每秒最大请求数),找到速度和稳定性的平衡点。

6.4 与被动扫描联动

高级扫描模式是主动扫描。你还可以将其与xray的被动扫描模式联动。首先,启动xray的被动扫描代理:

./xray_linux_amd64 webscan --listen 127.0.0.1:7777

然后,配置你的浏览器或Burp Suite等工具,将代理指向127.0.0.1:7777。接着,手动在浏览器中完成复杂的登录和多步骤操作。xray会记录下所有经过代理的HTTP请求。之后,你可以将这些请求导出为HAR格式或直接复制为Raw请求,再整合到你的高级扫描配置文件中。这种方式结合了人工探索的灵活性和自动化测试的深度,尤其适用于业务流程复杂、状态依赖强的Web应用。

掌握自定义HTTP请求头与Cookie配置,本质上是掌握了让扫描器“拟人化”访问目标系统的能力。这不再是漫无目的的爬取,而是带着明确身份和意图的深度探测。每一次配置,都是你对目标应用访问逻辑的一次深刻理解。从捕获第一个有效的认证请求开始,到构建出覆盖关键功能点的测试用例集,这个过程本身就是一个优秀的安全测试人员必备的技能。

http://www.jsqmd.com/news/1105280/

相关文章:

  • Sqlmap实战指南:自动化SQL注入检测与MSSQL/MySQL漏洞防御
  • hpcpilot安全配置指南:防火墙、SELinux和免密登录配置
  • HandheldCompanion:Windows掌机游戏体验的智能一体化解决方案
  • 大端堆排序算法
  • Anthropic推理架构‘零层’革命:蒸发中间层实现196ms超低延迟
  • GPT-4o技术深度解析:多模态实时交互与工程落地指南
  • GPT-4稀疏激活机制解析:1.8万亿参数如何实现2%动态路由
  • 抖音批量下载终极指南:3分钟学会无水印视频智能管理
  • Web应用安全Header实战配置:从CSP到HSTS的7个关键防线
  • 从HTTPS到全链路加密:实战部署指南与核心价值解析
  • Session与Cookie实战:从原理到响应解密,打通前后端状态管理
  • 国密SM4算法实战:从原理到资源包封装与安全集成指南
  • 好用还专业!2026 最新降AIGC工具测评与推荐
  • 嘎嘎降AI和率零哪个好?花200块实测毕业论文降AI对比结果让我意外
  • Codex开发辅助工具:从安装配置到实战落地的完整指南
  • 解决Windows软件运行库缺失的终极方案:VisualCppRedist AIO的4步高效使用指南
  • 2026年知网AIGC检测过不去?踩了20次坑后用这5招把论文AI率压到4%以下
  • DeepSeek上下文磁盘缓存:让LLM输入复用降本90%
  • Agentic智能文档摘要系统:目标驱动、可审计、可干预的AI助理架构
  • Xamarin.Android项目中用C#直接跑FFmpeg命令做视频转码的实操工程
  • 提示工程不是写提示词,而是构建人机协作协议
  • 7-Zip免费压缩软件终极指南:三步实现高效文件管理
  • Web安全实战:从原理到防御,深入理解SQL注入与XSS攻击
  • AES-NI硬件加速实现AES-256-CFB加密与OpenSSL验证实战
  • Samba混合架构解析:SSM与滑动窗口注意力的工程级协同
  • Mythos能力跃迁:大模型网状推理与跨文档验证技术解析
  • DeepSeek-V4预览版深度解析:长上下文推理的稀疏注意力突破
  • Java Web电商后台实战包:含登录注册、商品管理、购物车与订单全流程源码+分章视频
  • Anthropic归零层:消除大模型语义缓冲带,实现确定性输出
  • Java API安全实战:从认证授权到防重放攻击的完整防护体系