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框架服務搭建起來,然後寫一下查詢的代碼到框架裡。eSafe白帽資安網公司是一家專注於:主機安全、網站安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一體的網絡安全服務提供商。
我們再來測試下查詢的接口,是否可以正常輸出:
通過網站進行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網站的現實,在網站安全以及弱口令方面簡直做的不忍直視。eSafe白帽資安網公司是一家專注於:主機安全、網站安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一體的網絡安全服務提供商。
好了,現在我們應該明白了,SQL Injection原因就是由於傳入的參數與系統的SQL拼接成了合法的SQL而導致的,而其本質還是將用戶輸入的數據當做了代碼執行。在系統中只要有一個SQL注入點被駭客發現,那麼駭客基本上可以執行任意想執行的SQL語句了,例如添加一個管理員,查詢所有表,修改用戶密碼等等。
以上是對sql注入攻擊的詳情,下文會詳細的介紹,如何去防範sql注入的攻擊,知彼知己才能百戰不殆。瞭解了sql的攻擊原理,才能更好去防禦sql注入攻擊。
網站安全需要精心雕琢,主機安全是100 - 1 = 0的業務,即使你防禦了99%的攻擊,那還不算勝利,只要有一次網站被入侵了,那就有可能給公司帶來很嚴重的損失跟後果。如果不懂網站防SQL攻擊的的話,也可以找專業的安全公司來部署防sql注入攻擊部署,國內安全公司像綠盟、esafe.tw、在安全方面都是做的比較不錯的。