WAF學習之漏洞學習——SQL注入


參考sql注入基礎原理

DVWA/SQL Injection/low

場景

  • 在這裏插入圖片描述
源碼
  • source:
<?php

if( isset( $_REQUEST[ 'Submit' ] ) ) {
    // Get input
    $id = $_REQUEST[ 'id' ];

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Get values
        $first = $row["first_name"];
        $last  = $row["last_name"];

        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }

    mysqli_close($GLOBALS["___mysqli_ston"]);
}

?> 
原理
  • 看URL:http://127.0.0.2:8086/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#說明PHP是通過GET請求
  • SQL查詢語句:$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"
  • 我們是通過控制參數Id的值來返回我們需要的信息。如果我們不按常理出牌,比如在輸入框中輸入 1' order by 1#
  • 實際執行的Sql語句就會變成:"SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#';"

注入示例

猜解數據庫
  • 先利用order by 猜數據庫字段個數

    • 在這裏插入圖片描述
    • 在這裏插入圖片描述
    • 在這裏插入圖片描述
    • 由此可知,users表中只有兩個字段,數據爲兩列。
  • 接着利用UNION SELECT 聯合查詢獲取數據庫的信息

    • union 運算符可以將兩個或兩個以上 select 語句的查詢結果集合合併成一個結果集合顯示,即執行聯合查詢。需要注意在使用 union 查詢的時候需要和主查詢的列數相同,而我們之前已經知道了主查詢列數爲 2,接下來就好辦了。
    • 輸入'1 union select database(),user() #
    • 實際執行:SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#;
      `
    • 在這裏插入圖片描述
    • 從返回信息可知:
      • 數據庫名字是dvwa
      • 當前查詢信息的用戶名是root@localhost
  • 同理 再輸入 1' union select version(),@@version_compile_os#進行查詢

    • 在這裏插入圖片描述
      • version() 獲取當前數據庫版本.
      • @@version_compile_os 獲取當前操作系統。
  • 接下來嘗試得到dvwa數據庫中的表名

    • information_schema 是 mysql 自帶的一張表,這張數據表保存了 Mysql 服務器所有數據庫的信息,如數據庫名,數據庫的表,表欄的數據類型與訪問權限等。該數據庫擁有一個名爲 tables 的數據表,該表包含兩個字段 table_name 和 table_schema,分別記錄 DBMS 中的存儲的表名和表名所在的數據庫。

    • 執行語句1 ' union select table_name,table_schema from information_schema.tables#

    • 在這裏插入圖片描述

    • 通過上圖返回信息,我們再獲取到:

      • dvwa 數據庫有兩個數據表,分別是 guestbook 和 users .
  • 那麼我們接下來嘗試獲取重量級的用戶名、密碼。

    • 由經驗我們可以大膽猜測users表的字段爲 user 和 password ,所以輸入:1' union select user,password from users#進行查詢:
    • 在這裏插入圖片描述
    • 可以看到成功爆出用戶名、密碼,密碼採用 md5 進行加密,可以到www.cmd5.com進行解密。

驗證繞過

https://www.jianshu.com/p/078df7a35671

注入點的判斷

https://www.jianshu.com/p/078df7a35671

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章