【问题标题】:Preventing external requests expressjs防止外部请求 expressjs
【发布时间】:2015-10-16 01:16:41
【问题描述】:

使用 expressjs 和 morgan 中间件进行日志记录,我注意到服务器日志中有一些频繁且令人担忧的请求。

相关记录器代码

var app = express();
app.use(morgan(':remote-addr - [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"'));

因此,日志的示例是

::ffff:(redacted) - [Fri, 24 Jul 2015 04:16:32 GMT] "GET / HTTP/1.1" 200 29294 "-" "-"
::ffff:(redacted) - [Fri, 24 Jul 2015 04:17:30 GMT] "GET http://example.com/path.php HTTP/1.1" 200 34523 "-" "-"
::ffff:(redacted) - [Fri, 24 Jul 2015 04:17:36 GMT] "GET /path HTTP/1.1" 200 29294 "-" "-"

不幸的是,我不知道如何重现这样的错误。这是一个潜在的漏洞吗?原木锻造?我在哪里可以找到更多信息?

具体来说,这一行的 url 是“GET http://example.com/path.php HTTP/1.1”,其中 example.com 不是我的域,我的服务器也没有设置为向这个 example.com 发出请求。通常这里只显示一个路径(即/example、/path、/)。此外,这些行通常作为来自外部 IP 的明显漏洞扫描的一部分出现,200 的响应让我担心。日志是否指示出站请求?有人以某种方式使用我的服务器作为代理吗?

【问题讨论】:

  • 什么是潜在的漏洞?您究竟关心日志的哪一部分?
  • 在我希望看到路径的地方显示 URL 的行。我已经相应地更新了问题
  • 您是否尝试使用 curl 或类似工具向您自己的服务器执行相同的请求以查看它的响应?
  • @mscdex 是的!我尝试的第一件事,但我自己无法重现它。根据 morgan logger docs,:url 将是 express 的 request.originalUrl,否则,将是 http 模块的 request.url。问题可以简化为:在什么情况下,其中任何一个都是完整的 URL,而不仅仅是隐含的路径?或者:为什么我在“http://xxx.xxx.xxx”的服务器的request.url是“http://yyy.yyy.yyy?”

标签: node.js security express


【解决方案1】:

可以通过连接到服务器并发送 TCP 数据包以形成 HTTP 请求来重现此问题。

假设服务器部署在本地,这可以在 ubuntu 中使用 netcat 复制并发送 HTTP 请求,例如

netcat localhost 8080
GET http://example.com/path.php HTTP/1.1

由于这不是一个格式错误的 HTTP 请求,nodejs 可以正确处理它,但结果是通过 nodejs 传递的 url 不仅仅是一个路径,还包含给定的任何协议和域。

这可能会导致某些节点或 express 应用程序崩溃,这些应用程序只希望请求 url(或者在 express 的情况下,originalUrl)类似于路径,如 express documentation 和这些 stackoverflow 答案 one 和 @987654323 @暗示。

至于为什么它返回 200,这将是特定于应用程序的。

考虑到这一点,重要的是不要假设请求 url,也不要假设在 express 的情况下请求 originalUrl 是路径并且以'/'开头,并且当它不以'/'开头时甚至可能不包含正确的协议或域。

Express 至少在 v4 中可以“修复”不以“/”开头的请求 url,但请求对象的 originalUrl 部分不会更改。在任何情况下,仍然不应假定 url 以“/”开头。

在 express 中避免此类有问题的请求的一种简单方法是在中间件堆栈的顶部附近放置一个中间件来处理这种情况。下面给出一个例子。如果需要,将其放在记录器之前将防止记录这些错误。

app.use(function(req, res, next) {
    if(req.url[0] !== '/' || req.originalUrl[0] !== '/') {
        res.status(404).send('');
    } else {
        next();
    }
});

【讨论】:

    猜你喜欢
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2022-07-30
    • 2012-09-29
    • 1970-01-01
    • 2018-09-30
    相关资源
    最近更新 更多