系統講解 PHP Web 安全防禦
常見漏洞
看到上圖的漏洞是不是特別熟悉,如果不 及時 進行防禦,可能就會產生蝴蝶效應。
如何進行防禦?往下看,也許會有你想要的答案。
SQL注入攻擊
定義
SQL注入攻擊是通過WEB表單提交、URL引數提交或Cookie引數提交,將懷有惡意的“字串”,提交到後臺資料庫,欺騙伺服器執行惡意的SQL語句。
案例
使用者惡意輸入:
注入後的Sql語句:
執行注入後的Sql語句,可以返回 user 表的全部資料。
平時我們可以進行自測,比如使用單引號、雙引號等,如果是數字就進行 +1 或 -1。
眾所周知,SQL注入的危害很大,利用SQL注入可以進行, 拖庫 、 刪庫 、 刪表 、 UDF提權 、 讀取檔案 、 ...
在這裡,推薦一個開源的自動化的SQL注入工具。
SQLmap:http://sqlmap.org/
-
支援各種資料庫管理系統(MySql、Oracle、SQL Server、SQLite ... )。
-
支援自動識別密碼雜湊格式並通過字典破解密碼雜湊。
-
支援列舉使用者、密碼、雜湊、許可權、角色、資料庫、資料表和列。
-
支援完全地下載某個資料庫中的某個表、某個列。
-
支援在資料庫管理系統中搜索指定的資料庫名、表名或列名。
-
支援下載或上傳檔案。
-
支援執行任意命令並回現標準輸出。
-
支援布林型盲注、時間型盲注、基於錯誤資訊的注入、聯合查詢注入和堆查詢注入。
嘗試著利用工具,注入自己的專案,發現問題,然後並解決問題。
SQL注入的危害,遠比我們想象的要大!
防禦
推薦解決方案是使用 PDO 或 MySQLi 的資料庫擴充套件。
PHP官方文件中介紹,MySQL擴充套件自PHP 5.5.0起已廢棄,並在自PHP7.0.0開始被移除。
如果已經在用MySQL擴充套件了,可以對傳入的每個引數做驗證,並使用框架的ORM進行查詢。
另外:addslashes 和 mysql_ real_ escape_string 這種轉義是不安全的!
XSS攻擊
定義
XSS攻擊是一種經常出現在WEB應用中的電腦保安漏洞,通過WEB表單提交或URL引數提交,將程式碼植入在使用者的使用頁面上。
分類
儲存型
注入的惡意程式碼儲存在伺服器上(常用於留言板、論壇帖子、CRM),受害者請求伺服器獲取資訊的時候,這些惡意程式碼就被瀏覽器成功執行。
反射型
注入的惡意程式碼沒有儲存在伺服器上,通過引誘使用者點選一個連結到目標網站進行實施攻擊。
DOM型
注入的惡意程式碼並未顯式的包含在web伺服器的響應頁面中,但會被頁面中的js指令碼,以變數的形式來訪問到,從而來進行實施攻擊。
案例
儲存型:論壇帖子介面input輸入框中,輸入 /><script>alert("xss")</script>
進行提交。
反射型:在瀏覽器輸入框中,輸入 /xxx.php?name=<script>alert(/xss/)</script>
XSS的危害有很多,包括盜號,掛馬,控制受害者機器想其他網站發起攻擊 ...
常用的自測的方法,看見輸入框就輸入: /><script>alert("xss")</script>
進行提交。
在這裡,推薦一個專門針對瀏覽器攻擊的框架。
BeEF:https://beefproject.com/
防禦
簡單的防禦可以對style、script、image、src、a等等不安全的因素進行過濾或轉義。
可以自己封裝一個方法,也可以使用框架的自帶方法,比如 xss_clean 。
可以利用一些模板引擎避免XSS攻擊,比如Laravel框架使用的Blade,還有twig,Smarty等。
可以利用HTTP-only,將cookie設定成HTTP-only防止XSS攻擊。
可以使用Content Security Policy,它的實質就是白名單制度。
入門教程請參考:http://www.ruanyifeng.com/blog/2016/09/csp.html
SSRF攻擊
定義
SSRF(Server-Side Request Forgery:伺服器端請求偽造) 是攻擊者偽造伺服器端發起的請求,雖然攻擊者無法從外網訪問內網的系統,但是它通過注入惡意程式碼從服務端發起,通過服務端就再訪問內網的系統,然後獲取不該獲取的資料。
案例
漏洞主要產生在包含這些方法的程式碼中,比如 curl、file_ get_ contents、fsockopen。
請求地址:http://www.xxx.com/demo.php?url=xxx
將url引數修改成,file:///etc/passwd,可以獲取敏感檔案的資訊。
將url引數修改成,dict://127.0.0.1:3306/info,可以獲取目標主機3306埠執行的應用。
除了 file協議,dict協議,還可以利用gopher協議 和 http/https 協議進行攻擊。
可以攻擊redis,memcache,內網應用,還可以檢視一下敏感檔案的資訊 等等。
防禦
對 curl、file_ get_ contents、fsockopen 這些方法中的引數進行嚴格驗證!
限制協議只能為HTTP或HTTPS,禁止進行跳轉。
如果有白名單,解析引數中的URL,判斷是否在白名單內。
如果沒有白名單,解析引數中的URL,判斷是否為內網IP。
CSRF攻擊
定義
CSRF(Cross-site request forgery:跨站請求偽造)是攻擊者通過偽裝成受信任的使用者,盜用受信任使用者的身份,用受信任使用者的身份傳送惡意請求。
從上圖看出,完成一次CSRF攻擊,需要完成兩個步驟:
1.登入受信任網站A,本地生成網站A的Cookie。
2.未退出網站A的情況下,訪問危險網站B。
危害
具體危害要看受信任網站是做什麼的,如果是社交網站可以操控發廣告,如果是電商網站可以操控購物,如果是銀行網站甚至還可以操控轉賬,......
這樣危害會造成個人資訊的洩露和財產的損失。
防禦
Cookie Hashing,表單提交或Ajax提交,必須使用csrf token。
對於不確定是否有csrf風險的請求,可以使用驗證碼(儘管體驗會變差)。
對於一些重要的操作(修改密碼、修改郵箱),必須使用二次驗證。
檔案上傳漏洞
定義
檔案上傳漏洞是攻擊者上傳了一個可執行的檔案到伺服器上執行。
可執行檔案包括有病毒、木馬、惡意指令碼等。
危害
檔案上傳漏洞與SQL注入或XSS相比,其風險更大,如果存在上傳漏洞攻擊者甚至可以直接上傳一個webshell指令碼到伺服器上。
防禦
-
副檔名檢測
-
檔案 MIME 驗證
-
檔案重新命名
-
檔案目錄設定不可執行許可權
-
設定單獨域名的檔案伺服器
資訊洩露
定義
資訊洩露主要指使用者的手機號、郵箱、密碼、身份證、地址等敏感資料洩露,還有伺服器上的檔案和環境變數等敏感資料洩露,還包括將直接將企業原始碼上傳到開源平臺。
案例
比如開發介面時,介面返回明文的手機號。
比如除錯程式碼時,程式碼中提交了一些除錯資訊,未進行刪除。
......
防禦
-
敏感資料脫敏(比如手機號、身份證、郵箱、地址)。
-
伺服器上不允許提交包含列印 phpinfo 、$_SERVER 和 除錯資訊等程式碼。
-
定期從開源平臺掃描關於企業相關的原始碼專案。
越權
定義
“超出了你自己所擁有的許可權,幹了你本來不可能幹的事情。”
水平越權:使用者A未授權可以訪問使用者B的資料。
垂直越權:未登入使用者可以訪問需要授權的應用。
舉例,本來使用者A只能檢視自己的訂單資料,但是他通過修改URL引數就能檢視到使用者B的訂單資料。
未登入的使用者,可以訪問到後臺模組並進行操作。
防禦
對於所有涉及到使用者資料的操作,必須嚴格判斷當前使用者的身份。
對於所有需要許可權控制的位置,必須嚴格檢驗使用者許可權級別。
設計缺陷
返回資訊過多
舉例,登入時進行驗證,當用戶不存在時,返回“使用者不存在”,當用戶被禁用時,返回“使用者已被禁用”。
避免攻擊者進行惡意嘗試,不應該返回過多的資訊,可以統一返回“使用者名稱或密碼錯誤”。
簡訊介面被惡意攻擊
舉例,註冊或登入時使用者輸入手機號碼就可直接觸發簡訊介面,這塊最容易被攻擊者進行簡訊轟炸。
應該進行增加介面呼叫限制:
-
設定同一手機號簡訊傳送間隔
-
設定每個IP地址每日最大發送量
-
設定每個手機號每日最大發送量
-
升級驗證碼,採用滑動拼圖、文字點選、圖表點選...
-
升級簡訊介面的驗證方法
小結
文章主要講解了 SQL注入攻擊、XSS攻擊、SSRF攻擊、CSRF攻擊、檔案上傳漏洞、資訊洩露、越權、設計缺陷等八大方面,通過這次的梳理,也使我自己對PHP WEB安全防禦有了一個全面瞭解。
同時還要時刻保持警惕,所有使用者輸入的資料都是不值得信任的,接收到的資料必須經過校驗和過濾。
也不要輕易相信從網路上發現的程式碼,在使用第三方類庫或程式碼時抱有懷疑的態度,要多進行除錯和驗證,看起來沒問題的程式碼可能隱藏了很多的安全隱患。
最後,推薦一款開源的漏洞演示平臺,包含了100多個漏洞。
這個是安裝在本地的,大家嘗試注入惡意程式碼,同時也警醒自己不要犯這樣的錯誤。
bWAPP:http://www.itsecgames.com/