看到上圖的漏洞是否是特別熟悉,若是不進行及時防護,就會產生蝴蝶效應。php
往下看,可能會找到你要的答案。html
SQL注入攻擊是經過WEB表單提交,在URL參數提交或Cookie參數提交,將懷有惡意的「字符串」,提交給後臺數據庫,欺騙服務器執行惡意的SQL語句。mysql
//以用戶登陸爲例,當驗證用戶名和密碼是否正確時 $sql = "SELECT * FROM user WHERE username = '".$_GET['username']."' AND password = '".$_GET['password']."'";
用戶惡意輸入:web
$_GET['username'] = "' or 1=1 -- '"; $_GET['password'] = "123456";
注入後的Sql語句:redis
$sql = "SELECT * FROM user WHERE username = '' or 1=1 -- ''AND password = '123456'";
執行注入後的Sql語句,能夠返回 user 表的所有數據。sql
平時咱們能夠進行自測,好比使用單引號、雙引號,若是是數字進行+1或-1。shell
SQL注入的危害很大,利用SQL注入能夠進行,拖庫、刪庫、刪表、UDF提權、讀取文件、... 數據庫
推薦一個開源的自動化的SQL注入工具。segmentfault
SQLmap:http://sqlmap.org/瀏覽器
嘗試着利用工具,注入本身的項目,發現問題,而後解決問題。
SQL注入的危害,遠比咱們想象的要大!
推薦解決方案是使用 PDO 或 MySQLi 的數據庫擴展。
PHP官方文檔中介紹,MySQL擴展自PHP 5.5.0起已廢棄,並在自PHP7.0.0開始被移除。
若是已經在用MySQL擴展了,能夠對傳入的每一個參數作驗證,並使用框架的ORM進行查詢。
另外:addslashes 和 mysql_real_escape_string 這種轉義是不安全的!
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(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(Cross-site request forgery:跨站請求僞造)是攻擊者經過假裝成受信任的用戶,盜用受信任用戶的身份,用受信任用戶的身份發送惡意請求。
從上圖看出,完成一次CSRF攻擊,須要完成兩個步驟:
1.登陸受信任網站A,本地生成網站A的Cookie。
2.未退出網站A的狀況下,訪問危險網站B。
具體危害要看受信任網站是作什麼的,若是是社交網站能夠操控發廣告,若是是電商網站能夠操控購物,若是是銀行網站甚至還能夠操控轉帳,......
這樣危害會形成我的信息的泄露和財產的損失。
Cookie Hashing,表單提交或Ajax提交,必須使用csrf token。
對於不肯定是否有csrf風險的請求,可使用驗證碼(儘管體驗會變差)。
對於一些重要的操做(修改密碼、修改郵箱),必須使用二次驗證。
文件上傳漏洞是攻擊者上傳了一個可執行的文件到服務器上執行。
可執行文件包括有病毒、木馬、惡意腳本等。
文件上傳漏洞與SQL注入或XSS相比,其風險更大,若是存在上傳漏洞攻擊者甚至能夠直接上傳一個webshell腳本到服務器上。
信息泄露主要指用戶的手機號、郵箱、密碼、身份證、地址等敏感數據泄露,還有服務器上的文件和環境變量等敏感數據泄露,還包括將直接將企業源碼上傳到開發平臺。
好比開發接口時,接口返回明文的手機號。
好比調試代碼時,代碼中提交了一些調試信息,未進行刪除。
......
「超出了你本身所擁有的權限,幹了你原本不可能幹的事情。」
水平越權:用戶A未受權能夠訪問用戶B的數據。
垂直越權:未登陸用戶能夠訪問須要受權的應用。
舉例,原本用戶A只能查看本身的訂單數據,可是他經過修改URL參數就能查看到用戶B的訂單數據。
未登陸的用戶,能夠訪問到後臺模塊並進行操做。
對於全部涉及到用戶數據的操做,必須嚴格判斷當前用戶的身份。
對於全部須要權限控制的位置,必須嚴格檢驗用戶權限級別。
舉例,登陸時進行驗證,當用戶不存在時,返回「用戶不存在」,當用戶被禁用時,返回「用戶已被禁用」。
避免攻擊者進行惡意嘗試,不該該返回過多的信息,能夠統一返回「用戶名或密碼錯誤」。
舉例,註冊或登陸時用戶輸入手機號碼就可直接觸發短信接口,這塊最容易被攻擊者進行短信轟炸。
應該進行增長接口調用限制:
文章主要講解了 SQL注入攻擊、XSS攻擊、SSRF攻擊、CSRF攻擊、文件上傳漏洞、信息泄露、越權、設計缺陷等八大方面,經過此次的梳理,也使我本身對PHP WEB安全防護有了一個全面瞭解。
同時還要時刻保持警戒,全部用戶輸入的數據都是不值得信任的,接收到的數據必須通過校驗和過濾。
也不要輕易相信從網絡上發現的代碼,在使用第三方類庫或代碼時抱有懷疑的態度,要多進行調試和驗證,看起來沒問題的代碼可能隱藏了不少的安全隱患。
最後,推薦一款開源的漏洞演示平臺,包含了100多個漏洞。
這個是安裝在本地的,你們嘗試注入惡意代碼,同時也警醒本身不要犯這樣的錯誤。
bWAPP:http://www.itsecgames.com/
本文歡迎轉發,轉發請註明做者和出處,謝謝!