2

Webサーバーを実行しています...別のサーバーからカールした場合。そんな感じ:

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

プログラムに重大なセキュリティ上の欠陥があります。すぐに修正してください。

提示された症状からの私の最も良い推測は、あなたが次のようなことをしているということです:

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.joinURLに追加します。

この場合path.joinではなく、なぜ使用するのですか?パスパーツを解決するのではなく結合するだけなので、リーディングpath.resolveが悪影響を与えることはありません。path.join/

于 2012-05-09T18:24:39.570 に答える
2

すぐに修正した後、多くのテストを行いました。そして私は次のことを確認します:

主にノードの問題ではありません。問題を引き起こしているのは gzippo モジュールです。Gzippo 0.1.3 がその問題を引き起こしています。0.1.4でも問題ありません。なぜそうなのかはわかりません。ただし、古いバージョンの gzippo は使用しない方がよいでしょう。

于 2012-05-10T19:20:19.860 に答える
1

最も簡単な解決策はinsecureFileName.split('/').pop()、常に fileName のみを返すことです。

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