恶意请求(通过无效URI)导致Elixir Phoenix/Plug中引发异常



我刚刚从生产中运行的应用程序收到Sentry的警报,该警报似乎是由恶意请求引起的。

我已经设法在我的本地env:中重新创建了错误

(Plug.Router.MalformedURIError) malformed URI "/cgi-bin/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/bin/sh"
(elixir 1.12.1) lib/uri.ex:419: URI.decode/1
(elixir 1.12.1) lib/enum.ex:1553: Enum."-map/2-lists^map/1-0-"/2
(elixir 1.12.1) lib/enum.ex:1553: Enum."-map/2-lists^map/1-0-"/2
(plug 1.12.1) lib/plug/router/utils.ex:18: Plug.Router.Utils.decode_path_info!/1
(matchhaus 0.0.1) lib/plug/router.ex:268: MyApp.Cors.match/2
...continues

可以看出,请求中的URL路径是/cgi-bin/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/bin/sh。这看起来像是对URI字符串进行双重编码以遍历目录结构(%%32%65%%32%65->%2e%2e->..(。然而,这似乎在URI.decode阶段失败了,这是有道理的,因为像%%32这样的东西是无效的。

我的问题是,我宁愿我的服务器不要因为这样的事情而抛出错误。理想情况下,它只会处理这个问题,并以404或400(或其他4xx状态(响应,因为这是一个无效的请求。

这是Plug应该处理的问题吗?还是这是我应该在Phoenix应用程序中处理的问题?

正如您在异常定义中看到的,它将发送HTTP 400响应(:plug_status字段对此进行了定义(。唯一可以成为";有问题的";有日志消息。问题是这是否真的是你的问题。如果是,那么您可以捕获所有/cgi-bin/路径,并在到达路由器之前忽略这些请求。

最新更新