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

常見漏洞

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

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

SQL注入攻擊

定義

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

案例

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

用戶惡意輸入:redis

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

注入後的Sql語句:sql

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

執行注入後的Sql語句,能夠返回 user 表的所有數據。shell

平時咱們能夠進行自測,好比使用單引號、雙引號,若是是數字進行+1或-1。數據庫

SQL注入的危害很大,利用SQL注入能夠進行,拖庫刪庫刪表UDF提權讀取文件...瀏覽器

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

SQLmaphttp://sqlmap.org/

  • 支持各類數據庫管理系統(MySql、Oracle、SQL Server、SQLite ... )。
  • 支持自動識別密碼哈希格式並經過字典破解密碼哈希。
  • 支持枚舉用戶、密碼、哈希、權限、角色、數據庫、數據表和列。
  • 支持徹底地下載某個數據庫中的某個表、某個列。
  • 支持在數據庫管理系統中搜索指定的數據庫名、表名或列名。
  • 支持下載或上傳文件。
  • 支持執行任意命令並回現標準輸出。
  • 支持布爾型盲注、時間型盲注、基於錯誤信息的注入、聯合查詢注入和堆查詢注入。

嘗試着利用工具,注入本身的項目,發現問題,而後解決問題。

SQL注入的危害,遠比咱們想象的要大!

防護

推薦解決方案是使用 PDOMySQLi 的數據庫擴展。

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> 進行提交。

推薦一個專門針對瀏覽器攻擊的框架。

BeEFhttps://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/blog/2016/09/csp.html

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

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

bWAPPhttp://www.itsecgames.com/

本文歡迎轉發,轉發請註明做者和出處,謝謝!

相關文章
相關標籤/搜索