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

📅 2026/7/1 22:50:42
xray高级扫描:自定义HTTP请求头与Cookie配置实战指南
1. 项目概述为什么需要自定义请求头与Cookie在安全测试的日常工作中我们常常会遇到一些“特殊”的目标。它们可能部署了WAFWeb应用防火墙对扫描器的默认指纹进行拦截或者应用本身存在复杂的会话管理逻辑需要携带特定的认证信息才能访问核心功能。这时候如果你还只是用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的作用域与优先级在配置之前必须理清作用域的概念。配置可以存在于两个层面全局/扫描器级别 在xray的主配置文件config.yaml中可以设置一些默认的HTTP头这些头会附加到xray发出的所有请求上。这适用于一些通用设置比如你想让所有请求都使用某个特定的User-Agent。任务/请求级别 在我们为本次高级扫描创建的独立任务配置文件中为每一个具体的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;q0.9,en;q0.8 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... X-Custom-Token: some_secret_value Cookie: session_idabc123def456; csrf_tokenxyz789我们的目标就是将这个原始请求准确地“翻译”成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_idabc123def456; csrf_tokenxyz789注意raw字段下的字符串它使用了YAML的“字面块标量”语法|可以保留换行符。你需要把复制出来的原始请求从请求行GET /path ...开始到最后一个请求头结束完整地粘贴进去。不要包含请求体如果有的话的空行之后的部分请求体需要用单独的body字段配置。注意Host头在原始请求中是必须的但在xray的raw格式中它主要用来构造请求。实际发送时xray会使用你在命令行中指定的目标URL--url参数或基础URL--basic-crawler参数来覆盖或确定最终的主机。确保这里不矛盾即可。3.3 关键请求头的配置与伪装技巧除了从原始请求中复制我们经常需要手动添加或修改一些关键请求头以绕过防御或触发特定逻辑。User-Agent 这是最基础的指纹。一些简单的WAF或风控策略会拦截默认的扫描器UA如包含xray、Go-http-client等。技巧 准备几个常见的浏览器UA库在配置中随机或轮流使用。例如可以配置为最新的Chrome Windows版或iOS Safari版。配置示例 直接在raw块中修改User-Agent头对应的值即可。X-Forwarded-For / X-Real-IP 当目标应用部署在反向代理如Nginx之后时它可能依赖这些头来获取客户端的真实IP。在某些场景下伪造这些头可能用于IP绕过测试或影响某些日志、风控逻辑。注意 这属于更深入的测试范畴需谨慎使用并明确测试目的。Content-Type 当请求包含Body时此头至关重要。例如测试SQL注入时如果后端期望application/json而你发送的是application/x-www-form-urlencoded请求可能直接被拒绝。务必与原始请求或API文档保持一致。Authorization 用于Bearer Token、Basic Auth等认证。这是访问受保护API的钥匙。Token需要从有效的登录响应中获取。自定义头 许多现代应用会使用自定义头如X-CSRF-Token、X-Requested-With: XMLHttpRequest、X-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的第一步是获取它。浏览器开发者工具 这是最直接的方法。登录目标系统后F12打开开发者工具进入“应用(Application)”或“存储(Storage)”标签找到Cookies选择对应的域名即可看到所有Cookie键值对。你可以手动复制但更高效的方法是在“网络(Network)”标签中找到任何一个发送到目标域的请求在“请求头(Request Headers)”部分找到Cookie:这一行直接复制整个值。代理工具捕获 使用Burp Suite或Fiddler等工具拦截流量从拦截到的请求头中复制Cookie值。这种方式可以捕获到包含HttpOnly属性的Cookie在浏览器JS中无法通过document.cookie访问。从登录响应中提取 在自动化测试脚本中通常通过模拟登录请求从响应的Set-Cookie头中提取Cookie并用于后续请求。在xray高级模式中我们可以将登录请求也配置为一个request项但处理响应并提取Cookie设置到后续请求中需要更复杂的逻辑或结合其他脚本。维持有效性 会话Cookie通常有有效期。长时间扫描时Cookie可能过期。有几种策略缩短扫描时间 针对核心功能进行快速、聚焦的扫描。使用长效Token 如果目标系统支持使用如JWT等刷新机制的长效令牌。准备多个账号 在配置中准备多组Cookie当一个失效时可以切换另一组通过payloads机制实现简单轮换。4.2 在YAML中配置Cookie在raw请求块中Cookie通常以Cookie: name1value1; name2value2的形式存在于请求头中。你只需要将获取到的完整Cookie字符串粘贴到对应位置即可。raw: - | GET /admin/dashboard HTTP/1.1 Host: target.com Cookie: sessioneyJhbGciOiJIUzI1NiIs9; csrf_tokenabcdef123456; user_roleadmin一个常见的坑 Cookie的值中可能包含特殊字符如分号;、逗号,、等号。在HTTP头中分号是Cookie之间的分隔符。如果一个Cookie的值里包含了分号例如某些序列化后的值就必须对这个值进行URL编码否则解析会出错。在粘贴前检查一下Cookie值如果看起来是乱码或包含%那很可能已经是编码过的不要再去动它如果是明文且包含特殊字符则需要考虑编码问题。4.3 处理复杂认证与Session许多系统不止依赖一个简单的sessionidCookie。认证流程可能更加复杂多Cookie协同 如session用于会话保持csrf_token用于防跨站请求伪造。两者必须同时存在且匹配请求才有效。你必须同时捕获并配置它们。Cookie与Token混合认证 某些API可能在Cookie中存放会话标识同时在请求头如Authorization或X-Token中存放访问令牌。两者缺一不可。动态CSRF Token 在一些表单提交场景CSRF Token可能每次访问页面时都会变化。这种情况下你需要先配置一个请求去获取包含新Token的页面然后使用正则表达式或-等提取器从响应中提取Token再将其设置到后续提交请求的Cookie或表单数据中。xray的高级模式支持这种“请求-提取-再请求”的链式操作但这需要编写更复杂的配置定义多个request并通过extractors和variables关联。对于大多数入门和中级场景我们更常见的做法是手动完成整个登录和获取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/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8 Accept-Language: zh-CN,zh;q0.9 Connection: close Cookie: admin_sessionz5k7x9c1v3b8n0; admin_csrff7g8h9j0k1l2 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_sessionz5k7x9c1v3b8n0; admin_csrff7g8h9j0k1l2 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_sessionz5k7x9c1v3b8n0; admin_csrff7g8h9j0k1l2 {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插件但需要sqldet和path-traversal。--config admin_scan.yaml:关键参数指定我们编写的高级扫描任务配置文件。执行后xray会读取admin_scan.yaml中的requests列表按照定义发送请求并根据payloads展开所有组合同时使用指定的插件对每一个请求及其响应进行漏洞检测。5.3 结果分析与报告解读扫描结束后xray会生成报告。在高级扫描模式下你需要特别关注请求与漏洞的对应关系 报告中每个漏洞都会关联到触发它的具体HTTP请求。点击查看详情确认这个请求是否是你配置的某个raw请求模板的实例。这能帮你判断漏洞是在哪个测试点哪个接口、哪个参数被触发的。误判分析 由于你配置的请求可能带有高权限Cookie或特殊头扫描器可能会访问到普通用户看不到的页面从而报告一些“敏感信息泄露”漏洞如目录列表、备份文件。这些需要人工复核判断其真实风险。漏报分析 如果预期中的漏洞没有扫出来需要排查Cookie/Token是否已过期检查扫描过程中的错误日志是否有大量的403、401状态码。请求是否成功到达了目标接口查看xray的“扫描中”输出或使用--log-level debug参数运行观察实际发出的请求和收到的响应。插件是否启用确认命令行中启用了对应的漏洞检测插件。Payload是否被正确应用检查payloads部分的语法以及生成的请求URL/Header/Body是否正确。6. 高级技巧与疑难问题排查6.1 处理登录与Session维护自动化对于需要先登录的场景虽然可以在配置文件中硬编码Cookie但更自动化的方式是编写一个前置的登录请求。这需要处理Cookie的自动传递。xray的高级模式支持通过session属性来实现简单的会话保持。在一个request中可以设置session: truexray会自动保存这个请求响应中的Set-Cookie头并将其应用到后续所有设置了session: true的请求中。但是对于复杂的登录流程如需要先获取CSRF Token再提交表单使用单个YAML文件配置会变得非常复杂且难以维护。我的个人经验是对于复杂的认证流程更推荐使用Python等脚本语言配合requests库模拟登录将获取到的稳定Cookie提取出来再动态写入到xray的扫描配置模板中或者直接使用xray的HTTP API启动扫描。这样逻辑更清晰也便于调试。6.2 绕过WAF与风控的请求头组合策略面对严格的WAF仅靠修改User-Agent是不够的。你需要构建一个看起来完全合法的请求指纹集完整性 确保请求包含目标浏览器通常发送的所有头如Accept、Accept-Language、Accept-Encoding、Connection、Upgrade-Insecure-Requests对于HTTPS到HTTP的跳转、Sec-Fetch-*系列头现代浏览器会发送等。顺序性 一些WAF会检查请求头的顺序。虽然不常见但如果遇到问题可以尝试调整头的顺序使其与浏览器发送的顺序一致。Burp Suite的“Copy as Raw”功能会保留顺序。速率限制 在配置文件中可以通过-字段虽然更常用于设置间隔来控制请求速率避免触发基于频率的风控。在http全局配置中也可以设置max_qps。6.3 常见错误与排查清单错误invalid yaml format原因 YAML语法错误最常见的是缩进使用了Tab键或者字符串格式不正确。排查 使用在线的YAML校验工具检查配置文件。确保缩进是空格raw块下的多行字符串正确使用了|。错误扫描器发送的请求返回大量403/401原因 Cookie或认证Token失效、错误或格式不对。排查手动用浏览器或curl命令使用配置文件中的相同Cookie和头访问目标URL确认是否能成功。检查Cookie值中是否有未编码的特殊字符如分号、逗号。确认认证头如Authorization的格式正确例如Bearer后面有空格。错误扫描器似乎没有使用我配置的Payload原因 Payload占位符{{变量名}}书写错误或payloads字典的键名与占位符不匹配。排查 开启调试日志--log-level debug查看xray解析配置文件后实际构造的请求是什么样子。确认占位符被正确替换。问题扫描速度太慢原因 可能启用了过多插件或者payloads组合爆炸导致请求量巨大。优化在命令行中通过--plugins精准指定需要的插件。合理设计payloads避免不必要的笛卡尔积。有时可以拆分成多个配置文件分批扫描。调整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配置本质上是掌握了让扫描器“拟人化”访问目标系统的能力。这不再是漫无目的的爬取而是带着明确身份和意图的深度探测。每一次配置都是你对目标应用访问逻辑的一次深刻理解。从捕获第一个有效的认证请求开始到构建出覆盖关键功能点的测试用例集这个过程本身就是一个优秀的安全测试人员必备的技能。