8割解けるCTF「WEST-SEC」

セキュリティ初心者の方でも楽しめるゲーム形式のセキュリティイベント

クロスサイト攻撃

1.XSS

(1)クロスサイトスクリプティングとは

XSS(クロスサイトスクリプティング)について、以下に基本的な説明があります。
クロスサイトという言葉の通り、攻撃者のサイトと、正規のサイト(脆弱性有り)をクロスさせて攻撃を仕掛けます。
https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html

対処策に関しても、↑に記載があります。代表例は「エスケープ処理」によって、script系の文字列を、無害な文字列に変換することです。

(2)簡単なXSSをやってみる

R3秋SC午後Ⅱ問1の内容をもとに、実際にPHPで動作を確認しましょう。
https://www.ipa.go.jp/shiken/mondai-kaiotu/gmcbt8000000apad-att/2021r03a_sc_pm2_qs.pdf

❶なにも対処をせずにページを作る。
・description.php

<html>
<meta http-equiv="content-type" charset="UTF-8">
備考:
<form action="./submitdescription.php" method="post">
    <input type="text" name="description" value=""><br>
    <input type="submit" value="送信" >
</form>
</html>

以下のフォームができる。文字を入力しよう。

・submitdescription.php

<html>
<meta http-equiv="content-type" charset="UTF-8">
備考:
<?php
print($_REQUEST['description']); 
?>
です。
</html>

送信ボタンを押した後の画面

❷XSSを仕掛けてみる
ここで、入力フォームに以下を入れる。

<script>alert('XSS!')</script>

すると、アラートが出る

これが、XSSの脆弱性である。

❸別のページに遷移させる
先の入力フォームで、以下をいれてみよう。

<script>window.open('https://west-sec.com');</script>

すると、WEST-SECのページに自動で遷移してしまう。
今回、description.phpは、method="post" であるが、遷移先の submitdescription.php に対して、以下のURLを作ってアクセスすれば、同じことができる。
※description.phpのmethodがgetかpostかは関係がない。
※URLは<などのが入っているので、URLエンコーディング処理をしています。

http://www.example.com/submitdescription.php?description=%3Cscript%3Ewindow.open%28%27https%3A%2F%2Fwest-sec.com%27%29%3B%3C%2Fscript%3E

もし、www.example.comが著名なサイト(でも、XSSの脆弱性あり)であった場合、上記のリンクを広く送れば、www.example.comの安全なサイトと思ってクリックする可能性がある。でも、実際には、WEST-SECのページに遷移する。こうやって複数のサイトをまたいで(クロスして)、攻撃をするのがクロスサイトスクリプティング(XSS)。

❹エスケープ処理を入れてみる。
htmlspecialchars を使ってエスケープ処理をします。
submitdescription.php において、以下に修正

<html>
<meta http-equiv="content-type" charset="UTF-8">
備考:
<?php
print(htmlspecialchars($_REQUEST['description'])); 
?>
です。
</html>

Wiresharkで、HTTPレスポンスのボディ部を見ると、以下になります。

以下のように、「<」が「<」、「>」が 「>」にサニタイズ処理されいます。

&lt;script&gt;window.open('https://west-sec.com');&lt;/script&gt;です。

URLをクリックしたとしても、ページ遷移はせずに、以下のように文字列が表示されます。

(3)簡単なXSSをやってみる2

R3秋SC午後Ⅱ問1の内容は同じですが、今度はURLを入れる部分も作ります。
https://www.ipa.go.jp/shiken/mondai-kaiotu/gmcbt8000000apad-att/2021r03a_sc_pm2_qs.pdf
❶URLの入力フォームを加える

<html>
<body>
<meta http-equiv="content-type" charset="UTF-8">
<?php
echo "備考:".$_REQUEST["description"]."<br/>\n";
echo "参考URL:<a href=\"" . $_REQUEST["refURL"] . "\">" . $_REQUEST["refURL"] . "</a>\n";
?>
</body>
</html>

❷XSSを試してみる
支援士 令和3年 午後Ⅱ問1
この過去問の選択肢のウとエをフォームに入れてみましょう。

ウ:http:<script>alert('XSS!')</script>
エ:javascript:alert('XSS!')

→ウはポップアップが出ます。エは、遷移先のページで、リンクをクリックするとポップアップアップがでます。

ウは、以下がレスポンスのボディに記載されます。

<a href="http:<script>alert('XSS!')</script>">http:<script>alert('XSS!')</script></a> 

<a href=" の部分ではなく、その中のhttp:でHTTPプロトコルの処理と認識され、<script>alert('XSS!')が実行されるのでしょう。

エは以下がボディに記載されます。

<a href="javascript:alert('XSS!')">javascript:alert('XSS!')</a>

❸エスケープ処理を入れる
htmlspecialchars を使ってエスケープ処理をします。
submitdescription.php において、以下に修正

<html>
<body>
<meta http-equiv="content-type" charset="UTF-8">
<?php
echo "備考:".htmlspecialchars($_REQUEST["description"])."<br/>\n";
echo "参考URL:<a href=\"".htmlspecialchars($_REQUEST["refURL"])."\">".htmlspecialchars($_REQUEST["refURL"])."</a>\n";
?>
</body>
</html>

すると、さきほどのウに関しては、エスケープ処理をされてしまい、<script>などが文字列として処理されます。ポップアップは表示されず、以下の画面になります。

であれば、以下のようなリンクは存在しないので、クリックをしても「Not Found」エラーになります。つまり、XSSは成功しません。

http:<script>alert('XSS!')</script>

エに関しては、エスケープ処理が実行されても何も変わらないので、遷移先のリンクをクリックするとポップアップが起動します。

❹対策
つまり、エのように、URLとしてhttp:からではなく、javascript:で始まるURLは危険です。
対策に関しては、以下のサイトに記載があります。
安全なウェブサイトの作り方 - 1.5 クロスサイト・スクリプティング | 情報セキュリティ | IPA 独立行政法人 情報処理推進機構

利用者から入力されたリンク先のURLを「<a href="リンク先のURL">」の形式でウェブページに出力するウェブアプリケーションは、リンク先のURLに「javascript:」等から始まる文字列を指定された場合に、スクリプトを埋め込まれてしまう可能性があります。リンク先のURLには「http://」や「https://」から始まる文字列のみを許可する、「ホワイトリスト方式」で実装してください。