標籤:行資料 使用者密碼 系統 ati ali 滲透測試 ring 規範 dao層
SQL注入攻擊(SQL injection)是目前網站安全以及伺服器安全層面上是最具有攻擊性,危害性較高,被駭客利用最多的一個漏洞,基本上針對於網站代碼,包括JAVA JSP PHP ASP apache tomcat 語言開發的代碼都會存在sql注入漏洞。
隨著JAVA JSP架構的市場份額越來越多,許多平台都使用JAVA開發,本文通過對sql注入的詳細分析,從代碼層面以及伺服器層面,根本上來防止sql注入攻擊。
SQL注入漏洞的原理很簡單,通俗來講:就是程式員在編寫網站代碼的時候,一些執行資料庫命令的代碼,程式員沒有認真寫以及認真過濾,導致可以將外部的惡意參數拼接到SQL語句當中去,直接傳入到資料庫中去執行,導致駭客可以執行一些查詢使用者賬戶密碼,修改資訊,執行系統命令的安全操作。
網站安全服務
下面我們來搭建一個JAVA環境的網站,設計一個可以查詢使用者資訊的一個api 服務介面,我們採用的都是springboot + jersey 來搭建我們的web服務查詢方塊架。
資料庫是Mysql 架構的,建立一個新的資料庫表:admin,然後建立管理員賬戶跟密碼(採用md5加密方式),這樣我們的使用者資訊有了,就可以提供查詢了。我們把springboot + jersey架構服務搭建起來,然後寫一下查詢的代碼到架構裡。Sine安全公司是一家專註於:伺服器安全、網站安全、網站安全檢測、網站漏洞修複,滲透測試,安全服務於一體的網路安全服務提供者。
我們再來測試下查詢的介面,是否可以正常輸出:
通過網站進行get請求提交,Web服務介面返回200並輸出了使用者名稱為admin的管理員賬戶以及密碼。這樣的輸出是屬於正常的,但是我們在網站端發送一條帶有逗號的GET請求,會發現報錯了。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘xxxx‘‘‘ at line 1。
也就是說上面的查詢是錯誤的,因為我們添加了一個逗號在裡面,導致傳入到資料庫並執行的同時,資料庫返回的錯誤提示。
網站安全部署
SQL注入詳情解析:
GET的網站時候參數的時候,傳入了一個String類型的name參數值,並且通過字串聯起來,構建了資料庫的查詢語句。在正常操作的情況下,使用者會傳入合法的name參數值進行資料庫查詢,但是攻擊者會編造一些惡意的參數,只要參數通過字串拼接後依然是一句合法的SQL查詢,此時SQL注入就發生了。正如我們上文輸入的name=xxxx‘or‘a‘=‘a與我們介面中的查詢語句進行拼接後構成如下SQL語句
當介面執行name=xxxx‘or‘a‘=‘a這個SQL語句後,系統後台也就相當於免費的送給駭客了,駭客一看到管理員密碼這個hash,都不用去cmd5解密了,攻擊者就會直接使用123456這個密碼去登入網站的後台管理系統。為什嗎?因為123456的md5雜湊太常見了,這就是很多JAVA網站的現實,在網站安全以及弱口令方面簡直做的不忍直視。
好了,現在我們應該明白了,SQL Injection原因就是由於傳入的參數與系統的SQL拼接成了合法的SQL而導致的,而其本質還是將使用者輸入的資料當做了代碼執行。在系統中只要有一個SQL注入點被駭客發現,那麼駭客基本上可以執行任意想執行的SQL語句了,例如添加一個管理員,查詢所有表,修改使用者密碼等等。
以上是對sql注入攻擊的詳情,下文會詳細的介紹,如何去防範sql注入的攻擊,知彼知己才能百戰不殆。瞭解了sql的攻擊原理,才能更好去防禦sql注入攻擊。
網站安全需要精心雕琢,伺服器安全是100 - 1 = 0的業務,即使你防禦了99%的攻擊,那還不算勝利,只要有一次網站被入侵了,那就有可能給公司帶來很嚴重的損失跟後果。如果不懂網站防SQL攻擊的的話,也可以找專業的安全公司來部署防sql注入攻擊部署,國內安全公司像綠盟、Sinesafe、在安全方面都是做的比較不錯的。
SQL注入的其他防範辦法
很多公司都會存在老系統中有大量SQL注入風險代碼的問題,但是由於其已穩定支援公司業務很久,不宜採用大面積代碼更新的方式來消除注入隱患,所以需要考慮其採用他方式來防範SQL注入。除了在在SQL執行方式上防範SQL注入,很多時候還可以通過架構上,或者通過其他過濾方式來達到防止SQL注入的效果。
一切輸入都是不安全的:對於介面的調用參數,要進行格式匹配,例如admin的通過name查詢的介面,與之匹配的Path應該使用正則匹配(因為使用者名稱中不應該存在特殊字元),從而確保傳入參數是程式控制範圍之內的參數,即只接受已知的良好輸入值,拒絕不良輸入。注意:驗證參數應將它與輸出編碼技術結合使用。
利用分層設計來避免危險:前端盡量靜態化,盡量少的暴露可以訪問到DAO層的介面到公網環境中,如果現有項目,很難修改存在注入的代碼,可以考慮在web服務之前增加WAF進行流量過濾,當然代碼上就不給hacker留有攻擊的漏洞才最好的方案。也可以在擁有nginx的架構下,採用OpenRestry做流量過濾,將一些特殊字元進行轉義處理。
盡量使用先行編譯SQL語句:由於動態SQL語句是引發SQL注入的根源。應使用先行編譯語句來組裝SQL查詢。
正常化:將輸入安裝規定編碼解碼後再進行輸入參數過濾和輸出編碼處理;拒絕一切非標準格式的編碼。
如何防止網站被SQL注入攻擊之java網站安全部署