一、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 validcertificate signed by unknown authorityx509 开头的报错信息,请检查服务端的 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,无法解析这种域名,普通域名不受影响。如果十分依赖这种场景,可以提交反馈。

三、使用了 --json-output 或者 --html-output 之后没有出现结果文件

xray 目前在扫到漏洞的时候才会创建文件并写入数据,否则说明没有发现漏洞。

四、如何确认代理模式下 xray 有没有在工作

代理模式下,如果 xray 接收到了流量并进行了扫描,每隔 10s 就会输出一条类似下方的消息

Statistic: scanned: 0, pending: 1, capacity: 10000, requestSent: 180, latency: 678.26ms, failedRatio: 0.00%

如果长期没有此信息输出,也没有漏洞等输出,说明 xray 可能没有接收到浏览器的流量,可以按照下面的办法排查

  • 访问 http://proxy.xray.cool/ 或者 http://xray/,如果可以看到 xray is working 说明此浏览器已经成功设置 xray 为代理,请继续阅读下一条检查方法,否则请确认浏览器设置。
  • 浏览器等客户端代理可能存在白名单,比如一般 127.0.0.1localhost 等默认不会走代理,这些白名单可能还存在用户设置的更多项目,请检查白名单。
  • 同理,xray 也存在扫描白名单,在配置文件的 mitm 部分中的 restrictionincludesexcludes 中,请检查此部分配置,比如默认情况下 govedu 域名会被排除在外。

五、为什么使用 --url 指定目标扫描很快就结束了?

在指定 --url URL 的情况下,xray 只会针对该 URL 本身进行漏洞检测,不会爬取网站内容。比如,你输入 --url https://baidu.com,xray 只会检测百度首页 的漏洞,这种情况下通常是无法扫描出漏洞的。

如果你需要利用爬虫爬取页面后再检测漏洞,可以使用 --basic-crawler 选项,具体使用方法请参考文档。

六、为什么我输入URL调用后扫不出漏洞,而其他扫描器扫出了很多漏洞?

原因同上,xray 社区版是一个被动扫描器(角色参照Burpsuite),主动爬虫功能较弱,可能无法满足你的需求。 建议将浏览器代理设置为xray的代理,通过代理的方式将网站流量发送给xray进行检测。如果还是不能扫出漏洞,可以反馈我们。

七、如何给xray扫描器设置上游代理?

xray 细化了代理的配置,大致分为两部分:

  • 如果要给xray的被动代理本身设置代理,修改配置文件 mitm 部分的 upstream_proxy
  • 如果要给xray的漏洞扫描设置代理可以在配置文件 http 部分增加 proxy:http://127.0.0.1:7777 这样的配置

八、如何限制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 中的项进行漏洞探测。

十一、如何批量爬取多个目标网站并进行漏洞扫描?(batch)

自带功能不支持。可以搭配第三方爬虫,同时使用 xray 的代理进行扫描。

十二、代理模式下,为什么扫描完不退出(quit)

在代理模式下,xray 并不知道什么情况下是扫完了,因为 xray 是收到一个请求就扫描一个,比如你是浏览器挂 xray 为代理,没有收到新请求可能是你还没开始浏览页面,也可能是已经浏览完了关闭了浏览器,所以扫描完成之后需要手动的退出 xray 进程。

十三、xray 因为 out of memory 而崩溃或被杀死

内存不足导致 xray 出现问题主要有两种表现

  1. xray 提示 fatal error: runtime: out of memory,这个问题是因为系统内存不足了,xray 无法继续分配内存导致无法恢复的错误而退出。
  2. 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 的可能性