PHPコードレビューの課題2: filter_var()関数の脆弱性

脆弱性分析

以下のコードを例にとって、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。これにより、curlls、そしてtest.comという3つのコマンドが実行されます。

実際の脆弱性

Anchor 0.9.2版において、404エラーテンプレートにXSS脆弱性が存在します。

themes/default/404.phpファイルを開き、current_url()関数を追跡します。これはsystem/Uri.phpファイル内のdetect()メソッドによって処理されます。

detect()メソッドは$_SERVER配列からREQUEST_URIPATH_INFOORIG_PATH_INFOを取得し、それらをfilter_varparse_urlで検証します。

Payloadとして以下を使用します: localhost/anchor/index.php/<script>alert("XSS")</script>。これにより、XSS攻撃が実行されます。

タグ: PHP Twig XSS CTF コードレビュー

7月10日 23:39 投稿