目次
1. SQLインジェクション攻撃の概要
1.1 SQL インジェクションの概念
1.1.1 標準クエリプロセス
1.1.2 SQLインジェクション定義
攻撃者はWebフォームの入力フィールドやページリクエストのクエリ文字列にSQLコマンドを挿入し、挿入された悪意のあるSQLコマンドによって元のSQL文の機能が変更され、サーバーを騙す攻撃手法が得られます。悪意のある SQL コマンドを実行します。
1.2 SQL インジェクションの根本原因
ユーザー入力データの合法性についての判断はありません
1.3 SQLインジェクション条件
- ユーザーは入力パラメータを制御でき、フロントエンドからバックエンドに渡されるパラメータの内容もユーザーが制御できます。
- ユーザーが入力したパラメータは SQL ステートメントに結合され、データベース クエリに取り込まれて、実行されるコードになります。
1.4 SQL インジェクションの防止
1.4.1 根本原因: 不十分なフィルタリング
1.4.2 セキュリティ設計原則: データとコードの分離
1.5 SQLインジェクションプロセス
- Web システムで使用されているスクリプト言語を特定し、インジェクション ポイントを見つけて、SQL インジェクションの脆弱性があるかどうかを判断します。
- Webシステムのデータベースの種類を決定する
- 判定テーブルの構造と判定データベース内の対応するフィールドを決定する
- テーブル内のデータ内容を取得するための注入ステートメントを作成します。
- Webサイトの背景を確認し、SQLインジェクションで取得した管理者アカウントとパスワードでログインします。
- 他の脆弱性と組み合わせて、Webshell をアップロードして接続を継続します。
- サーバーのシステム権限を取得するための権限のさらなる昇格
- 注入ポイントを見つける
- ライブラリ名を確認する
- ルックアップテーブル名
- フィールド名を確認してください
- キーデータをチェックする
1.6 SQL インジェクションの分類
1.6.1 エコーインジェクション
つまり、ユーザーがクエリ要求を開始すると、サーバーはクエリ結果を表示用のページに返します。
1.6.2 盲注
ブラインド インジェクションの特徴は、ユーザーがリクエストを開始することです。このリクエストは必ずしもクエリである必要はありません。サーバーはデータベースへのクエリのリクエストに応答し、特定のクエリ結果を表示せずに結果を返します。ユーザー登録などの一般的なシナリオでは、登録が成功したかどうかを確認するプロンプトのみが表示され、データベースの内容は表示されません。
2. エコーインジェクション攻撃
2.1 注入ポイントを見つける
2.1.1 よく使われる文
' //单引号测试
1' and '1'='1 //恒真测试
1' and '1'='2 //恒假测试
2.1.2 ページのフィードバック
- ページに変更はありません。上記 3 つの状況のページに違いはありません。これは、このクエリ ポイントのバックグラウンド フィルターが比較的厳密であり、SQL インジェクションの脆弱性があるかどうかを追跡する必要があることを意味します。
- ページに一部のコンテンツがありません。最初の 2 つのケースは正常ですが、3 番目のケースが明らかにページが欠落している場合は、基本的に SQL インジェクションの脆弱性があると確認でき、次のステップに進んで判断します。
- エラーがエコーされます。3 番目の接続にアクセスした後にデータベース エラー メッセージが表示された場合、インジェクションが存在することは明らかであり、インジェクションにはエコー インジェクション メソッドが使用されています。
- デフォルトのインターフェースにジャンプします。最初のケースは正常ですが、2 番目と 3 番目のケースはホームページとデフォルト ページに直接ジャンプするため、バックグラウンドで検証ロジックが存在する可能性があります。
- 接続を直接閉じます。上記の 2 番目と 3 番目の状況でアクセスが失敗した場合は、保護ツールを有効にしてオンラインでブロックすることができます。
2.2 查字段数
2.2.1 よく使用されるコマンド
- order by (テーブルの列数を確認)
- Union (エコーの特定のフィールド ビットを判断し、通常は前のステートメントを false として構築します)
2.2.2 コードステートメント
1' order by 1 #
1' order by 5 #
コメント: #、(%23)、---+
2.3 MySQL データベース
2.3.1 MySQL システム関数
version() //返回当前数据库的版本信息
user() //返回当前用户
database() //返回当前数据库名
Group_concat() //将查询结果连接成字符串
2.3.2 SQL インジェクションの危険性
- 不正ログインの検知を回避
- 重要な情報を不正に聞き出す行為
3. SQL ブラインド インジェクション攻撃
3.1 ブラインドSQLインジェクションの特徴
3.1.1 真と偽のみ
3.1.2 有効なデータベース情報がありません
エコーインジェクション文に判定メソッドを追加し、返される結果が true か false になるようにします。
3.2 SQL ブラインドインジェクションの分類
3.2.1 ブールブラインド
ブールブラインドインジェクションとはSQLの判定文を構築することです
1' and length(database())>=5 #
1' and substr(database(),1,1)=d #
" and ord(substr(database(),3,1))=119 #
3.2.2 タイムブラインド
- タイムブラインド注入は、時間関数を使用してさまざまな条件の待ち時間を観察することです。Sleep() や Benchmark() などの関数を使用して、MySQL のバッチ時間を長くします。
- 時間ブラインド教育インジェクションは、多くの場合、if( expr1, expr2, expr3) 関数と組み合わせて使用されます。expr1 が True の場合、戻り値は expr2 の値になり、それ以外の場合は expr3 の値になります。
If(length(database())>3, sleep(5),1)
lf(substr(database() ,1,1)='d', sleep(5),1)
3.2.3 エラーブラインド
特別なパラメータ フォームを構築し、いくつかの関数のエラー情報を使用して挿入します。たとえば、updatexml(XML_document, XPath_string, new_value) は、XML_document 内の XPath_string の値を new_value に置き換えます。の:
- XML_document: 文字列形式、XML ドキュメント オブジェクトの名前
- XPath_string: XPath 形式の文字列
- new_value: 文字列形式。見つかった修飾データを置き換えます。
updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) //0x7e是~的十六进制ASCLL值
→ ERROR 1105 (HY000): XPATH syntax error: '~dvwa~'
データベース dvwa の下のテーブル名を取得します。
updatexml(1,concat(0x7e,(SELECT table_name from information_schema,tables where
table_schema='dvwa' limit 0,1),0x7e),1) //报错注入只显示一条结果,故使用 limit 语句
3.3 ブラインド注射の一般的な考え方
クエリしたいデータをターゲットとして取得し、SQL 条件判定ステートメントを構築し、クエリ対象のデータと比較して、現在のステートメント バッチが正しいかどうかをデータベースに判断させます。
4. SQL インジェクション攻撃からの保護
4.1 SQL インジェクション保護のアイデア
4.1.1 SQL インジェクションの主な条件
- ユーザーが制御可能な入力
- データベースクエリに取り込まれるパラメータ
4.1.2 SQL インジェクションの本質
ユーザー入力をコードとして実行する
4.1.3 セキュリティ設計原則
データとコードの分離
4.2 SQLインジェクションの保護方法
4.2.1 パラメータのフィルタリング
①パラメータの種類の制限
- パラメータの型制限: デジタル型判定 is_numeric()、cytpe_digit() などの型判定関数。
- パラメータの長さ制限: strlen() など。
②危険人物の扱いについて
- ブラックリスト フィルタリング: preg_replace() 関数を使用して、パラメータ内の機密文字 (union、\、'、select など) をフィルタリングします。
- ホワイトリストフィルタリング:ホワイトリストを満たす者のみが通過可能
- パラメータエスケープ: 関数 mysgli_real_escape_string を使用して特殊記号をエスケープします
4.2.2 プリコンパイル処理
ステートメントを準備し、変数をバインドし、パラメーター化されたクエリを実行します。データベース サーバーは、実行するパラメータを適用する前にデータベース内の SQL コマンドのコンパイルを完了します。パラメータはデータベースによって実行されず、それがパラメータである場合にのみ実行されます。
5. SQLMapの使用
5.1 SQLインジェクションツール
5.1.1 SQLマップ
5.1.2 ああD
5.1.3 少年
5.2 SQLMapの使用
5.2.1 SQLMap の概要
① 概要
Python で書かれたオープンソースの自動 SQL インジェクション ツール
②主な機能
特定の URL の SQL インジェクションの脆弱性をスキャン、発見、悪用します。
③特徴
- さまざまなデータベース管理システムを完全にサポート: MySQL、Oracle、PostgreSQL、Microsoft SQL Server.Microsoft Access、IBM DB2、SQLite、Firebird、Sybase.SAP MaxDB、HSQLDB、Informix など。
- 5種類のSQLインジェクション技術ジョイントクエリインジェクションをサポート:マーケットブラインドインジェクション、タイムブラインドインジェクション、エラーブラインドインジェクション、ヒープクエリインジェクション
- ユーザー、パスワード、ハッシュ、権限、ロール、データベース、テーブル、列の列挙をサポートします。
- パスワード ハッシュ形式の自動識別と辞書によるパスワード ハッシュのクラッキングをサポート
5.2.2 具体的な利用手順(GET型)
①注射の有無を判断する
sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1"
②爆発倉庫
sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1" --dbs
③バースト
sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1" --tables -D security
④爆発
sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1"--columns -T users -D security
⑤バーストデータ
sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1” --dump -cpassword,username -T users -D security
POST タイプ:sqlmap.py -r 3.txt --dbs
cookie の種類:sqlmap.py -u “127.0.0.1/sqli-1abs/Less-20/” --cookie "uname=admin" --level 2