Expressjs的"express.static()"默认情况下可以防止目录/路径遍历,但我认为Nodejs默认情况下没有保护措施来防止目录/路径遍历?最近试图学习一些Web开发安全(目录/路径遍历),我创建了这个:
const http = require("http");
const fs = require("fs");
http
.createServer(function (req, res) {
if (req.url === "/") {
fs.readFile("./public/index.html", "UTF-8", function (err, data) {
if (err) throw err;
res.writeHead(200, { "Content-Type": "text/html" });
res.end(data);
});
} else {
if (req.url === "/favicon.ico") {
res.writeHead(200, { "Content-Type": "image/ico" });
res.end("404 file not found");
} else {
fs.readFile(req.url, "utf8", function (err, data) {
if (err) throw err;
res.writeHead(200, { "Content-Type": "text/plain" });
res.end(data);
});
}
}
})
.listen(3000);
console.log("The server is running on port 3000");
模拟目录/路径遍历安全漏洞,但我尝试使用“../../../secret.txt”,当我检查“req.url”时,它显示“/secret.txt”而不是“../../../secret.txt”。我还尝试使用“%2e”和“%2f”,但仍然无法正常工作,我仍然无法获取“secret.txt”。
(我的文件夹结构)
- node_modules
- public
- css
- style.css
- images
- dog.jpeg
- js
- script.js
index.html
- package.json
- README.md
- server.js
- secret.txt
curl -L localhost:3000/../../secret.txt
来测试你的服务器。问题在于req.url
被解析成了 "/secret.txt" -- 使用req.query
参数 (curl -L localhost:3000?path=../../secret
) 或者req.body
(你需要中间件来解析它们)。然后,一旦你收到路径,这个 "漏洞" 就会成功 -- 你可能不需要再使用服务器,直接将路径硬编码到fs.readFile
中即可。 - Kipras Melnikovas