解析web檔案操作常見安全性漏洞(目錄、檔案名稱檢測漏洞_PHP教程

來源:互聯網
上載者:User
 做web開發,我們經常會做代碼走查,很多時候,我們都會抽查一些核心功能,或者常會出現漏洞的邏輯。隨著技術團隊的壯大,組員技術日益成熟。 常見傻瓜型SQL注入漏洞、以及XSS漏洞。會越來越少,但是我們也會發現一些新興的隱蔽性漏洞偶爾會出現。這些漏洞更多來自開發人員,對一個函數、常見 模組功能設計不足,遺留下的問題。以前我們能夠完成一些功能模組,現在要求是要安全正確方法完成模組才行。 接下來,我會分享一些常見功能模組,由於設計原因導致漏洞出現。下面,我們先看下,讀取檔案型功能漏洞。

  我們先看下下面一段代碼,通過使用者輸入不同目錄,包含不同檔案

$mod = str_replace("..",".",$mod);///得到檔案$file = "/home/www/blog/".$mod.".php";///包含檔案@include($file);

  這段代碼,可能在很多朋友做的程式裡面有遇到過,對於新人來說,也是很容易出現這樣問題,記得走查遇到該代碼時候,我問到,你這個代碼安全方面能做到那些?

答:1. 對”..”目錄有做替換,因此使用者傳入模組名裡面有有..目錄都會被替換掉了。

2.構造拼接file名稱,有前面目錄限制,有後面副檔名限制,包含檔案就會限制在該目錄了

  • 這段代碼真的做到了目錄安全檢測嗎?

我們來測試下,如果$mod傳入這個值將會是什麼樣的結果。

$mod 通過構造輸?mod=…%2F…%2F…%2F…%2Fetc%2Fpasswd%00 ,我們看結果將是:

居然include(“/etc/passwd”)檔案了。

  • 怎麼逃脫了我參數限制呢?

  首先:做參數過濾類型去限制使用者輸入本來就不是一個好方法,一般規則是:能夠做檢測的,不要做替換 只要是檢測不通過的,直接pass 掉!這是我們的一個原則。過濾失敗情況,舉不勝舉,我們來看看,實際過程。

1、輸入”…/…/…/” 通過把”..” 替換為”.”後

2、結果是”../../../” 就變成了這個了

有朋友就會說,如果我直接替換為空白格是不是就好了?在這個裡面確實可以替換掉。但是不代表以後你都替換為空白格就好了。再舉例子下。如:有人將字串裡面javascript替換掉。代碼如下:

……

$msg = str_replace(“javascript”,””,$msg);

看似不會出現了javascript了,但是,如果輸入:jjavascriptavascript 替換,會替換掉中間一個變為空白後。前面的”j” 跟後面的會組成一個新的javascript了。

  其次:我們看看,怎麼逃脫了,後面的.php 限制呢。使用者輸入的參數有:”etc/passwd” ,字元非常特殊,一段串連後,檔案名稱變成了”……etc/passwd.php”,你列印出該變數時候,還是正確的。但是,一段放入到檔案讀寫 操作方法裡面,後面會自動截斷。作業系統,只會讀取……etc/passwd檔案了。 “”會出現在所有檔案系統讀寫檔案變數中。都會同樣處理。這根c語言作為字串完整標記有關係。

通過上面分析,大家發現做檔案類型操作時候,一不注意將產生大的漏洞。而且該漏洞就可能引發一系列安全問題。

  • 該怎麼做檔案類操作呢?

  到這裡,估計有人就會思考這個,做檔案讀寫操作時候,如果路徑裡面有變數時候,我該怎麼樣做呢?有人會說,替換可以嗎? “可以”,但是這個方法替換不嚴格,將會出現很多問題。而且,對於初寫朋友,也很難杜絕。 做正確的事情,選擇了正確的方法,會從本身杜絕問題出現可能了。 這裡,我建議:對於變數做白名單限制。

  1. 什麼是白名單限制

    舉例來說:

    $mod = isset($_GET['m'])?trim($_GET['m']):’index’; ///讀模數塊名稱後

    mod變數值範圍如果是枚舉類型那麼:

    if(!in_array($mod,array(‘user’,’index’,’add’,’edit’))) exit(‘err!!!’);

    完全限定了$mod,只能在這個數組中,夠狠!!!!

  2. 怎麼做白名單限制

通過剛才例子,我們知道如果是枚舉類型,直接將值放到list中即可,但是,有些時候,這樣不夠方面。我們還有另外一個白名單限制方法。就是限制字元範圍

舉例來說:

$mod = isset($_GET['m'])?trim($_GET['m']):’index’; ///讀模數塊名稱後

我限制知道$mod是個目錄名稱,對於一般網站來說,就是字母加數字底線之類。

if(!preg_match(“/^w+$/”,$mod)) exit(‘err!!!’);

字元只能是:[A-Za-z0-9_] 這些了。夠狠!!!

總結:是不是發現,白名單限制方法,做起來其實很簡單,你知道那個地方要什麼,就對輸入檢測必須是那些。而且,檢測自己已知的,比替換那些未知的字元,是不是簡單多了。 好了,先到這裡,正確的解決問題方法,會讓檔案簡單,而且更安全!!歡迎交流!

http://www.bkjia.com/PHPjc/372237.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/372237.htmlTechArticle做web開發,我們經常會做代碼走查,很多時候,我們都會抽查一些核心功能,或者常會出現漏洞的邏輯。隨著技術團隊的壯大,組員技術日...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.