セキュリティ業界に転職して、最初に自分に足りていないと感じたのが、Webアプリケーションに関する技術、知識です。公開されているサーバーということもあり、攻撃者にも狙われやすく、脆弱性も非常に多いです。ですが、私はその脆弱性の内容を知る前に、そもそもWebアプリの知識が無い!
Webアプリケーション
というわけではまずは簡単にWebアプリケーションについて。
Webアプリケーションのシンプルな概念図は下図の通りです。こういったサイトを表示するために稼働しているのが、Webサーバー上のWebアプリケーションです。WebアプリケーションはユーザーのHTTPリクエストの内容に応じて、データベースに要求を出し、その応答結果をユーザーのブラウザ上に表示させるといった動きをします。
こうした仕組みは身近なところでいうと、ユーザーID/パスワードを入力させるログインページ等が該当します。 ユーザーが入力する値があり、そこを介してWebアプリケーションやその裏のデータベースを攻撃する種類の1つにSQLインジェクションがあるようです。
SQLインジェクションってどんなもん?
アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のこと。また、その攻撃を可能とする脆弱性のことである。
とSQLインジェクション - Wikipediaには記載があります。
んーイメージ湧かない。。。まずSQL文が分からない。データベースを操作するための言語なんだろな〜くらい。無線通信ばかりやってきた人間にとって、アプリ側の言語はよう分からん。まずは調べて学んでみますかね。
SQL文
まずはデータベース言語 - Wikipediaですかね。ふむふむ、操作、定義、制御に分かれていて、今回の場合、操作言語がメインになりそうですね。
特定の1行を取り出すときは以下のような構文になると。これが一番基本になりそうです。
SELECT * FROM 表名 WHERE 列名1=値1 AND 列名2=値2
今回使いそうな構文はその他にはUNION句。以下の構文の場合、UNIONは2つのSELECT文を結合するする意味合いを持ちます。
SELECT ProductName, UnitPrice FROM Products
UNION SELECT distinct prod.ProductName, ordd.UnitPrice FROM Products
詳細は以下をご参照ください。
取得データの結合(UNION句) - データの取得 - MySQLの使い方
SQLインジェクションの攻撃手法
さて、じゃあどんな感じで実際に攻撃する方法を見て行こう。ようやくここまで辿り着いた。。。
いくつか典型的な攻撃方法があるようです。
認証回避
Webページでよくあるユーザ名とパスワードを入力する画面です。そこでユーザ名($uid)とパスワード($pwd)を入れる場合のWebアプリケーション側の処理は以下になります。
入力されたユーザ名とパスワードがデータベースにある内容と一致した場合に認証する仕組みです。ここに以下のような入力をしてみましょう。
$uid : tansokun$pwd : ' OR 'A'='A
そうすると、以下のようなSQL文になってしまします。
SELECT * FROM user WHERE uid='tansokun' AND pwd='' OR 'A'='A'
こうなるとORの後の文は常に真なので、ユーザ名、パスワード関係なしにログインできてしまいます。こうして不正な方法でログインするのが認証回避のSQLインジェクションです。ふぅ、ようやく少し分かってきた。
UNIONインジェクション
さて、次はUNIONインジェクションです。これはどんな場面であるのか。代表的な例で見ていきましょう。
Webページで商品検索とかできるページを例に考えます。攻撃対象は以下のような構文です。
SELECT name, price FROM product_table WHERE category='ユーザ入力'
攻撃する入力は以下のような文を突っ込みます。
攻撃入力:' UNION SELECT uid, pw FROM account_table--
これを入れた場合のSQL文は以下のようになります。
SELECT name, price FROM product_table WHERE category='' UNION SELECT uid, pw FROM account_table--'
この場合、UNION句の後のSELECT文の結果も結合されてWebページ上に表示されます。こうしてユーザーIDとパスワードの組み合わせの情報が不正に取得することができます。
さてここまで説明を繰り広げてきましたが、実際どないやねん、とイマイチイメージできない場合は実際に試しちゃいましょう。以下サイトをご参照ください。
SQLインジェクションの恐ろしさを実感できるツール「Havij」の使い方 | Lancork
実際に起きた事例
などなど。調べれば山のように出てきます。
SQLインジェクションを防ぐための対策
などなど。次回以降に紹介していきたいと思います。