徳丸本を久々に読んでXSS、SQLインジェクション、CSRFなどの盲点を復習した


概要

「安全なWebアプリケーションの作り方」という包括的にWeb技術のセキュリティが書かれた本があるのですが、それを久々に読んで盲点だったなーと思うことをまとめました。

  • アプリケーションレイヤーで対策できること
  • サーバー・インフラレイヤーで対策できること

に分けてまとめていきます。

アプリケーションレイヤーで対策できること

XSS対策の盲点

セッションIDのCookieにHttpOnlyを付与しよう

基本はhtmlspecialcharsですが、それ以外に盲点になりそうな対策として、クッキーにHttpOnly属性を付与するというのがあります。

セッションIDのCookieHttpOnlyを付与することで、万が一XSS脆弱性があってもセッションIDが盗まれることがなくなります。

HttpOnlyというのは、JavaScriptなどのHttp以外の読み取りに対するOnlyなんですね。

URLを動的に生成する部分ではURLとして正しいかどうかのチェックをしよう

滅多にはないと思いますが、動的に生成されるURLが画像に対するhrefとかsrcだった場合、javascript:HOGEHOGEという形式の文字列がそこに入ると任意のJavaScriptを実行できてしまいます。

なので、そういった出力パタメータにはhttp(s)から始まっているかどうかのチェッカーを挟みましょう。

とはいえあるかな・・・だいたいURLはサーバー側で生成している気がする。が。

CGMなどでユーザーにHTMLタグの入力を許可する場合は表示していい要素だけ逃してエスケープしよう

https://github.com/paquettg/php-html-parser
こういうライブラリを使って、HTMLの内容をパースして個別でタグに包んであげる、という感じでしょうかね。その際に中身をエスケープすれば無事で済みそうです。

SQLインジェクション対策の盲点

もちろん静的プレースホルダー利用一択なのはわかった上で。さらにやったほうがいいこと。

アプリケーションを操作するアカウントのデータベースの権限を適切に設定する

これはうっかりしそう。
アプリケーション側から利用するデータベースユーザーが例えばTableの削除権限を持っている必要はありませんし。

データベース消されるとかが一番ひどいので、こういった根っこの対策はやっておいて損は無さそう。

例えばこのページに権限の一覧が書かれているようなので参考までに。
権限の種類と設定されている権限の確認

CSRF対策の盲点

何度見てもCSRFはどういう脆弱性なのか説明が難しいですね。

ざっくりいうと、僕が作ったサイトからTwitterのパスワード変更画面にリクエストを飛ばして、それをTwitterが承認したらやばいよねってやつです。
偽サイトをいくらでも作れてしまいます。

なので、CSRF対策とは、あるリクエストが本物のユーザーによる当サイトからのアクセスであることを証明する手段ということになります。

まずはCSRF対策が必要なページを探そう

全ページに上記の対策をしたら大げさだし、そもそも自然流入してくる人たちまで弾かれちゃうのでやめましょう。

トークンで対策しよう

トークン埋め込みが一般的だけど・・・
JWTが一昔前に流行りましたね。
JWT(JSON Web Token)でCSRF脆弱性を回避できるワケを調べてみた話

このQiita見たら多分思い出せる。手前味噌ですが。

サーバー・インフラレイヤーで対策できること

Webサーバーそのものの対策

脆弱性情報をRSSで監視しよう

こういうのちゃんとキャッチアップしないとなぁ。。。
https://jvn.jp/rss/

ポートスキャンを掛けて不要なポートが空いていないかを確認しよう

SSHは特定のIPからしか許可しないようにしましょう。

CloudWatch LogsでSSHへの不正アクセスを検知し、通知を受ける。

上記の記事のように検知する仕組みを作るのもいいなと思います。

SSHサーバーのパスワード認証を辞めて公開鍵認証のみにしよう

総当たり攻撃を仕掛けられる可能性があるので、パスワード認証はそもそも避けておくべきです。

サーバー自体の見直しをしよう

Linuxサーバーのセキュリティに関してはこの記事がとてもわかり易くてよかったです。

そこそこセキュアなlinuxサーバーを作る

まとめ

Webセキュリティは壊滅的なリスクを回避するためのスキルであるがゆえに、どうしても経営層とか企画レイヤーから甘く見られてしまう背景もあると思っていて、意識的にエンジニアサイドが身につけていかないと、と個人的には危機感を持って学んでいきたいなーと思っています。

おすすめのサイト、書籍などありましたら是非コメントやTwitterにて教えていただければ幸いです!!