Webアプリケーションの脆弱性についてDVWAで学習してみた

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Webアプリケーションの脆弱性について、また攻撃手法や対策についての理解をするためにブログにしました。

目次

  • 脆弱性について
  • 攻撃手法
  • まとめ

脆弱性について

脆弱性とは、開発者の意図しない動作をすること(改ざんやアプリケーション停止など)や、認証を不正に突破されるなどが原因で起きてしまう。対策としては開発したものについては脆弱性診断を行う。認証情報の使いまわしはリスクがあるため別々のものにする(他サイトで攻撃があった場合パスワード等漏洩してしまうため)などがあげられます。実際の攻撃手法はどのようなものがあるか見ていきましょう。

攻撃手法

SQLインジェクション

データベースにはSQL文でデータ制御やデータの定義を行っています。攻撃者がSQL文を悪意のあるものへ変えて入力して、本来想定されていない動きをさせる攻撃です。
例えば会員サイトにてSQLインジェクションの脆弱性がある場合、特殊文字を使用することでデータベースに想定外の処理を行わせ、ログイン情報を表示させることでなりすましを行います。会員の個人情報をログイン後プロフィールなどから閲覧可能であれば、個人情報を不正入手することもできます。
実際にSQLインジェクション攻撃を行い、どのように情報を盗めるのか見てみましょう。今回は脆弱性演習サイトのDVWAを使用しています。
くれぐれもDVWAサイト内だけで攻撃してください。法で罰せられる可能性があります。
今回のサイトでは、SELECT WHERE user_id = xxx というクエリを流すシステムです。xxxが実際にユーザーが入力できる部分です。
まず下記コードをUserへ入力します。
1' or 'a'='a

するとログイン情報が出力されます。これは1かaでは1になるという文で必ず正の文になってしまい、データベース内のアカウント情報がすべて出てしまいます。

対策手法:エスケープ処理を行うことで、特殊文字を入力されても想定外の処理をさせないなど対策があります。
データベースへの攻撃のため、情報漏洩やサイト改ざんされる恐れがあります。多大な被害が出る恐れがあるため、対策の必要性が高い攻撃になります。
詳しくはこちらで解説しています。
https://www.skyarch.net/blog/?p=24369

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

OSへの命令を行うためにシェルと呼ばれるプログラムを使用します。開発者やサービス運用者が使用するプログラムで入力フォーム等書き込める場所にてOSコマンドインジェクションの脆弱性があった場合OSコマンドを入力できる状態となり、ファイルの改ざんやマルウェア等ダウンロードが行われるなど深刻な被害を引き起こす可能性があります。実際にLinuxのコマンドを入力してみます。

lsコマンドを入力したところ、対象ディレクトリの情報が表示されてしまいました。こうなってしまうとコマンドがどれも使用可能の恐れがあります。この状態ですとマルウェア感染ファイルのアップロードや、パスワードの漏洩、ファイル改ざんなど多大な損害が出てしまいます。
対策手法:シェルの起動をさせないために、エスケープ処理をする。また予め使用できる機能を制限したり、OSのアップデートを行うことも有効な手段といえます。

XSS

XSSとは悪意のスクリプトを埋め込むことで、ユーザーがリンクをクリックなど動作を行った時にスクリプトが動きクッキー情報やセッション情報を盗まれ、なりすましが行われたり、Webページを改ざんが行われてしまう攻撃です。
入力フォームなどからスクリプトを埋め込まれるケースがあります。こちらの手法は罠サイトに誘導しスクリプトを実行させるReflected XSS(反射型XSS)、罠サイトを用意せずサイト自体に悪意のあるスクリプトを埋め込むStored XSS(格納型/蓄積型XSS)が存在します。こちらも実際に簡単なコマンドでどのような動作になるか見てみましょう。
下記コード(ブログの仕様上大文字の<>を使用しています)を入力します。
<script>alert('XSS');</script>

こちらはXSSという文字を表示させるコマンドです。下図のようにポップアップが出てきてしまうとコマンド入力成功となり、XSSの脆弱性があります。子の脆弱性により実際にセッション情報など盗まれてしまいます。

対策手法:エスケープ処理を行うことで、不正なスクリプトを埋め込ませない対策があります。

CSRF

CSRFは攻撃サイトを準備してその攻撃サイトから不正なリクエストを対象のサーバーに送り付けます。攻撃サイトに他ユーザーがアクセスできるよう誘導しそあたかもそのユーザーからリクエストしたようにみせる攻撃です。これにより不正な書き込みや犯罪予告を行い混乱に陥れることが可能です。
パスワード変更が可能なサイトだと勝手に変更を行い、なりすますことも可能です。これによりクレジットカードを登録している場合は、勝手に使用され被害が大きくなってしまいます。また実際にCSRFの脆弱性を利用し、犯罪予告などを意図していないユーザーが勝手に書き込みを行い誤認逮捕になるケースもありました。

対策手法:CSRFの脆弱性がある場合は攻撃者かユーザーかの区別をリクエスト送信時に確認していません。そのためサイト外からのリクエストの受信、処理を行わないようにするなどがあります。またCSRFトークンを使用することで、サーバー、クライアント間でトークン情報を共有し、正規トークンでない場合にアクセス不可としユーザーのなりすましをすることができないようにします。

まとめ

今回挙げた攻撃手法はほんの一握りです。開発者で脆弱性を無くすようにアプリケーションを作成するのは限界があるため、脆弱性診断をリリース前や定期的に行ったり、セキュリティ製品の導入(WebアプリケーションならWAF)など様々な方法でセキュリティをより強固なものにしましょう。