Eri*_*rik 5 security owasp node.js express
我试图阻止开放重定向攻击.请查看下面的代码并检查安全性:
var = require('url');
// http://example.com/login?redirect=http://example.com/dashboard
app.route('/login', function (req, res, next) {
var redirect = req.query.redirect,
paths = url.parse(redirect);
if (paths.host !== req.headers.host) {
return next(new Error('Open redirect attack detected'));
}
return res.redirect(redirect);
});
Run Code Online (Sandbox Code Playgroud)
是否足以防止开放重定向攻击或是否应该添加其他内容?
CWE-601:URL 重定向到不受信任的站点(“打开重定向”)
说明Open Redirect
:
http 参数可能包含一个 URL 值,并可能导致 Web 应用程序将请求重定向到指定的 URL。通过修改恶意站点的 URL 值,攻击者可能成功发起网络钓鱼诈骗并窃取用户凭据。由于修改后的链接中的服务器名称与原始站点相同,因此网络钓鱼尝试具有更可信的外观。
input validation
防止开放重定向攻击的策略建议:
假设所有输入都是恶意的。使用“接受已知好的”输入验证策略,即使用严格符合规范的可接受输入白名单。拒绝任何不严格符合规范的输入,或将其转换为符合规范的内容。不要完全依赖寻找恶意或格式错误的输入(即不要依赖黑名单)。黑名单很可能会遗漏至少一个不受欢迎的输入,尤其是在代码环境发生变化的情况下。这可以为攻击者提供足够的空间来绕过预期的验证。但是,黑名单可用于检测潜在攻击或确定哪些输入格式错误以至于应彻底拒绝它们。使用已批准 URL 或域的白名单以用于重定向。
使用req.headers.host
,req.host
或者req.hostname
不安全,因为req.headers
可以伪造(例如,HTTP 请求有一个自定义Host
标头来访问用下面的代码编写的快速应用程序)
var url = require('url');
app.get('/login', function (req, res, next) {
var redirect = req.query.redirect,
targetUrl = url.parse(redirect);
console.log('req.headers.host: [%s]', req.headers.host);
console.log('req.host: [%s]', req.host);
console.log('req.hostname: [%s]', req.hostname);
if (targetUrl.host != req.headers.host) {
return next(new Error('Open redirect attack detected'));
}
return res.redirect(redirect);
});
Run Code Online (Sandbox Code Playgroud)
使用curl
提出要求:
$ curl -H 'Host: malicious.example.com' 'http://localhost:3012/login?redirect=http://malicious.example.com' -i
HTTP/1.1 302 Found
X-Powered-By: Express
Location: http://malicious.example.com
Vary: Accept
Content-Type: text/plain; charset=utf-8
Content-Length: 54
Date: Mon, 13 Jun 2016 06:30:55 GMT
Connection: keep-alive
$ #server output
req.headers.host: [malicious.example.com]
req.host: [malicious.example.com]
req.hostname: [malicious.example.com]
Run Code Online (Sandbox Code Playgroud)
我建议您使用白名单来验证输入,示例代码如下:
const WHITELIST_TO_REDIRECT = new Set(["localhost:3012", "www.realdomain.com"]);
app.get('/login', function (req, res, next) {
var redirect = req.query.redirect,
targetUrl = url.parse(redirect);
console.log("req.hostname: [%s]", req.hostname);
console.log("url.host: [%s]", targetUrl.host);
if (!WHITELIST_TO_REDIRECT.has(targetUrl.host)) {
return next(new Error('Open redirect attack detected'));
}
return res.redirect(redirect);
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1096 次 |
最近记录: |