log

安全なwebアプリケーションの作り方 258-291

  • ファイルアップロードについて
    • でかいファイルを連続で大量に送る→DoS攻撃が出来る
      • 容量制限とかが有効
      • 小さくしすぎるとアレなので、要求を満たす範囲で可能な限り小さくする←見極め大変そう
      • そもそもDoS攻撃耐性高めるために、LimitRequestBodyを制限するとリクエストエラー出せていいかも?
      • DoS攻撃耐性高めるにはこれだけだと死で、メモリ量とかCPU負荷とか伸長後(これ解答後って意味だよね?)のサイズとか見るべき
    • サーバ上のファイルをスクリプトとして実行→全部ヤバイ
      • OSコマンドインジェクションと同じぐらいヤバイ
    • 罠を含むファイルをダウンロードさせる→ウイルスとか
      • ユーザのPC上でJS実行とか、マルウェア感染とか、色々起こる。
      • ファイルダウンロードしたのにJS実行される理由:ブラウザにファイルをHTMLだと誤認させられるから。
      • マルウェアとかは、こういう脆弱性を悪用した感じのやつ。
      • 直接的な責任は脆弱性をついた人間にあるんだけど、サイト運用してる側も怒られる場合があるから、web appの性質を元に対策実施するかどうか決定すべき!
    • ファイルの権限を超えたダウンロード→まあ明らかにヤバイ
      • ファイルに対するアクセス制限をかけるべき
      • 推測出来るURLにしない!

  • アップロードファイルによるサーバ側スクリプト実行
    • ものによっては利用者がアップロードしたファイルを公開ディレクトリに置いたりする。←やばすぎ
    • 拡張子としてphp, asp, aspx, jsp とかのスクリプト言語のが指定出来たりする←やばやばのやば
    • 対策:公開ディレクトリに置かない/拡張子を実行可能性のないものに制限する
      • 拡張子だけだと抜けがあるので、公開ディレクトリに置かないのをメインに対策する。→スクリプト経由でダウンロード、「ダウンロードスクリプト」って呼ぶことにするね
      • SSI(Server Side Include)という機能はHTMLからコマンド実行出来るとかいうヤバイものを持ってるので、ものによってはhtmlもダメになるから、white list 方式のほうがいいし、まずダウンロードスクリプトを使うべき。
      • ダウンロードスクリプトについては長いからp.266
      • これ、途中のコードに「IEだとXSSがあります」って書かれてたんだけど、全然わからなかった………;;
  • ファイルダウンロードによるXSS
    • pngを想定してるんだけど、攻撃者がアップロードしたpng内にHTMLタグが含まれてるとJSが実行されたりする→ファイルダウンロードによるXSS
    • ユーザのブラウザがHTMLやPDFだと誤認するようなファイルをアップロードして、ユーザに見させる(ダウンロードさせる)→ユーザのブラウザが誤認するとXSS攻撃成立
    • 対策:ファイルのContent-typeを正しく設定する/拡張子と中身(マジックバイト)が対応しているか確認する/ダウンロードを想定したファイルにContent-Disposition:attachmentを指定する
    • 画像によるXSSはIE8以降だと対策されてる…はずだけど、それ以前のブラウザ使ってる人間はまだ存在するので、ちゃんと対策しよう(アップデートしろ!!)
      • たとえば、<script>alert(‘XSS’);</script>って中身だけのファイルをa.pngって名前で保存して、IE7で表示するとalertが出る(やばすぎ)
      • 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使うな!!!!!!!!!!!!!!
    • 対策は、アップロード時とダウンロード時にする
      • アップロード時:拡張子チェック/マジックバイトチェック
        • IEだとXSS出来ますってやつ、やっとわかった。マジックバイトチェックしてないからっぽい。
        • →拡張子とイメージ形式(マジックバイト)が一致してないとエラー出してるから、あってそう!
        • BMP形式、対策してもHTMLと認識される場合がある。アプデしたらOK。てかそもそもあんまりよくないからPNGで代替するべき、Webで使用するな
      • ダウンロード時: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章読み終わりたかったのに疲れて終わってしまった……………