安全なwebアプリケーションの作り方 258-291
- ファイルアップロードについて
- アップロードファイルによるサーバ側スクリプト実行
- ファイルダウンロードによるXSS
- pngを想定してるんだけど、攻撃者がアップロードしたpng内にHTMLタグが含まれてるとJSが実行されたりする→ファイルダウンロードによるXSS
- ユーザのブラウザがHTMLやPDFだと誤認するようなファイルをアップロードして、ユーザに見させる(ダウンロードさせる)→ユーザのブラウザが誤認するとXSS攻撃成立
- 対策:ファイルのContent-typeを正しく設定する/拡張子と中身(マジックバイト)が対応しているか確認する/ダウンロードを想定したファイルにContent-Disposition:attachmentを指定する
- マジックバイト? secure coding - マジックバイトによるブラウザの画像種類判定 - end0tknrのkipple - web写経開発 これ、CTFで見たことある!
- 画像によるXSSはIE8以降だと対策されてる…はずだけど、それ以前のブラウザ使ってる人間はまだ存在するので、ちゃんと対策しよう(アップデートしろ!!)
- PDFの偽装が?????って感じ
<script>alert(‘XSS’);</script>
って中身だけのファイルをa.pdfって感じで保存して、ファイルへのリンクを取る、http://example.com/a.php?file=aaaaaa
だとする-
http://example.com/a.php/b.html?file=aaaaaa
というふうに、/b.html
を追加すると「見かけ上ファイル名のような形でパラメータを埋め込む方法」らしい、PATHINFO? - PATH_INFOを使ってスマートなURLに - あじゃぱー あ〜〜〜〜
- パラメータだと思わせて実行させてしまうから、XSSが起こるってことかあ
- これは IE7, 8 でも起こるらしい。
- PDFはapplication/pdfなんだけど、application/x-pdfっていうContent-typeを間違って指定してると起こるぽい。でもこれはIE特有なんだって
- つまり、IE使うな!!!!!!!!!!!!!!
- Content-Type周りの詳細複雑すぎるので、ちゃんと参照したいときはp-276, 277 を読もう。あとは 教科書に載らないWebアプリケーションセキュリティ(2):[無視できない]IEのContent-Type無視 (1/2) - @ITこれ。あとで読む。なんでweb関係者がIEを憎んでいるかがようやく理解出来た………
- 対策は、アップロード時とダウンロード時にする
- アップロード時:拡張子チェック/マジックバイトチェック
- ダウンロード時:Content-Typeを正しくする/マジックバイトチェック/Content-Dispositionヘッダ設定
- Content-TypeはIEにかぎらずすべてのブラウザで正しく書くべきチェックするべき。なんかマイナーなやつ使うときはユーザが正しく認識できるか確認してね。
- Content-Disposition←なにこれ? HTTP :: Content-Disposition: inline / attachment Tipsというかメモ 画像を表示させようとしてるからXSSが起きてるわけで、絶対ダウンロードさせればいいよねって話で、そういうオプション
- これまでの対策は最低限だから、仕様策定するときにちゃんと考える
- サービス提供用のドメインと画像用ドメインわけるの、高速化的にもセキュリティ的にも良いから考慮するべき
- !!!!! Content-type/拡張子/マジックバイト!!!!!
- 最近は画像投稿出来るサイトが増えてるからちゃんとしようね
- ファイルインクルード攻撃
- 他のファイル読み込むやつ、include とか require とか、そういうところで外部ファイル読み込むと実行しちゃうから、やばい
- 対策:パス名に外部からのパラメータを含めない/含めるときは英数字に限定する←これなんかと一緒だよね→ディレクトリトラバーサルの対策と一緒!!
- 途中までは一緒だけど、この攻撃はスクリプト読み込んで実行出来るからディレクトリトラバーサルよりヤバイ
- RFI(Remote File Inclusion):ファイル名としてURL指定すると取ってくるやつだけど、ヤバすぎてデフォルトで無効になった
- セッション保存ファイルの悪用:セッション情報のファイル名、保存パスとセッションIDを元に決められるんだけど、OSによってデフォルトが決まってるから、それを変更せずに使ってるのは多い!ヤバイ!セッションIDは🍪からわかる!→→→セッション情報のファイル名が特定出来るので、それをURLに指定して%00で終わってやればスクリプト実行出来る
- 対策:外部からファイル名指定できなくする/ファイル名にディレクトリ名を含めない/ファイル名を英数字に限定する:ディレクトリトラバーサルと一緒だね
今日で4章読み終わりたかったのに疲れて終わってしまった……………