脆弱性体験学習ツール AppGoat 学習メモ

概要 

 脆弱性体験学習ツール「AppGoat」を使用し、セキュリティに関することを学んだ。この記事では、「AppGoat」で学んで必要だと思ったことを書いていきたいと思う。以下に「AppGoat」に関する説明は以下に記述しています。

脆弱性体験学習ツール「AppGoat」は、脆弱性の概要や対策方法等の脆弱性に関する基礎的な知識を実習形式で体系的に学べるツールです。利用者は、学習テーマ毎に用意された演習問題に対して、埋め込まれた脆弱性の発見、プログラミング上の問題点の把握、対策手法の学習を対話的に実施できます。 

www.ipa.go.jp

目次

 

XSS(クロスサイトスクリプティング

 XSSとは、スクリプトをサイトに送り込み、スクリプトを含むHTMLを出力してブラウザ上で実行させる攻撃である。また、開発者が最も作りやすい脆弱性である。

✔ 種類

  • 格納型(直接攻撃)

  ➡ウェブアプリケーションがユーザーから受け取った入力データを格納した後、入力データをそのままの形で出力に利用してしまうこと。

  • 反射型(間接攻撃)

  ➡ウェブアプリケーションがユーザーから受け取った入力データをそのままの形で出力に利用してしまうこと。

  • DOMベース型  

  ➡ JavsScriptなどからDOMを用いて、動的に文章構成を変更するウェブページに存在しうる、脆弱性

✔ 検査方法

  • 脆弱性があるサイトでの動作「'>"><hr>」を入れて送信すると水平な戦が表示される

✔ 対策

  • 出力する要素に対してエスケープ処理を行う
  • DOMベースの場合はDOM操作用メソッドを使用して表示させるようにする。

 

SQLインジェクション

 SQLインジェクションとは、データベースを攻撃して悪用すること。主に、情報を抜き取ったり、改ざんしたりする。 

 ✔ 一般的な影響

  • データベースに蓄積された非公開情報を閲覧される
  • データベースに蓄積された情報を改ざん、消去される
  • 認証回避により不正ログイン
  • ストアドプロシージャなどを利用したOSコマンドを実行される

✔ 種類

 

プレースホルダ

プレースホルダとは、実際の内容を後から挿入するために、とりあえず仮に確保した場所のこと。  

e-words.jp

    ➡ 後から構文を変化することがないため安全

    ➡ ライブラリの実装に問題があると、SQL文を変化させるようなSQLインジェクションをゆるしてしままうため注意が必要

検査方法

  • 「'」(シングルクォーテーション)を入れて検査を行う 

対策方法の例

  1. プレースホルダーのままのSQL文を送信する
  2. 実行前に構文を解析し、SQL文の構文を確定する
  3. プレースホルダーに値をバインドしてSQL文を実行する
  4. SQL文の事項結果を返す。

✔ブラインドSQLインジェクション

 実行結果を画面に出力しないSQL文において、SQLインジェクション脆弱性があることを、ブラインドSQLインジェクション脆弱性と呼ぶ。

 データの存在有無を確認するSQL文では、実行結果を1ビットで返します。これを悪用し、調べたい内容の先頭文字がAかどうかを判断し、Aではない場合はB,C,D…と判定を繰り返せばいつかは先頭文字を特定することができる

 

CSRF(クロスサイト・リクエスト・フォージェリ)

 CSRF脆弱性とは、WEBサイトにログインしたユーザが悪意のある人によって予め用意された罠により、意図しないリクエストを実行させられてしまう脆弱性である。意図しないサービスの利用をさせられてしまう危険性がある。

一般的な影響

  • ログインしたユーザのみが利用可能なサービスを悪用される
  • ログインしたユーザのみが編集可能な情報を改ざんされる 

検査方法①

   ①購入・更新処理が行われる画面のソースコードを表示
   ②formタブの中を確認
   ③hidden属性にトークンを持っていない、また推測可能である場合、

    脆弱性の可能性あり

確認方法②

  • パスワード再確認の有無

   ①購入・更新処理が行われる画面からパラメーターを設定して送信
   ②パスワードの入力を求められない場合、脆弱性の可能性あり

確認方法③

対策方法

  • hidden属性に機密情報を挿入する
  •  token値が連番の値を対策するには、機密情報として安全な疑似乱数を利用する(Session_id)

 

④バッファ・オーバーフロー

 バッファ・オーバーフローの脆弱性とは、プログラムは様々なデータをメモリに格納しています。その中で、外部からのデータ入力によって、プログラムが用意したメモリ領域からデータが溢れてしまうことで発生する脆弱性である。

✔ 影響

  • プログラムの異常終了
  • 外部から任意のマシンコードを実行させられる 

✔ 種類

  ➡ ローカル変数のなどのために確保される領域で発生するタイプ

  ➡ 特別な関数によって明示的に確保される

✔検査方法 

  • 画面入力パラメーターにFiddlerなどの検査ツールを使用して、入力項目の最大文字数を超える大量の文字列を入れてリクエスト送信

  ➡ データがオーバーフローした場合、エラーメッセージが表示される

  • 制限を超えた文字列の入力

対策方法

  • 安全な関数を利用する
  • 動的にバッファを確保する

   ➡ 可変長の入力値に対して固定長のバッファを用いる

 

⑤その他

  • ディレクトリ・トラバーサル
  • OSコマンド・インジェクション
  • セッション
  • HTTPヘッダインデクション
  • メールヘッダインデクション

 

⑥用語

バインド

バインドとは、束縛(する)、拘束(する)、結びつける、関連付ける、などの意味を持つ英単語。 ITの分野では、何らかの要素やデータ、ファイルなどが相互に関連付けられている状態や、そのような状態を実現する機能などのことを指すことが多い。入力値にSQL構文を構成する文字列を含ませることでSQL文の意味を変更させ、意図しないSQL文実行されてしまう可能性がある。   

e-words.jp

 

ストアドプロシージャ

ストアドプロシージャ (stored procedure) とは、データベースに対する一連の処理をまとめた手続きにして、関係データベース管理システム (RDBMS) に保存(永続化)したもの。 永続格納モジュール (Persistent Storage Module) とも呼ばれる。

ja.wikipedia.org

 

スクリプト

document.getElementById("ID名").属性名="変更する値"