xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有:
- 检测速度快。发包速度快; 漏洞检测算法高效。
- 支持范围广。大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均可以支持。
- 代码质量高。编写代码的人员素质高, 通过 Code Review、单元测试、集成测试等多层验证来提高代码可靠性。
- 高级可定制。通过配置文件暴露了引擎的各种参数,通过修改配置文件可以极大的客制化功能。
- 安全无威胁。xray 定位为一款安全辅助评估工具,而不是攻击工具,内置的所有 payload 和 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)
- POC 框架 (key: phantasm)
其中 POC 框架默认内置 Github 上贡献的 poc,用户也可以根据需要自行构建 poc 并运行。
下载运行
xray 为单文件二进制文件,无依赖,也无需安装,下载后直接使用。
下载地址
请下载的时候选择最新的版本下载。
- Github: https://github.com/chaitin/xray/releases (国外速度快)
- 网盘: https://yunpan.360.cn/surl_y3Gu6cugi8u (国内速度快)
注意: 不要直接 clone 仓库,xray 并不开源,仓库内不含源代码,直接下载构建的二进制文件即可。
xray 跨平台支持,请下载时选择需要的版本下载。
Windows
windows_amd64
Windows x64windows_386
Windows x86
下载对应系统的版本后,来查看下 xray 的版本号。
以下载到 C:\Users\$User\Downloads
为例,右键解压,就可以得到 xray_windows_amd64.exe
文件了(有的解压软件还会创建一个 xray_windows_amd64.exe
的文件夹,不要和最终的可执行文件混淆了)。
使用桌面左下方的的搜索框,输入 PowerShell
,点击 Windows PowerShell
,进入命令终端。
然后 cd
到下载目录,运行 .\xray_windows_amd64.exe version
即可查看 xray 的版本号。
快速测试单个 url, 无爬虫:
xray webscan --url http://example.com/?a=b --html-output single-url.html
使用基础爬虫爬取并对爬虫爬取的链接进行漏洞扫描:
xray webscan --basic-crawler http://example.com --html-output xxx.html
使用 HTTP 代理进行被动扫描:
设置浏览器 http 代理为http://127.0.0.1:7777,然后使用浏览器访问网页,就可以自动分析代理流量并扫描。
xray webscan --listen 127.0.0.1:7777 --html-output xxx.html
手动指定本次运行的插件:
默认情况下,将会启用所有内置插件,可以使用下列命令指定本次扫描启用的插件。
xray webscan --plugins cmd_injection,sqldet --url http://example.comxray webscan --plugins cmd_injection,sqldet --listen 127.0.0.1:7777
生成 ca 证书:
.\xray_windows_amd64.exe genca
num_found_urls
发现的扫描目标数量num_scanned_urls
已扫描完成的扫描目标数量num_sent_http_requests
已经发出的漏洞探测请求数量average_response_time
近 30s 请求平均响应时间ratio_failed_http_requests
近 30s 请求失败率
这些信息除了表面意思,还有其他隐藏含义:
使用了 --json-output
或者 --html-output
之后没有出现结果文件
xray 目前在扫到漏洞的时候才会创建文件并写入数据,否则说明没有发现漏洞。
如何确认代理模式下 xray 有没有在工作
代理模式下,如果 xray 接收到了流量并进行了扫描,每隔 10s 就会输出一条类似下方的消息
Statistic: scanned: 0, pending: 1, capacity: 10000, requestSent: 180, latency: 678.26ms, failedRatio: 0.00%
CopyErrorCopied
如果长期没有此信息输出,也没有漏洞等输出,说明 xray 可能没有接收到浏览器的流量,可以按照下面的办法排查
为什么使用 --url
指定目标扫描很快就结束了?
在指定 --url URL
的情况下,xray 只会针对该 URL 本身进行漏洞检测,不会爬取网站内容。比如,你输入 --url https://baidu.com
,xray 只会检测百度首页 的漏洞,这种情况下通常是无法扫描出漏洞的。
如果你需要利用爬虫爬取页面后再检测漏洞,可以使用 --basic-crawler
选项,具体使用方法请参考文档。
为什么我输入URL调用后扫不出漏洞,而其他扫描器扫出了很多漏洞?
原因同上,xray 社区版是一个被动扫描器(角色参照Burpsuite),主动爬虫功能较弱,可能无法满足你的需求。 建议将浏览器代理设置为xray的代理,通过代理的方式将网站流量发送给xray进行检测。如果还是不能扫出漏洞,可以反馈我们。
如何给xray扫描器设置上游代理?
xray 细化了代理的配置,大致分为两部分:
如何限制xray发包速率?
在 config.yaml
文件中 http
设置 max_qps
为什么XSS输出的payload无法复现?
xray的xss插件检测方式与大家熟知的暴力发包方式不同,是通过分析语义来精准判断的,在此过程中可能不会发送真正的payload,而输出的payload也是通过分析得到的可能的payload,不保证可用。但一般来讲,不可用的情况也只需稍加调整就可以利用。
xray会测请求包中的json数据吗?
会。 目前全局支持 query, url-encoded body, multipart body, json body,位置的漏洞探测。部分插件还会对 cookie 和 header 中的项进行漏洞探测。
如何批量爬取多个目标网站并进行漏洞扫描?
自带功能不支持。可以搭配第三方爬虫,同时使用 xray 的代理进行扫描。
代理模式下,为什么扫描完不退出
在代理模式下,xray 并不知道什么情况下是扫完了,因为 xray 是收到一个请求就扫描一个,比如你是浏览器挂 xray 为代理,没有收到新请求可能是你还没开始浏览页面,也可能是已经浏览完了关闭了浏览器,所以扫描完成之后需要手动的退出 xray 进程。
xray 因为 out of memory
而崩溃或被杀死
内存不足导致 xray 出现问题主要有两种表现
这两种情况下,请先收集诊断数据
这类问题核心原因是因为系统内存不足,原因可能是
- pending 的数量等于
num_found_urls
-num_scanned_urls
, 如果 pending = 0,那么就意味着扫描完成了 average_response_time
比较高 (>200ms) 意味着网络延迟比较大ratio_failed_http_requests
比较高(>5%) 意味着可能有 waf, 反正就是很多请求失败- 常见问题
-
no command provided
在 Windows 下面直接双击打开或者使用了错误的参数,可能会提示
No command provided, please run this program in terminal
,在其他平台下,会进入一个类似 shell 一样的界面。这是因为 xray 是一款命令行工具,需要在命令行下运行并使用正确的参数,不能直接双击打开,具体的使用方法见 下载运行 章节。
在非 Windows 环境下,没有参数运行将进入 shell 模式,可以继续输入
version
等指令运行,在 Windows 下面此特性被禁用。网页上出现 xray 的报错信息
Proxy Failed
xray 在代理扫描的时候,需要同时和客户端到和服务端建立连接,如果 xray 和服务器端连接失败,就会返回这样一个错误页面给客户端,常见的错误解释如下
timeout awaiting response
等待代理返回时候超时,请检查网络情况,是否可以连通,如果是偶尔的超时,可以忽略,重试即可。connection reset by peer
连接被中断,请检查对方是否有 waf,ip 是否被拉黑,如果是国外的目标,可能是网络不稳定的原因。certificate has expired or is not yet valid
和certificate signed by unknown authority
等x509
开头的报错信息,请检查服务端的 ssl 证书配置是否正确,对于自签名证书等问题,可以选择不校验证书,将配置文件中的tls_skip_verify
改为true
即可。dial i/o timeout
这往往是连接目标网站时间过长导致的,前面指南中的 https://testphp.vulnweb.com 就是一个国外的网站,国内访问容易出现超时。增大配置文件中的 http ->dial_timeout
可以缓解这个问题。dial tcp: lookup xxx on xxx:53: no such host
要访问的地址的域名,xray 解析失败。- 最常见原因是域名拼写错误,比如
example.xray.cool
写错为exmple.xray.cool
。 - 在 MacOS 上,如果需要 VPN 才可以访问和解析的域名,在使用 xray 作为代理后,即使 VPN 连接了也无法解析。这是因为 xray 使用了跨平台编译技术,没有使用 MacOS 的 sdk,无法解析这种域名,普通域名不受影响。如果十分依赖这种场景,可以提交反馈。
- 最常见原因是域名拼写错误,比如
- 访问
http://proxy.xray.cool/
或者http://xray/
,如果可以看到xray is working
说明此浏览器已经成功设置 xray 为代理,请继续阅读下一条检查方法,否则请确认浏览器设置。 - 浏览器等客户端代理可能存在白名单,比如一般
127.0.0.1
、localhost
等默认不会走代理,这些白名单可能还存在用户设置的更多项目,请检查白名单。 - 同理,xray 也存在扫描白名单,在配置文件的
mitm
部分中的restriction
的includes
和excludes
中,请检查此部分配置,比如默认情况下gov
和edu
域名会被排除在外。 - 如果要给xray的被动代理本身设置代理,修改配置文件
mitm
部分的upstream_proxy
项 - 如果要给xray的漏洞扫描设置代理可以在配置文件 http 部分增加
proxy:http://127.0.0.1:7777
这样的配置 - xray 提示
fatal error: runtime: out of memory
,这个问题是因为系统内存不足了,xray 无法继续分配内存导致无法恢复的错误而退出。 - xray 进程突然被 kill,这个也可能是因为内存不足导致的,诊断方式为
dmesg -T | grep xray
,如果里面有out of memory
说明是因为系统内存不足而 kill 了 xray 进程。 - 检查内存大小
free -m
- xray 会定期输出内存占用情况,
Memory: Alloc: n Mb
等,可以找到最后最后一条输出 dmesg -T > dmesg.txt
内核日志ps -ef > ps.txt
进程列表- 系统内存确实过小,xray 运行使用的内存大小和配置有关,见队列长度 相关章节。这种情况下,请正确理解相关参数的意义,不要配置不合理的数字。
- 系统中有其他的进程占用了过多的内存,比如
crawlergo
。系统在发生内存不足情况的时候,会给所有的进程计算一个分数,直接相关就是内存占用大小,但是因为xray
是单进程,而crawlergo
是多进程,所以在同等内存占用情况下,xray
进程分数就会更高,就会被作为牺牲品而被 kill。这种情况下,可以- 需要提高系统内存
- 降低爬虫的进程数量,比如 crawlergo 的
max-tab-count
- 在运行 xray 之前,在 bash 中执行
echo -500 > /proc/self/oom_score_adj
,降低被 oom 的可能性