無線通信×セキュリティ

Security/Radio/IoT/Mobile/Network

SQLインジェクションとはなんぞや?

 セキュリティ業界に転職して、最初に自分に足りていないと感じたのが、Webアプリケーションに関する技術、知識です。公開されているサーバーということもあり、攻撃者にも狙われやすく、脆弱性も非常に多いです。ですが、私はその脆弱性の内容を知る前に、そもそもWebアプリの知識が無い!

 Webアプリケーション

 というわけではまずは簡単にWebアプリケーションについて。

Webアプリケーションのシンプルな概念図は下図の通りです。こういったサイトを表示するために稼働しているのが、Webサーバー上のWebアプリケーションです。WebアプリケーションはユーザーのHTTPリクエストの内容に応じて、データベースに要求を出し、その応答結果をユーザーのブラウザ上に表示させるといった動きをします。 

f:id:tansokun920:20170802001958j:plain

こうした仕組みは身近なところでいうと、ユーザー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

詳細は以下をご参照ください。

 SQL入門

SQL 入門 - オラクル・Oracle SQL 入門

取得データの結合(UNION句) - データの取得 - MySQLの使い方

SQLインジェクションの攻撃手法

さて、じゃあどんな感じで実際に攻撃する方法を見て行こう。ようやくここまで辿り着いた。。。
いくつか典型的な攻撃方法があるようです。

認証回避

Webページでよくあるユーザ名とパスワードを入力する画面です。そこでユーザ名($uid)とパスワード($pwd)を入れる場合のWebアプリケーション側の処理は以下になります。

SELECT * FROM user WHERE uid='$uid' AND pwd='$pwd'

 入力されたユーザ名とパスワードがデータベースにある内容と一致した場合に認証する仕組みです。ここに以下のような入力をしてみましょう。

$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

 

実際に起きた事例

netshop.impress.co.jp

 

www.yomiuri.co.jp

などなど。調べれば山のように出てきます。

SQLインジェクションを防ぐための対策

などなど。次回以降に紹介していきたいと思います。