【问题标题】:Malicious request (via invalid URI) causes exception to be thrown in Elixir Phoenix/Plug恶意请求(通过无效 URI)导致 Elixir Phoenix/Plug 中抛出异常
【发布时间】:2022-01-25 18:37:16
【问题描述】:

我刚刚收到来自 Sentry 的警报,来自我在生产中运行的应用程序,这似乎是恶意请求造成的。

我已经设法在本地环境中重新创建错误:

(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 应用程序中处理的事情?

【问题讨论】:

  • 好像是intentionally raising。您使用的是什么版本的 Elixir?
  • 我使用的是 1.12.1。 URI.decode 是否有 1.13 更新日志的链接?

标签: elixir uri phoenix-framework plug


【解决方案1】:

正如您在 exception definition 中看到的,它将发送 HTTP 400 响应(:plug_status 字段定义了这一点)。唯一可能“有问题”的是日志消息。问题是这对你来说是否真的是一个问题。如果是,那么您可以捕获所有 /cgi-bin/ 路径,并在此类请求到达路由器之前忽略这些请求。

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 2012-05-15
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多