2021-06-03 · 4

SQL Injection

securityweb

この記事は公開から2年以上経過しています。

SQL Injection の説明


SQL Injection とは?

SQL Injection とは、悪意のあるユーザーがセキュリティ上の脆弱性を利用して、任意の SQL 文を注入し実行させ、データベースが異常な動作をするよう操作する行為です。

攻撃の種類と方法

SQL Injection

論理的エラーを利用した SQL Injection

上の写真に見えるクエリ文は、一般的にログイン時によく使われる SQL 構文です。この構文で入力値に対する検証がないとき、悪意ある意図で任意の SQL 構文を注入しました。' or 1=1-- で、WHERE 節にあるシングルクォートを閉じるためのシングルクォートと or 1=1 という構文を使って WHERE 節をすべて真にし、-- を入れて後ろの構文をコメント処理しています。

簡単な方法ですが、この方法が成功すると、最初に作られたアカウントでログインに成功します。たいてい最初に作られたアカウントは管理者アカウントなので、管理者アカウントでログインできるようになります。

Union based SQL Injection

Union コマンドを利用した SQL Injection

2 つ以上のクエリを要求して結果を得る UNION という SQL 演算子を利用した SQL Injection 攻撃を指し、攻撃者はこの演算子を利用して元の要求に 1 つの追加クエリを挿入し情報を得ます。

UNION 演算子を使って、2 つ以上の SELECT 文の結果を単一の結果集合に結合できます。

ただし UNION 演算子を使って結合された結果集合は、すべて同じ構造を持たなければなりません。

上に見えるクエリ文は、Board というテーブルから投稿を検索するクエリ文である。入力値を title と contents カラムのデータと比較した後、似た文字がある投稿を出力します。ここで入力値として Union キーワードとともに合わせて SELECT 構文を入れると、2 つのクエリ文が合わさって 1 つのテーブルに見えます。上のようなインジェクションが成功する場合、id と password を要求するクエリ文なので、ユーザーの個人情報が投稿とともに画面に表示されることになります。

Blind SQL Injection

Blind SQL Injection は、データベースから特定の値やデータを受け取らず、単に真と偽の情報だけが分かるときに使います。ログインフォームで SQL Injection が可能なとき、サーバーが応答するログイン成功・失敗メッセージを通じて DB のテーブル情報を抽出できます。

上の注入文は、データベースのテーブル名を突き止める方法です。インジェクション可能なログインフォームを通じて、悪意あるユーザーは任意に登録した abc123 という id とともに abc123' and ASCII(SUBSTR(SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0,1) 1,1)) > 100 -- という構文を注入しました。

この構文は MySQL でテーブル名を照会する構文で、limit キーワードで 1 つのテーブルだけ照会し、SUBSTR 関数で最初の 1 文字だけ、最後に ASCII で ASCII コードに変換します。

Time Based SQL Injection

Time Based SQL Injection も同様に、サーバーからの特定の応答の代わりに真偽の応答を通じてデータベースの情報を流出させる技法です。

MySQL で Sleep() 関数を利用して 5 秒後にクエリ結果を得るよう攻撃文字列を挿入したとき、もし 5 秒後にクエリ結果が画面に出力されれば、脆弱性があると判断できます。

Stored Procedure SQL Injection

ストアドプロシージャは運用上の便宜のために作っておいた SQL 集合の形態であり、特に MS SQL で使える xp_cmdshell は、Windows コマンドである netstat -an を挿入している。

エラーベースの SQL Injection

GET、POST リクエストフィールド、HTTP ヘッダー値、クッキー値などに特殊文字(シングルクォート(')またはセミコロン(;))を挿入したとき、SQL エラーが発生すれば脆弱性があると判断できる。

SQL Injection でよく使われる文字列

<table style="border-collapse: collapse; width: 100%; height: 120px;" border="1" data-ke-align="alignLeft"><tbody><tr style="height: 20px;"><td style="width: 50%; text-align: center; height: 20px;"><b>文字列</b></td><td style="width: 50%; text-align: center; height: 20px;"><b>説明</b></td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">'</td><td style="width: 50%; text-align: left; height: 20px;">文字データ区切り記号</td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">;</td><td style="width: 50%; text-align: left; height: 20px;">クエリ区切り記号</td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">--, #</td><td style="width: 50%; text-align: left; height: 20px;">該当行のコメント区切り記号<br><span style="color: #1b711d;">-- : Oracle, MSSQL</span><br><span style="color: #1b711d;"># MYSQL</span></td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">/* /</td><td style="width: 50%; text-align: left; height: 20px;">/ と */ の間の構文コメント</td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">||</td><td style="width: 50%; text-align: left; height: 20px;">文字連結 <span style="color: #1b711d;">(Oracle のみ該当)</span></td></tr></tbody></table>

参考:

https://noirstar.tistory.com/guestbook

https://kk-7790.tistory.com/74

https://m.blog.naver.com/koromoon/120172851234

https://tar-cvzf-studybackup-tar-gz.tistory.com/84

https://seey.tistory.com/6


原文(韓国語): tistory — 2021-06-03 公開、当ブログへ移行。この翻訳は AI の協力で作成されました。

コメント

コメントを削除しますか?

関連記事

SQL Injection · 나봄하랑