是否防止nodejs中的开放重定向攻击安全?

时间:2016-06-06 23:52:55

标签: node.js security express owasp

我试图阻止开放重定向攻击。请查看下面的代码并检查安全性:

texture

是否足以阻止开放式重定向攻击,还是应该添加其他内容?

2 个答案:

答案 0 :(得分:4)

CWE-601: URL Redirection to Untrusted Site ('Open Redirect')

Open Redirect的说明:

  

http参数可能包含URL值,可能导致Web应用程序将请求重定向到指定的URL。通过将URL值修改为恶意站点,攻击者可能会成功启动网络钓鱼诈骗并窃取用户凭据。由于修改后的链接中的服务器名称与原始站点相同,因此网络钓鱼尝试具有更值得信赖的外观。

input validation策略防止开放重定向攻击的建议:

  

假设所有输入都是恶意的。使用"接受已知商品"输入验证策略,即使用严格符合规范的可接受输入的白名单。拒绝任何不严格符合规范的输入,或将其转换为具有相应规格的输入。   不要完全依赖于查找恶意或格式错误的输入(即,不要依赖黑名单)。黑名单可能会错过至少一个不良输入,尤其是在代码环境发生变化的情况下。这可以为攻击者提供足够的空间来绕过预期的验证。但是,黑名单可用于检测潜在的攻击或确定哪些输入是如此格式错误,以至于它们应该被彻底拒绝。   使用已批准的URL或域的白名单进行重定向。

使用req.headers.hostreq.hostreq.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);
});

使用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]

我建议你使用白名单验证输入,下面是一个示例代码:

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);
});

答案 1 :(得分:1)

在这种情况下,我会使用HMAC。这将允许登录控制器验证public void launchSandBoxTestingTestNG() throws InterruptedException{ // Import FireFox Driver WebDriver driver = new FirefoxDriver(); @Test(priority=1) public void test1(){ // Open up Sandbox Page driver.get("****"); // Enter Usename and Password // User driver.findElement(By.id("userId")).sendKeys("****"); Thread.sleep(3000); // Password driver.findElement(By.id("password")).sendKeys("****"); Thread.sleep(3000); // Click Login Button driver.findElement(By.id("loginButton")).click(); } @Test(priority=2) public void test2(){ driver.findElement(By.xpath("****")).click(); // When I try running this code above it underlines the find element in red // When I run it on web driver the test2 syntax doesnt work //It gives me an option of casting an argument but not sure what that means } } 参数是否由知道密钥的人生成。

当您生成“登录”网址时,您会将redirect参数的HMAC摘要与重定向参数本身一起添加到网址。

登录处理程序可以使用HMAC来确保redirect参数是由知道HMAC密钥的可信服务器生成的,从而防止打开重定向攻击。

e.g。

redirect