1 工具简介
xray 是长亭科技开发的一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有:
- 跨平台:使用Go语言开发,支持Windows、Linux和Mac主流平台,包括arm架构。
- 检测速度快:发包速度快; 漏洞检测算法效率高。
- 支持范围广:大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均支持。
- 高级可定制:通过修改配置文件可以定制化功能。
目前支持的漏洞检测类型包括:
- XSS漏洞检测 (key: xss)
- SQL 注入检测 (key: sqldet)
- 命令/代码注入检测 (key: cmd-injection)
- 目录枚举 (key: dirscan)
- 路径穿越检测 (key: path-traversal)
- XML 实体注入检测 (key: xxe)
- 文件上传检测 (key: upload)
- 弱口令检测 (key: brute-force)
- jsonp 检测 (key: jsonp)
- ssrf 检测 (key: ssrf)
- 基线检查 (key: baseline)
- 任意跳转检测 (key: redirect)
- CRLF 注入 (key: crlf-injection)
- Struts2 系列漏洞检测 (高级版,key: struts)
- Thinkphp系列漏洞检测 (高级版,key: thinkphp)
- XStream 系列漏洞检测 (key: xstream)
- POC 框架 (key: phantasm)
其中 POC 框架默认内置 Github 上贡献的 poc,用户也可以根据需要自行构建 poc 并运行。xray 不开源,社区版免费使用,高级版需要付费使用。
1.1 下载地址
1.2 版本对比
| 能力\版本 | 社区版 | 高级版 | 商业版(洞鉴) | 
|---|---|---|---|
| SQL注入检测 | ✅ | ✅ | ✅ | 
| 命令注入检测 | ✅ | ✅ | ✅ | 
| 代码注入检测 | ✅ | ✅ | ✅ | 
| 反射型XSS检测 | ✅ | ✅ | ✅ | 
| 目录枚举 | ✅ | ✅ | ✅ | 
| 文件上传检测 | ✅ | ✅ | ✅ | 
| XXE检测 | ✅ | ✅ | ✅ | 
| SSRF检测 | ✅ | ✅ | ✅ | 
| CSRF检测 | ✅ | ✅ | ✅ | 
| 基线检查 | ✅ | ✅ | ✅ | 
| 任意跳转检测 | ✅ | ✅ | ✅ | 
| jsonp检测 | ✅ | ✅ | ✅ | 
| CRLF注入检测 | ✅ | ✅ | ✅ | 
| XStream系列检测 | ✅ | ✅ | ✅ | 
| log4j2-rce的检测 | ✅ | ✅ | ✅ | 
| Web表单弱口令 | ✅ | ✅ | ✅ | 
| http基础认证弱口令 | ✅ | ✅ | ✅ | 
| 主机扫描/主机指纹识别 | ✅ | ✅ | ✅ | 
| 模拟浏览器爬虫扫描 | ✅ | ✅ | ✅ | 
| Web基础爬虫 | ✅ | ✅ | ✅ | 
| 代理扫描 | ✅ | ✅ | ✅ | 
| 自定义yaml插件 | ✅ | ✅ | ✅ | 
| 反连平台 | ✅ | ✅ | ✅ | 
| 四种报告输出 | ✅ | ✅ | ✅ | 
| 子域名收集 | ❌ | ✅ | ✅ | 
| shiro反序列化漏洞检测 | ❌ | ✅ | ✅ | 
| ThinkPHP系列检测 | ❌ | ✅ | ✅ | 
| fastjson系列检测 | ❌ | ✅ | ✅ | 
| Struts2系列检测 | ❌ | ✅ | ✅ | 
| DOM型XSS检测 | ❌ | ❌ | ✅ | 
| weblogic系列检测 | ❌ | ❌ | ✅ | 
| 主机服务弱口令 | ❌ | ❌ | ✅ | 
| 指纹识别 | ❌ | ❌ | ✅ | 
| 日志扫描 | ❌ | ❌ | ✅ | 
| word等渗透测试报告输出 | ❌ | ❌ | ✅ | 
| POC漏洞检测 | 使用社区poc或自行编写 | 使用社区poc或自行编写 | 官方维护编写 | 
| 更新频率 | 不定期 | 不定期 | 日常+应急更新 | 
| 产品形态 | 软件 | 软件 | 软件+硬件+云 | 
2. 简易架构
扫描工具大致都是由三部分组成:目标输入、漏洞检测和结果输出。
2.1 目标输入
xray定义了5个入口(扫描方式),分别是:
- HTTP 被动代理
- 简易爬虫
- 单个 URL
- URL列表的文件
- 单个原始 HTTP 请求文件
2.2 结果输出
工具运行时的状态信息和漏洞扫描结果输出:
- Stdout (屏幕输出, 默认开启)
- JSON 文件输出
- HTML 报告输出
- Webhook 输出
3. 命令行参数说明
用法:
    [全局选项] 命令 [命令选项] [参数]
命令:
   webscan, ws        运行Web扫描任务
   servicescan, ss    运行服务扫描任务
   subdomain, sd      运行子域名枚举任务
   poclint, pl, lint  检查poc格式
   burp-gamma, btg    将burp历史代理记录的导出文件转换为POC格式
   transform          转换v1版本poc为v2版本
   reverse            以独立的反连平台服务运行
   convert            将结果从json转换为html或从html转换为json
   genca              生成CA证书和密钥文件
   upgrade            检查更新并自动升级
   version            显示版本
   x                  一个启用所有插件的命令。可以在配置文件中自定义新命令或修改由命令启用的插件。
   help, h            显示命令列表或一个命令的帮助
全局选项:
   --config FILE      加载配置文件(默认值:“config.yaml”)
   --log-level value  日志级别,可选择调试、信息、警告、错误、致命
   --help, -h         显示帮助信息4. 使用方法
xray的扫描方式分为被动扫描、主动扫描和服务扫描。
4.1 被动扫描(Passive scanning)
扫描器作为中间人,首先原样转发流量,并返回服务器响应给浏览器等客户端,通讯两端都认为自己直接与对方对话,同时记录该流量,然后修改参数并重新发送请求进行扫描。
首次使用时运行:.\xray_windows_amd64.exe genca生成证书,直接运行.\xray_windows_amd64.exe同样也会生产证书。然后安装生成的ca.crt证书即可扫描使用HTTPS协议的web服务。
常用命令有:
- 监听本地7777端口,按日期生成html报告:xray_windows_amd64.exe ws --listen 127.0.0.1:7777 --ho __datetime__.html
- 开放7777端口,所有人均可使用:xray_windows_amd64.exe ws --listen 0.0.0.0:7777 --ho __datetime__.html
4.2 主动扫描
主动扫描常用命令有:
- 扫描单个Url:xray_windows_amd64.exe ws -u http://dvwa.com
- 扫描URL列表的文件:xray_windows_amd64.exe ws --uf url.txt
- 简单爬虫扫描: xray_windows_amd64.exe ws --basic http://dvwa.com --ho test.html
- 浏览器爬虫扫描(需要下载rad): xray_windows_amd64.exe ws --browser http://dvwa.com
- 扫描单个原始HTTP请求文件: xray_windows_amd64.exe ws --rr url.txt
- 扫描单个原始HTTPS请求文件: xray_windows_amd64.exe ws --rr url.txt --fs
- 扫描Burp导出的HTTP请求文件: xray_windows_amd64.exe ws --bf file
- 使用指定Poc扫描: xray_windows_amd64.exe ws -p poc1.yml,poc2.yml -u http://dvwa.com
- 使用x命令:xray_windows_amd64.exe x -t 192.168.0.1/16,x命令默认启用了所有的插件,包括存活探测、端口扫描、指纹识别等。
主动扫描通常做不登录扫描,如需做登录扫描需要使用原始HTTP请求文件或修改配置文件,并添加有效Cookie。
4.3 服务扫描
目前仅支持CVE-2020-1938和CVE-2023-21839/21931/21979
- 扫描单个目标: xray_windows_amd64.exe ss -t 192.168.1.94:80
- 批量扫描: xray_windows_amd64.exe ss --tf serv.txt
5. 配置文件
首次运行会自动生成配置文件和证书,配置文件内有详细的注释,包括一下部分:
- 全局HTTP发包配置
- 插件配置
- 反连平台配置
- 被动代理配置
- 基础爬虫配置
- 子域名扫描配置
6. 高级用法
6.1 Burp+Xray联动
将自动扫描和手工测试互补,弥补单一工具的不足。有两种方式:
- Burp做一级代理,Xray做二级代理。经过Burp Proxy组件的流量都会转发到Xray进行被动扫描 
 配置方法是在Burp的Proxy组件配置Upstream proxy servers指向Xray: 
- Xray做一级代理,Burp做二级代理。流量先经过Xray,再经过Burp Proxy组件,可以拦截Xray的流量进行修改。 
 配置方法是修改Xray配置文件中全局HTTP发包proxy字段指向Burp Proxy监听地址: 
第一种方式可以将Burp插件的流量也转发到Xray,第二种方式可以查看Xray的Payload并进行优化后手工测试,通常调试Xray Poc时可以使用第二种方式。
6.2 Awvs+Xray联动
AWVS的爬虫很强大,支持表单分析和单页应用的爬取,Xray 的扫描能力比较强,速度也更快,二者结合如虎添翼。
在AWVS创建扫描任务时,添加Xray代理地址即可:
6.3 其它工具联动
其它支持代理模式的工具同样可以和Xray被动扫描进行联动,比如dirsearch、dirmap、sqlmap等工具,具体根据自己需求配置。
6.4 反连平台
默认配置未启用反连平台(DnsLog),因此无法扫描出依赖反连平台的漏洞:
- SSRF
- XXE盲注
- 无回显命令注入
- 一些反序列化漏洞,如fastjson、Log4j2等
Xray支持2种部署方式:
- 独立部署
- 非独立部署
6.4.1 独立部署
需要将xray放置于存在公网IP (或目标可访问的内网)的服务器上,选择此方式部署可供团队使用。
反连平台配置文件示例:
需要配置的项:
- 反连平台数据库文件位置
- 设置token,客户端交互和web端登录使用
- 启用http方法,也可同时启用dns方法
- 设置监听IP和端口等信息
反连平台启动命令:./ xray_linux_amd64 reverse
Web地址:http://8.130.41.223:8777/cland
扫描器配置文件示例:
需要配置的项:
- 设置token,需要和反连平台配置文件中的一致,扫描器获取反连结果时使用
- 启用反连平台客户端
- 设置http基本地址,启用dns方法时同样需要设置dns服务器地址
主动扫描命令:xray_windows_amd64.exe --config client_config.yaml ws -u http://xxx
其它命令类似
6.4.2 非独立部署
使用非独立部署需要被测目标可以访问Xray所在地址。
该方式已知bug:在添加了DNS后,被动代理模式会出现无法扫描的BUG。
配置文件示例:
需要配置的项:
- 反连平台数据库文件位置
- 启用http方法
- 设置监听IP和端口
扫描命令: xray_windows_amd64.exe ws --listen 127.0.0.1:7777
6.5 Webhook
Webhook是一种应用程序间进行实时通信的方法。Webhook允许一个系统向另一个系统发送信息,通常用来发送通知。如:
- 邮件通知
- 短信通知
- 企业微信群通知
- 钉钉群通知
官方提供了:https://github.com/chaitin/xray/tree/master/webhook仓库但是没有代码实现,需要自行编程实现。
使用命令:xray_windows_amd64.exe ws  -u http://dvwa.com --wo http://127.0.0.1:5000
企业微信webhook示例代码:
from flask import Flask, request, jsonify
import requests
from datetime import datetime
app = Flask(__name__)
key = ""  # 填写你的企业微信群webhook key
def wxwork_notify(message):
    url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={key}"
    headers = {'Content-Type': 'application/json'}
    payload = {
        "msgtype": "text",
        "text": {
            "content": message
        }
    }
    response = requests.post(url, json=payload, headers=headers)
    return response.text
@app.route('/', methods=['POST'])
def xray_webhook():
    data = request.json
    # 构造消息内容
    try:
        create_time = data['data']['create_time']
        create_time = datetime.fromtimestamp(create_time/1000).strftime('%Y-%m-%d %H:%M:%S')
    except:
        return jsonify({"status": "failed", "message": "Not Vuln Data"}),400
    try:
        message = f"Xray 漏洞扫描通知\n" \
                f"漏洞类型:{str(data['type'])}\n" \
                f"漏洞地址:{str(data['data']['detail']['addr'])}\n" \
                f"漏洞参数:{str(data['data']['detail']['extra']['param'])}\n" \
                f"Payload:{str(data['data']['detail']['payload'])}\n" \
                f"扫描插件:{str(data['data']['plugin'])}\n" \
                f"发现时间:{create_time}"
    except:
        return jsonify({"status": "failed", "message": "Not Vuln Data"}),400
    
    # 调用企业微信群通知webhook
    res = wxwork_notify(message)
    print(res)
    return jsonify({"status": "success", "message": "Data received"})
if __name__ == '__main__':
    app.run()7. 自定义Poc
7.1 为什么编写Poc
Poc的内容主要影响的就是扫描的效果,其影响效果可以简单的看作:漏报、误报、危害。
- 减少漏报
- 降低误报
- 降低危害
7.2 Xray Poc的结构
Xray Poc分三个部分:Poc名称、Poc脚本、信息。
信息部分还有其它字段:
7.3 编写Poc
目前官方提供了大量漏洞类型模板,编写更方便。可参考一下资料编写:
- 官方文档:https://docs.xray.cool/tools/xray/QuickStart
- 常见问题:https://docs.xray.cool/tools/xray/QA
- YAML教程:https://docs.xray.cool/plugins/yaml/Format
- YAML插件的参数: https://docs.xray.cool/plugins/yaml/YAMLTypeFunc
- Poc编写模板:https://docs.xray.cool/plugins/practice/poc/Template
8. FAQ
对于异步HTTP请求类型的漏洞暂时无法通过Yaml Poc实现,如CVE-2024-23897。









x