【AppGoat】学習メモ
目次
はじめに
本記事について
本記事の内容の多くは IPA が提供している AppGoat からのものになります。
Webサービスなどを開発するに当たって、脆弱性を防ぐためにはどんなコードを書くべきなのかを教えてくれます!個人的にすっごく勉強になったので、記事にまとめてみたいと思いました。
本記事の内容は、AppGoat のほんの一部に過ぎないので、良かったら使ってみてください!
AppGoat とは
AppGoat(脆弱性体験学習ツール)とは、脆弱性の概要や対策方法等の脆弱性に関する基礎的な知識を実習形式で体系的に学べるツールです。
脆弱性とは
脆弱性とは、プログラムの不具合や設計上のミスが原因となって発生した情報セキュリティ上の欠陥のことです。つまり、弱点!
クロスサイト・スクリプティング(XSS)
概要
XSS(Cross Site Scripting)とは、悪意のある人が不正なスクリプトを何らかの手段でウェブページに埋め込むことで、その不正なスクリプトが被害者のブラウザ上で実行されてしまう脆弱性です。
影響
種類
- 格納型(直接攻撃するタイプ)
- 反射型(間接的に攻撃するタイプ)
- DOM型ベース
検査方法
受け取った入力データを、エスケープ処理を行わずに画面に出力している箇所があれば、クロスサイト・スクリプティングの脆弱性になります。
※ エスケープ処理:特別な意味を持つ文字を、特別な意味を持たない表記文字に置換すること
対策方法
出力する要素にエスケープ処理をします。
例(PHP):htmlspecialchars()
SQLインジェクション
概要
SQLインジェクションとは、悪意のあるリクエストにより、ウェブアプリケーションが意図しないSQL文を実行してしまうことで、データベースを不正に操作されてしまう脆弱性です。
影響
- データベースに蓄積された非公開情報を閲覧される
- データベースに蓄積された情報を改ざん、消去される
- 認証回避により不正にログインされる
- ストアドプロシージャなどを利用したOSコマンドを実行される
※ ストアドプロシージャとは、データベースに対する一連の処理をまとめ、関係データベース管理システムに保存したものです。
種類
- 文字列リテラルに対するSQLインジェクション
- 数値リテラルに対するSQLインジェクション
検査方法
SQL文の構成時に入力された値をそのままSQL文に使用する箇所があれば、SQLインジェクションの脆弱性になります。
対策方法
プレースホルダの種類
補足
ブラインドSQLインジェクションとは、SQLインジェクションの手法の一つです。一度に1ビットの情報しか得られないため、何度もSQL文を実行する必要があります。そのため、通常はツールを用いてブラインドSQLインジェクションの攻撃を行います。
一般的には以下のことによって攻撃されることが考えられます。
- IDの重複チェックによる判断
- ログイン成否による判断
- エラーの有無による判断
- sleep句を用いたレスポンス遅延による判断
例:input_id' AND SUBSTR((SELECT password FROM user WHERE id=1), 1, 1) = 'a' --
CSRF(クロスサイト・リクエスト・フォージェリ)
概要
CSRF(Cross Site Request Forgeries)の脆弱性とは、ウェブサイトにログインしたユーザが、悪意のある人によってあらかじめ用意された罠により、意図しないリクエストを実行させられてしまう脆弱性です。
影響
- ログインしたユーザのみが利用可能なサービスを悪用される
- ログインしたユーザのみが編集可能な情報を改ざんされる
検査方法
パスワードや公開範囲などの変更、商品の購入と行った重要な操作が行える画面において、
この3つ全てを満たす場合にクロスサイト・リクエスト・フォージェリの脆弱性になります。
※ トークンとは、利用者確認のために使われる秘密情報のことです。
※ Refererとは、Webサイトに到達する参照元となったWebサイトのこと
対策方法
- hidden属性に秘密情報を挿入する
- 秘密情報として安全な疑似乱数を利用する(例:session_id)
バッファオーバーフロー
概要
バッファオーバーフローとは、外部からのデータなどによって、プログラムが用意したメモリ領域からデータがあふれてしまうことで発生する脆弱性です。
影響
- プログラムが異常終了させられる
- 外部から任意のマシンコードが実行される
種類
- スタック領域におけるバッファオーバーフローの脆弱性
- ヒープ領域におけるバッファオーバーフローの脆弱性
検査方法
入力された値がバッファからデータがあふれて処理が中断した箇所があれば、バッファーオーバーフローの脆弱性になります。
対策方法
- 安全な関数を利用する
- 動的にバッファを確保する