👿

Webアプリケーションに関する脆弱性をまとめてみる(前編)

2023/01/19に公開

きっかけ

セキュリティに関して、結構弱い自覚があったため、
職場の先輩から話も聞き、「情報処理安全確保支援士試験」の受験をしようかと思います。
(維持費がだいぶかかるので支援士になるかは別として)

その中で、なんとなく分かっているけど、
実際に説明しろと言われると困るような内容を改めてまとめてみました。

主な脆弱性一覧

  • クロスサイトスクリプティング(通称:XSS)
  • SQLインジェクション
  • OSコマンドインジェクション
    ↑↑↑今回はここまで↑↑↑
  • HTTPヘッダインジェクション
  • メールヘッダインジェクション
  • ディレクトリトラバーサル

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

  • 概要
    掲示板等に、悪意のあるスクリプトを実行させるようなコードを埋め込む攻撃
  • 影響
    Web上で勝手にプログラム動かされたり、当該スクリプトを通じて偽のサイトに誘導され、
    ユーザ情報を盗まれたりしてしまう。
  • 対策
    1.サニタイズする(サニタイジング)
    いわゆるエスケープ処理。「<」「>」「&」などを文字列と認識させ、スクリプトを実行させないようにする。
    2.文字コードを指定する
    ある特定の文字コード(主にUTF-7)で読み込ませたときに作動するような攻撃手法があるため、そういった挙動をさせないために、あらかじめ文字コードを指定する。
    3.入力できる文字に制限をかける
    「<」「>」など、スクリプトの記載に使いそうな文字は使用させないよう制限をかけておく。
  • 余談
    2010年と昔の話になるが、YoutubeやTwitterもこの脆弱性を利用され、ユーザに大きな被害が発生している
  • 参考
    PHPを使ってWEBアプリケーションの脆弱性を確認する[クロスサイトスクリプティング(XSS)」

SQLインジェクション

  • 概要
    ユーザがDBに情報を入力するようなページにおいて、
    不正なSQL分を挿入(インジェクション)することで、意図せぬ挙動を引き起こさせる攻撃
  • 影響
    通常閲覧できないようなデータを参照/更新出来る可能性がある

  • 以下のように「user」というテーブルから、「id」と「pass」に入力したデータがあるか判断するSQLが存在する場合
SELECT * FROM user WHERE id='入力したid' AND pass='入力したパスワード'

以下の情報をSQLに入力することで

id=kumata ※この名前は適当
pass=hoge' OR '1' = '1

以下のような入力値になり

SELECT * FROM user WHERE id='kumata' AND pass='hoge' OR '1' = '1'

WHEREの条件文の最後に「1=1」という必ず条件を満たす記述が追加されるため、
全てのユーザデータが参照できてしまう。

  • 対策
    1.バインド機構を利用し、プレースホルダと呼ばれる変数(例:「?」)で、
    入力されたSQL分を後から特殊文字含め文字列として認識させる
    2.エスケープをし、意図せぬSQL文として認識されないようにする
  • 参考
    SQLインジェクションについてまとめてみた

OSコマンドインジェクション

  • 概要
    ユーザが情報を入力し、OSのコマンドを呼び出すようなページで、
    悪意のあるコマンド操作を入力することで、意図せぬ処理を引き起こす攻撃
  • 影響
    コマンドで行える操作(参照/更新/削除 etc.)が行える

  • sendmailを利用するようなPerlの以下のようなスクリプトで、
$to_address = cgi->param{'to_address'};
$message_file = "/app/data/test.txt";
system("sendmail $to_address <$message_file");   

to_addressに以下の情報を入力すれば、/etc/passwdファイルを外部に持ち出すことが可能。

hoge@hoge.com </etc/passwd #

所感

もう少しphpとか書ければ実際に動きが見られて、理解が深められそうなので、
勉強しておいた方がよさそう。

Discussion