2

我有一个网络服务器正在运行......如果我从另一台服务器卷曲。像这样的东西:

curl http://myserver.com/../../../../../etc/rsyslog.conf

然后我可以看到服务器信息。

这是一个已知问题吗?


更新这里是我的服务器代码:

app = express.createServer(
            gzip.staticGzip(__dirname + '/public', {maxAge:5000 }),
            express.cookieParser(),
            express.bodyParser()

        );

得到了这样的修复:

var urlSecurity = function () {
    return function (req, res, next) {
        if (req.url.indexOf('../') >=0) {
            res.send('<div>Server Error</div>' , 500);
        } else if (req.url.indexOf('/..') >=0) {
            res.send('<div>Server Error</div>' , 500);
        } else {
            next();
        }
    }
}
app = express.createServer(
urlSecurity (),
            gzip.staticGzip(__dirname + '/public', {maxAge:5000 }),
            express.cookieParser(),
            express.bodyParser()

        );

这够好吗?

4

4 回答 4

2

立即修复后,我做了很多测试。我确认以下内容:

这主要不是节点问题。这是导致问题的 gzippo 模块。Gzippo 0.1.3 导致了这个问题。0.1.4没有问题。不知道为什么会这样。但最好不要使用旧版本的 gzippo。

于 2012-05-10T19:20:19.860 回答
2

您的程序中存在严重的安全漏洞。立即修复它。

从呈现的症状中我最好的猜测是你正在做类似的事情:

http.createServer(function (request, response) {
  var file = path.resolve('/path/to/files', request.url)
  fs.createReadStream(file).pipe(response)
})

这是非常不明智的!始终清理用户输入。在这种情况下,这很容易:

http.createServer(function (request, response) {
  var requestedFile = path.join('/', request.url);
  var file = path.join('/path/to/files', requestedFile)
  fs.createReadStream(file).pipe(response)
})

所以,首先我们path.join将请求的 url 放到'/'. 这将消除任何..恶作剧,使其更卫生。然后,我们path.join将其添加到我们的 url。

为什么使用path.join而不是path.resolve在这种情况下?因为path.join只是连接路径部分,而不是解决它们,所以引导/不会产生任何不良影响。

于 2012-05-09T18:24:39.570 回答
1

最简单的解决方案是insecureFileName.split('/').pop()始终只返回文件名。

'index.html'.split('/').pop() => 'index.html'
'../../../index.html'.split('/').pop() => 'index.html'
于 2017-07-05T12:27:11.813 回答
0

我使用以下方法清理用户文件名:

path.basename(filename);

例如:

const path = require('path');
let filename = '../../../../../../../etc/passwd';
filename = path.basename(filename); // 'passwd'
let pathToFile = path.join('/path/from/config/to', filename);
console.log(pathToFile); // 'path/from/config/to/passwd'
于 2018-08-02T14:05:05.797 回答