ketyiaの作ってみた

このサイトでは作ってみたことを記事にまとめていきます!

PHPでクロスサイト・スクリプティング攻撃を体験してみよう!

こんにちは!IT勉強中のKeitaです!

最近は毎日のようにサイバー攻撃が多発していますね。。
特に脆弱性(アプリケーションの弱点)人の心理を利用した攻撃がとても目立っているなと感じます!

これらの攻撃の被害を受けた対象は、信用(組織の場合)お金を失うことになってしまい、昨今サイバーセキュリティの知識や技術は、ITにかかわる全ての人が身につけなくてはいけないものとなっています!

ただ、セキュリティって学ぶのが大変だなと主観的に感じています!色々な攻撃があったり、対策を知っておかなければならなかったり、覚えていくの大変です。。

なので、サイバー攻撃をデモ形式で実際に体験しながら学んでいこうと思います!
本記事では、クロスサイト・スクリプティング攻撃というものについてまとめていきます!

※この攻撃自体犯罪なので、自分のローカル環境以外では絶対やらないでください!


クロスサイトスクリプティング攻撃とは?

ユーザが入力できる形式のサイト(アンケート、掲示板、登録フォーム等)に、攻撃者が悪意のあるスクリプト偽リンクを埋め込むことで個人情報を奪うことや混乱を起こす等の目的がある攻撃です!

この攻撃で受けた被害は下記です!IPAの情報を引用させていただきます!
(引用:https://www.ipa.go.jp/security/vuln/websecurity-HTML-1_5.html)

「iLogScanner」におけるクロスサイト・スクリプティングの脆弱性
「Aflax」におけるクロスサイト・スクリプティングの脆弱性
「Movable Type」におけるクロスサイト・スクリプティングの脆弱性

というような攻撃です!結構被害を与えている攻撃なんですね。。
では、さっそく体験していこうと思います!


体験してみよう ~攻撃サイド~


デモとして掲示板投稿サイトを想定します!

入力した内容が表示されるという単純なWEBサイトです。
ここに架空請求サイトに遷移させるスクリプトを埋め込んで、次から投稿をしたユーザに架空請求サイトへ遷移させるという攻撃をいきます!

用意した画面は下記です!

このサイトの入力処理は下記のようになっています!

ーーーーーーーーーーーーーーーーー
【index.php
<?php
session_start();


$text ='';
$content = '';

if(isset($_SESSION['text'])){
    $text = $_SESSION['text'];
    unset($_SESSION['text']);
}
if(isset($_SESSION['content'])){
    $content = $_SESSION['content'];
    unset($_SESSION['content']);
   
}

$html = file_get_contents('input.html');


$html = str_replace('{{text}}',$text,$html);
$html = str_replace('{{content}}',$content,$html);

print($html);

?>
ーーーーーーーーーーーーーーーーー

ちなみに、HTMLはこのようになっています!

ーーーーーーーーーーーーーーーーー
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>デモ 掲示</title>
</head>
<body>
    <h1>デモ 掲示板投稿</h1>
    <form action="comp.php">
        <label>題名</label>
        <input type="text" name="text" value="{{text}}"><br>
        <label>内容</label>
        <textarea name="content" id="content" cols="30" rows="10">
{{content}}</textarea>
        <input type="submit" value="投稿">
    </form>
</body>
</html>
ーーーーーーーーーーーーーーーーー

この画面にスクリプトを打ち込んで、架空請求サイトに遷移させるようにします!

架空請求サイトは適当に作成しました。

それでは、下記のコマンドを入力しましょう!

ーーーーーーーーーーーーーーーーー

<script> window.onload=function(){ location.href="hack.html"; }; </script>

ーーーーーーーーーーーーーーーーー




これでスクリプトの埋め込みが完了しました!
これで攻撃は完了です!すごく簡易的なものですが、投稿一覧サイトに遷移しようとすると、架空請求サイトページが遷移されるようになるはずです。

確認してみましょう!


体験してみよう ~ユーザサイド~

さて、一通りの投稿までの動作を行ってみましょう!
下記画像のように試しました!
※下記のURLはデモ掲示板一覧のものです。

突然こんなページが表示されたら怖いですね。。
これがクロスサイトスクリプティング攻撃です!今回のスクリプトは遷移させるという内容でしたが、このスクリプトの内容次第でもっとグロイことができるので、絶対に対策をしなくてはいけない攻撃です!

次からは対策について書いていきます!

対策

今回書いている言語のPHPで対策していきます!
入力された値をすべて文字列だと認識させれば、スクリプト自体も文字列と判断され、処理を起こさなくなります!

PHPのコードで文字列を置き換えする箇所を下記のように書き換えてみましょう!

ーーーーーーーーーーーーーーーーー
<?php
$html = str_replace('{{text}}',htmlspecialchars($text),$html);
$html = str_replace('{{content}}',htmlspecialchars($content),$html);
?>

ーーーーーーーーーーーーーーーーー
 

では、データベース側で先ほどのスクリプト
を削除してから動作確認してみましょう!

下記の動作です。

ただの文字列として登録されるようになりました!
これで、クロスサイトサイトスクリプティング攻撃は防げました!

最後に

という感じでクロスサイトスクリプティング攻撃についてや動作と対策についてまとめていきました!
WEB系はセキュリティを保つのが難しいといわれてますが、このような攻撃一つ一つ対策していくことで、最悪なことになることを避けていけると思うので、しっかり理解していきたいですね!

ここまで読んでいただきありがとうございました。