PHP是一種被廣泛使用的指令碼語言,尤其適合於web開發。具有跨平台,容易學習,功能強大等特點,據統計全世界有超過34%的網站有php的應用,包括Yahoo、sina、163、sohu等大型門戶網站。而且很多具名的web應用系統包括bbs,blog,wiki,cms等等)都是使用php開發的,Discuz、phpwind、phpbb、vbb、wordpress、boblog等等。
隨著web安全的熱點升級,php應用程式的代碼安全問題也逐步興盛起來,越來越多的安全人員投入到這個領域,越來越多的應用程式代碼漏洞被披露。面對這種現狀,PHP漏洞“挖掘者”所能得到的漏洞也將越來越少。但是“窮則思變”,既然傳統的審計方法不能達到挖掘漏洞的目的,那麼我們何不嘗試新的審計手法與思路呢?代碼審計的目的是以挖掘到可以利用的漏洞,所以我們不必通篇的去將代碼完全看懂,但是在開始之前做一些準備還是必須,就像滲透之前,我們也需要收集足夠多的目標資訊,利用工具和制定滲透計劃一樣。
程式的本質是變數與函數,漏洞所依賴的也無法脫離這兩個元素。讓我們先來看下漏洞形成的條件1.可以控制的變數一切輸入都是有害的】2.變數到達有利用價值的函數[危險函數]一切進入函數的變數是有害的】漏洞的利用效果最終也取決與函數的功能。所以我們在下面講述漏洞挖掘的過程中,也將圍繞著這兩個元素來展開。
一個網站的安全性涉及很多方面,代碼的安全性是其中的一個重要因素,代碼審計就是用來提高代碼安全性的,那麼我們就來講講代碼審計,這次我們用到的是dvwa。
DVWA(DamnVulnerableWebApplication)DVWA是用PHP+Mysql編寫的一套用於常規WEB漏洞教學和檢測的WEB脆弱性測試程式。包含了SQL注入、XSS、盲注等常見的一些安全性漏洞。
下面簡單的以dvwa裡面sql注入的三種等級代碼來說一下代碼審計。
首先比較low、medium、high三種層級的php代碼:Low:
650) this.width=650;" style="float:none;" title="1.png" alt="212017692.png" src="http://www.bkjia.com/uploads/allimg/131228/11133K546-0.png" />
Medium:
650) this.width=650;" style="float:none;" title="2.png" alt="212018566.png" src="http://www.bkjia.com/uploads/allimg/131228/11133K3V-1.png" />
High:
650) this.width=650;" style="float:none;" title="3.png" alt="212019214.png" src="http://www.bkjia.com/uploads/allimg/131228/11133G147-2.png" />
紅框裡面就是三種代碼的不同之處,發現從low到medium多了一句,medium到high又多了一句。
dvwa的sqlinjection裡面有個輸入框,三種等級下輸入1,結果都一樣,瀏覽器地址欄變成:http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#輸入框下面會出現:
650) this.width=650;" style="float:none;" title="4.png" alt="212019395.png" src="http://www.bkjia.com/uploads/allimg/131228/11133MK9-3.png" />
1、當在low級下輸入1′,發現瀏覽器地址欄變成:http://localhost/dvwa/vulnerabilities/sqli/?id=1′&Submit=Submit#並出現錯誤:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear”1”’atline12、當在medium級下,輸入1′,發現地址欄和low級一樣,提示錯誤:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear‘\”atline13、再看high級下,輸入1′,地址欄依舊,沒出現錯誤,也沒有出現正常的查詢結果。正常情況下,當使用者在輸入框輸入1,從資料庫查詢id=1的使用者,查詢語句是SELECTfirst_name,last_nameFROMusersWHEREuser_id=‘$id’就會得到id=1的使用者資訊。
但是在1後面加個單引號後在low和medium層級下出現錯誤,看回上面圖片:low級下沒有對輸入進行任何處理,直接把使用者輸入的東西放到查詢語句中進行查詢;medium級下添加了mysql_real_escape_string()函數,這個函數是轉義sql語句中使用的字串中的特殊字元,就像在錯誤提示中顯示在單引號前加\;
high級下在轉義函數前面加了另一個函數stripslashes(),這個函數是去除addslashes()函數添加的反斜線,因為high級下,php的magic_quotes_gpc為on,對所有的GET、POST和COOKIE資料自動運行addslashes()函數。所以要使用stripslashes()函數三種等級下sql注入的情況很明顯了,現在深入。low:http://localhost/dvwa/vulnerabilities/sqli/?id=1orderby2+–+&Submit=Submit#
650) this.width=650;" style="float:none;" title="5.png" alt="212019298.png" src="http://www.bkjia.com/uploads/allimg/131228/11133G2C-4.png" />
http://localhost/dvwa/vulnerabilities/sqli/?id=1′orderby2+–+&Submit=Submit#
650) this.width=650;" style="float:none;" title="6.png" alt="212019265.png" src="http://www.bkjia.com/uploads/allimg/131228/11133L219-5.png" />
http://localhost/dvwa/vulnerabilities/sqli/?id=1′unionselect1,2+–+&Submit=Submit#
650) this.width=650;" style="float:none;" title="7.png" alt="212019940.png" src="http://www.bkjia.com/uploads/allimg/131228/11133KH2-6.png" />
http://localhost/dvwa/vulnerabilities/sqli/?id=1′unionselect1,concat_ws(char(32,58,32),user(),database(),version())+–+&Submit=Submit#
650) this.width=650;" style="float:none;" title="8.png" alt="212019605.png" src="http://www.bkjia.com/uploads/allimg/131228/11133K457-7.png" />
就這樣把目前使用者、資料庫、php版本爆了出來。concat_ws是mysql裡面的函數。medium下會自動加反斜線轉義特殊字元,會破壞查詢語句,頁面上會提示出錯;high下id只有正常情況下才會出現正確資訊,其餘的都不會出現任何資訊。除此之外,high層級中還有兩處不同,判斷輸入是否為數字並將其值用單引號包含起來,以確保非法字元無法起作用。
650) this.width=650;" style="float:none;" title="9.png" alt="212020519.png" src="http://www.bkjia.com/uploads/allimg/131228/11133L925-8.png" />
到high層級的php代碼已經達到相當高水平的安全性了,但是不能說一定是最安全的,因為還是可能會出現漏洞的。代碼審計就是檢查原始碼中的缺點和錯誤資訊,分析並找到這些問題引發的安全性漏洞,並提供代碼修訂措施和建議。從而在系統開發階段/營運階段進行深入的問題尋找和消滅過程。
本文出自 “無痕” 部落格,謝絕轉載!