溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

web文件操作常見(jiàn)安全漏洞有哪些

發(fā)布時(shí)間:2021-10-12 13:38:46 來(lái)源:億速云 閱讀:127 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下web文件操作常見(jiàn)安全漏洞有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

做web開(kāi)發(fā),我們經(jīng)常會(huì)做代碼走查,很多時(shí)候,我們都會(huì)抽查一些核心功能,或者常會(huì)出現(xiàn)漏洞的邏輯。隨著技術(shù)團(tuán)隊(duì)的壯大,組員技術(shù)日益成熟。 常見(jiàn)傻瓜型SQL注入漏洞、以及XSS漏洞。會(huì)越來(lái)越少,但是我們也會(huì)發(fā)現(xiàn)一些新興的隱蔽性漏洞偶爾會(huì)出現(xiàn)。這些漏洞更多來(lái)自開(kāi)發(fā)人員,對(duì)一個(gè)函數(shù)、常見(jiàn)模塊功能設(shè)計(jì)不足,遺留下的問(wèn)題。以前我們能夠完成一些功能模塊,現(xiàn)在要求是要安全正確方法完成模塊才行。 接下來(lái),我會(huì)分享一些常見(jiàn)功能模塊,由于設(shè)計(jì)原因?qū)е侣┒闯霈F(xiàn)。下面,我們先看下,讀取文件型功能漏洞。
我們先看下下面一段代碼,通過(guò)用戶(hù)輸入不同目錄,包含不同文件

代碼如下:


<?php
///讀取模塊名稱(chēng)
$mod = isset($_GET['m'])?trim($_GET['m']):'index';
///過(guò)濾目錄名稱(chēng)不讓跳轉(zhuǎn)到上級(jí)目錄
$mod = str_replace("..",".",$mod);
///得到文件
$file = "/home/www/blog/".$mod.".php";
///包含文件
@include($file);


這段代碼,可能在很多朋友做的程序里面有遇到過(guò),對(duì)于新人來(lái)說(shuō),也是很容易出現(xiàn)這樣問(wèn)題,記得走查遇到該代碼時(shí)候,我問(wèn)到,你這個(gè)代碼安全方面能做到那些?
答:1. 對(duì)”..”目錄有做替換,因此用戶(hù)傳入模塊名里面有有..目錄都會(huì)被替換掉了。
    2.構(gòu)造拼接file名稱(chēng),有前面目錄限制,有后面擴(kuò)展名限制,包含文件就會(huì)限制在該目錄了
這段代碼真的做到了目錄安全檢測(cè)嗎?
我們來(lái)測(cè)試下,如果$mod傳入這個(gè)值將會(huì)是什么樣的結(jié)果。web文件操作常見(jiàn)安全漏洞有哪些

$mod 通過(guò)構(gòu)造輸?mod=…%2F…%2F…%2F…%2Fetc%2Fpasswd%00 ,我們看結(jié)果將是:

web文件操作常見(jiàn)安全漏洞有哪些

居然include(“/etc/passwd”)文件了。
怎么逃脫了我參數(shù)限制呢?
首先:
做參數(shù)過(guò)濾類(lèi)型去限制用戶(hù)輸入本來(lái)就不是一個(gè)好方法,一般規(guī)則是:能夠做檢測(cè)的,不要做替換 只要是檢測(cè)不通過(guò)的,直接pass 掉!這是我們的一個(gè)原則。過(guò)濾失敗情況,舉不勝舉,我們來(lái)看看,實(shí)際過(guò)程。
1、輸入”…/…/…/” 通過(guò)把”..” 替換為”.”后
2、結(jié)果是”../../../” 就變成了這個(gè)了
有朋友就會(huì)說(shuō),如果我直接替換為空格是不是就好了?在這個(gè)里面確實(shí)可以替換掉。但是不代表以后你都替換為空格就好了。再舉例子下。如:有人將字符串里面javascript替換掉。代碼如下:

復(fù)制代碼 代碼如下:


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


看似不會(huì)出現(xiàn)了javascript了,但是,如果輸入:jjavascriptavascript 替換,會(huì)替換掉中間一個(gè)變?yōu)榭蘸?。前面的”j” 跟后面的會(huì)組成一個(gè)新的javascript了。

其次:我們看看,怎么逃脫了,后面的.php 限制呢。用戶(hù)輸入的參數(shù)有:”etc/passwd\0” ,\0字符非常特殊,一段連接后,文件名稱(chēng)變成了”……etc/passwd\0.php”,你打印出該變量時(shí)候,還是正確的。但是,一段放入到文件讀寫(xiě)操作方法里面,\0后面會(huì)自動(dòng)截?cái)唷2僮飨到y(tǒng),只會(huì)讀取……etc/passwd文件了。 “\0”會(huì)出現(xiàn)在所有文件系統(tǒng)讀寫(xiě)文件變量中。都會(huì)同樣處理。這根c語(yǔ)言\0作為字符串完整標(biāo)記有關(guān)系。
通過(guò)上面分析,大家發(fā)現(xiàn)做文件類(lèi)型操作時(shí)候,一不注意將產(chǎn)生大的漏洞。而且該漏洞就可能引發(fā)一系列安全問(wèn)題。

該怎么做文件類(lèi)操作呢?
到這里,估計(jì)有人就會(huì)思考這個(gè),做文件讀寫(xiě)操作時(shí)候,如果路徑里面有變量時(shí)候,我該怎么樣做呢?有人會(huì)說(shuō),替換可以嗎? “可以”,但是這個(gè)方法替換不嚴(yán)格,將會(huì)出現(xiàn)很多問(wèn)題。而且,對(duì)于初寫(xiě)朋友,也很難杜絕。 做正確的事情,選擇了正確的方法,會(huì)從本身杜絕問(wèn)題出現(xiàn)可能了。 這里,我建議:對(duì)于變量做白名單限制。

1.什么是白名單限制

復(fù)制代碼 代碼如下:


舉例來(lái)說(shuō):
$mod = isset($_GET['m'])?trim($_GET['m']):'index'; ///讀取模塊名稱(chēng)后
mod變量值范圍如果是枚舉類(lèi)型那么:
if(!in_array($mod,array(‘user','index','add','edit'))) exit(‘err!!!');
完全限定了$mod,只能在這個(gè)數(shù)組中,夠狠?。。。?br/>

2.怎么做白名單限制
通過(guò)剛才例子,我們知道如果是枚舉類(lèi)型,直接將值放到list中即可,但是,有些時(shí)候,這樣不夠方面。我們還有另外一個(gè)白名單限制方法。就是限制字符范圍

復(fù)制代碼 代碼如下:


舉例來(lái)說(shuō):
$mod = isset($_GET['m'])?trim($_GET['m']):'index'; ///讀取模塊名稱(chēng)后
我限制知道$mod是個(gè)目錄名稱(chēng),對(duì)于一般站點(diǎn)來(lái)說(shuō),就是字母加數(shù)字下劃線(xiàn)之類(lèi)。
if(!preg_match(“/^\w+$/”,$mod)) exit(‘err!!!');
字符只能是:[A-Za-z0-9_] 這些了。夠狠?。。?br/>

以上是“web文件操作常見(jiàn)安全漏洞有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

web
AI