系統的講解 - PHP WEB 安全防禦

常見漏洞


看到上圖的漏洞是不是特別熟悉,如果不進行及時防禦,就會產生蝴蝶效應。

往下看,可能會找到你要的答案。

SQL注入攻擊


定義

SQL注入攻擊是通過WEB表單提交,在URL參數提交或Cookie參數提交,將懷有惡意的“字符串”,提交給後臺數據庫,欺騙服務器執行惡意的SQL語句。

案例

//以用戶登錄爲例,當驗證用戶名和密碼是否正確時
$sql = "SELECT * FROM user WHERE 
        username = '".$_GET['username']."' AND 
        password = '".$_GET['password']."'";

用戶惡意輸入:

$_GET['username'] = "' or 1=1 -- '";
$_GET['password'] = "123456";

注入後的Sql語句:

$sql = "SELECT * FROM user WHERE username = '' 
        or 1=1 -- ''AND password = '123456'";

執行注入後的Sql語句,可以返回 user 表的全部數據。

平時我們可以進行自測,比如使用單引號、雙引號,如果是數字進行+1或-1。

SQL注入的危害很大,利用SQL注入可以進行,拖庫刪庫刪表UDF提權讀取文件...

推薦一個開源的自動化的SQL注入工具。

SQLmaphttp://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>

//DOM型,代碼舉例
<script>
var temp = document.URL;
var temp_new = temp+'test'
document.write(decodeURI(temp_new));
</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攻擊。

//設置Cookie
setcookie($name, $value, $expire, $path, $domain, $secure, $httponly); 

//然後服務端通過使用 $_COOKIE 進行驗證。

可以使用Content Security Policy,它的實質就是白名單制度。

入門教程請參考:http://www.ruanyifeng.com/blo...

SSRF攻擊


定義

SSRF(Server-Side Request Forgery:服務器端請求僞造) 是攻擊者僞造服務器端發起的請求,雖然攻擊者無法從外網訪問內網的系統,但是它通過注入惡意代碼從服務端發起,通過服務端就再訪問內網的系統,然後獲取不該獲取的數據。

案例

漏洞主要產生在包含這些方法的代碼中,比如 curl、file_get_contents、fsockopen。

//代碼片段
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);

請求地址:http://www.xxx.com/demo.php?u...

將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多個漏洞。

這個是安裝在本地的,大家嘗試注入惡意代碼,同時也警醒自己不要犯這樣的錯誤。

bWAPPhttp://www.itsecgames.com/

發佈了2 篇原創文章 · 獲贊 36 · 訪問量 39萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章