akkietech’s diary

セキュリティ関連メインの自分用メモ書き。twitter: @akkietech

2/26 脆弱BBSを使って、CSRFとXSSを実践

■動機
簡単に言えばXSSCSRFを本格的に実践してみたくなった


CSRFが分からなかった
SOCをやっていながら、「CSRFを説明して」と聞かれたら
完璧どころかおおまかも説明できる自信がなかった

まず実践するにあたり復習から始めた
下記がすごく参考になった
https://qiita.com/sagami1991/items/23f72ab4e6552221188a

CSRF攻撃の内容として、リンクを踏むことで
攻撃側が用意したページに飛ばされ、スクリプトが動作するなどして
標的Webページに意図せぬ処理をさせるというもの


CSRFXSSの違いとは
クロスサイトリクエストフォージェリー(CSRF)
クロスサイトスクリプティング(XSS)

似ているようで全く違う

CSRFはあくまで、標的Webページでの意図せぬ
・ログイン情報変更だったり
掲示板への投稿だったり

と意図しない処理が行われるもの

一方でXSSは(多分だけど)、javascriptを使用して
cookie情報の窃取だったり
・Webコンテンツの改ざんだったり

難しんんだが、XSSの方が手法として様々なことが行える印象がある


■実践してみた
・脆弱な簡易掲示
以前にflaskで作成したWebページを改良し
CSRFXSS脆弱性を持つ簡易掲示板を作成した

ただflaskは、デフォルトでエスケープ処理が施されるため、
あえてエスケープ処理を外す必要があった

{% autoescape false%}
{{ [出力する内容] ))
{% endautoescape %}

こんな感じで{% autoescape false%}を明示する必要がある

CSRF攻撃用のWebサイト
そして上記リンクを参考にし、攻撃用サーバにアクセスするだけで
BBSに投稿されるというものを用意した

やってみた感想
CSRFできた!ほんとに直接BBSにアクセスしていないのに
 攻撃側で用意した内容が投稿されていた

XSSに関しては、今回は標的が掲示板なので
 格納型XSSを実践することにした。
 確かに下のスクリプトを、エスケープ無効にした掲示板に投稿すると
 アクセスするたびに警告が出るようになった

<script>alert('xss')</script>


■対策
各攻撃に対する基本的な対策はこんな感じらしい

CSRF
トークンを生成し、session内のトークンとformのhiddenで送られるトークンが一致しているか確認
一致している場合のみ正規の投稿なのでリクエストを受け付ける
一致していなければCSRFの疑いがある

XSS
出力内容をエスケープ処理させるのが良いらしい
phpであればhtmlspecialchars的なものを使うのかと

■まとめ
CSRFXSSを実際に見て触ることでどういった攻撃なのか
より理解することができた
というかこの2つは特にセキュリティ初心者にとっては分かりにくい攻撃なので
見て実践してもらうのが一番良いと思う

Web開発をしている人たちにとってこのあたりの理解は重要っぽいが
自分のようなSOCをやっている人にとってもこのあたりを
理解できることでセキュリティスペシャリストの階段を1つ登れるのかな