オープンリダイレクト攻撃について
オープンリダイレクト攻撃は、Webアプリケーションがユーザーのリクエストに基づいてリダイレクトを行う際に、不適切な検証や制限が行われていない場合に発生する脆弱性です。この攻撃により、攻撃者はユーザーを悪意のあるサイトに誘導し、フィッシングやマルウェアの配布などの攻撃を行うことができます。オープンリダイレクトは、信頼されたドメインからリダイレクトが行われるため、ユーザーが騙されやすいという特徴があります。
脆弱なコード:
<?php
$url = $_GET['url'];
header("Location: $url");
exit();
?>
攻撃手法:
攻撃者は、url
パラメータに悪意のあるURLを指定することで、ユーザーをフィッシングサイトやマルウェアサイトにリダイレクトできます。
http://example.com/redirect.php?url=http://malicious-site.com
脆弱なコード:
from flask import Flask, request, redirect
app = Flask(__name__)
@app.route('/redirect')
def open_redirect():
url = request.args.get('url')
return redirect(url)
攻撃手法: 攻撃者が以下のようなURLを使用して、ユーザーを悪意のあるサイトにリダイレクトすることが可能です。
http://example.com/redirect?url=http://malicious-site.com
脆弱なコード:
const express = require('express');
const app = express();
app.get('/redirect', (req, res) => {
const url = req.query.url;
res.redirect(url);
});
app.listen(3000);
攻撃手法:
攻撃者がurl
パラメータに悪意のあるURLを指定して、ユーザーをフィッシングサイトにリダイレクトすることが可能です。
http://example.com/redirect?url=http://malicious-site.com
脆弱なコード:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.view.RedirectView;
@Controller
public class RedirectController {
@GetMapping("/redirect")
public RedirectView redirect(@RequestParam("url") String url) {
return new RedirectView(url);
}
}
攻撃手法: 攻撃者が以下のようなURLを使用して、ユーザーを悪意のあるサイトにリダイレクトできます。
http://example.com/redirect?url=http://malicious-site.com
PHPの例:
<?php
$url = $_GET['url'];
$allowed_urls = ['http://trusted-site.com', 'http://example.com'];
if (in_array($url, $allowed_urls)) {
header("Location: $url");
exit();
} else {
echo "Invalid URL";
}
?>
Pythonの例(Flask):
from flask import Flask, request, redirect
app = Flask(__name__)
@app.route('/redirect')
def safe_redirect():
url = request.args.get('url')
if url.startswith('/'):
return redirect(url)
else:
return "Invalid URL"
Node.jsの例(Express):
app.get('/redirect', (req, res) => {
const url = req.query.url;
const allowedBaseUrl = 'http://example.com';
if (url.startsWith(allowedBaseUrl)) {
res.redirect(url);
} else {
res.send('Invalid URL');
}
});
まとめ: オープンリダイレクト攻撃は、ユーザーを悪意のあるサイトに誘導するための攻撃です。ホワイトリスト方式の導入、相対パスの使用、リダイレクト先の検証とサニタイズなどの防止策を実施することで、この脆弱性を効果的に防ぐことが可能です。各プラットフォームや言語に共通する問題であるため、これらの対策を適用することが推奨されます。