文/圖 安全天使·angel[BST]
前言
我的《SQL Injection with MySQL》(《黑客防線》7月的專題)已經對MySQL的注入有了比較全面的介紹了,但是有一個危害相當大的函數,我并沒有在文中提及,因為如果能靈活應用這個函數,那PHP甚至服務器的安全性均會大打折扣,由于《SQL Injection with MySQL》的發表時間是在暑假期間,考慮到很多新手、學生和品德敗壞的人亂用,所以我并沒有把這個寫在該文里,其實本文在5月初已寫完。專題發表后,很多人已經陸續轉到PHP+MYSQL注入的研究,很多新技術將會陸續挖掘出來,我們所掌握這方面未公開的高級技巧也會陸續公布出來。至于比較基礎的東西,本文就不再提了。
詳細
我們知道,在SQL語句中,可以使用各種MySQL內置的函數,經常使用的就是DATABASE()、USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()這些函數來獲取一些系統的信息,還有一個應用得比較多的函數,就是load_file(),該函數的作用是讀入文件,并將文件內容作為一個字符串返回。
看到這里,應該可以想到我們可以做什么了,就是讀取一些機密文件,但是也是有條件限制的:
如果該文件不存在,或因為上面的任一原因而不能被讀出,函數返回空。比較難滿足的就是權限,在windows下,如果NTFS設置得當,是不能讀取相關的文件的,當遇到只有administrators才能訪問的文件,users就別想load_file出來。
在實際的注入中,我們有兩個難點需要解決:
絕對物理路徑 構造有效的畸形語句在很多PHP程序中,當提交一個錯誤的Query,如果display_errors = on,程序就會暴露WEB目錄的絕對路徑,只要知道路徑,那么對于一個可以注入的PHP程序來說,整個服務器的安全將受到嚴重的威脅。構造語句已經是小意思了。
利用
我們假設一個程序的SQL語句如下:
SELECT * FROM article WHERE articleid=$id
注:當前條件:magic_quotes_gpc = off,c:/boot.ini可讀。
此時,我們構造$id為:
-1 union select 1,1,1,1,load_file('c:/boot.ini')
我們的Query就變成:
SELECT * FROM article WHERE articleid=-1 union select 1,1,1,1,load_file('c:/boot.ini')
程序會把c:/boot.ini內容老老實實顯示出來,但是現在magic_quotes_gpc = off的主機少之又少,怎么才能構造出沒有引號的語句呢?看過《SQL Injection with MySQL》的朋友肯定知道用char()函數或者把字符轉換成16進制,沒錯,就是它們。
注:當前條件:magic_quotes_gpc = on,c:/boot.ini可讀。
新聞熱點
疑難解答