小編給大家分享一下如何解決正則使用不當導致的路徑穿越問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創新互聯建站自2013年起,是專業互聯網技術服務公司,擁有項目成都做網站、網站建設、外貿營銷網站建設網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元池州做網站,已為上家服務,為池州各地企業和個人服務,聯系電話:18982081108
題目叫福斯特模式,代碼如下
漏洞解析:
這一關考察的內容是由正則表達式不嚴謹導致的任意文件刪除漏洞, 導致這一漏洞的原因在 第21行, preg_replace中的 pattern部分 ,該正則表達式并未起到過濾目錄路徑字符的作用。[^a-z.-_]
表示匹配除了 a字符到 z字符、.字符到 _字符之間的所有字符。因此,攻擊者還是可以使用點和斜杠符號進行路徑穿越,最終刪除任意文件,例如使用 payload: action = delete&data = ../../ config.php
,便可刪除 config.php文件。
preg_replace:(PHP 4, PHP 5, PHP 7)
功能: 函數執行一個正則表達式的搜索和替換
定義:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索 subject中匹配 pattern的部分, 如果匹配成功將其替換成 replacement。
##實例分析
本次實例分析,我們選取的是 WeEngine0.8版本。漏洞入口文件為 web/source/site/category.ctrl.php,我們可以看到下圖 14行處調用了 file_delete函數,而這是一個文件刪除相關操作,我們可以看一下該函數的具體定義。下圖是入口文件代碼:
file_delete這一函數可以在 framework/function/file.func.php文件中找到,該方法功能用于檢測文件是否存在,如果存在,則刪除文件。但是查看上下文發現,程序并沒有對文件名 $file變量進行過濾,所以文件名就可以存在類似 ../這種字符,這樣也就引發任意文件刪除漏洞,file_delete函數代碼如下:
現在我們在回溯回去,看看 $file變量從何處來。實際上,上圖的 $file變量對應的是 $row['icon']的值,也就是說如果我們可以控制 $row['icon']的值,就可以刪除任意文件。那么我們來看看 $row變量從何而來。該變量就在我們剛剛分析的第一張圖片中( web/source/site/category.ctrl.php文件),該值為變量 $navs中的元素值,具體代碼如下:
我們再往上看,即可找到 $navs變量的取值情況。可以看到 $navs變量的是是重數據庫 site_nav表中取出的,包含了 icon和 id兩個字段,具體代碼如下:
$navs = pdo_fetchall("SELECT icon, id FROM ".tablename('site_nav')." WHERE id IN (SELECT nid FROM ".tablename('site_category')." WHERE id = {$id} OR parentid = '$id')", array(), 'id');
現在我們要做的,就是找找看數據庫中的這兩個字段是否可以被用戶控制。我們繼續往前查找,發現了如下代碼:
site_nav表中的數據,對應的是 $nav變量。我們繼續往上尋找 $nav變量,發現 $nav['icon']變量是從 $_GPC['iconfile']來的,即可被用戶控制( 下圖 第21行)。這里的 $nav['icon']變量,其實就是我們文章開頭分析的傳入 file_delete函數的參數,具體代碼如下:
由于 $nav['icon']變量可被用戶控制,程序有沒有對其進行消毒處理,直接就傳入了 file_delete函數,最終導致了文件刪除漏洞。至此,我們分析完了整個漏洞的發生過程,接下看看如何進行攻擊。
##漏洞驗證
訪問url:http://xxx.xxx.xxx.xxx/WeEngine/web/index.php?c=account&a=display ,點擊管理公眾號:
找到分類設置,點擊添加文章分類。這里對應的url為:http://xxx.xxx.xxx.xxx/WeEngine/web/index.php?c=site&a=category,實際上表示 site控制器的 category模塊,即對應 category.ctrl.php文件。
選擇對應的內容,進入 if($isnav)判斷:
在上傳圖標位置輸入要刪除文件的路徑
我們建立 delete.txt文件,用于測試任意文件刪除:
我們點擊刪除時,就會調用 file_delete函數,同時就會刪除掉我們插入到數據庫中的圖片名:
這個類型任意文件刪除有點類似于二次注入,在添加分類時先把要刪除的文件名稱插入到數據庫中,然后點擊刪除分類時,會從數據庫中取出要刪除的文件名。
##修復建議
漏洞是沒有對 $row['icon']
參數進行過濾,可以將文件名內容加入目錄階層字符,造成任意文件刪除漏洞,所以我們要在傳入的參數中過濾"../"等目錄階層字符,避免目錄穿越,刪除其他文件夾下文件。我們在修復中可以過濾掉 $row['icon']
中的目錄穿越字符,引入我們自定義的一個函數 checkstr
函數。同時 $row['icon']
只是文件的名稱,并非是一個路徑,因此過濾字符并不會影響到實際功能,對此修復意見我們提供如下代碼:
看完了上述分析,不知道大家是否對 路徑穿越問題有了更加深入的理解,文中用到的CMS可以從 這里 下載(密碼:hgjm) 下載,當然文中若有不當之處,還望各位斧正。如果你對我們的項目感興趣,歡迎發送郵件到 hongrisec@gmail.com聯系我們。Day6的分析文章就到這里,我們最后留了一道CTF題目給大家練手,題目如下:
// index.php <?php include 'flag.php'; if ("POST" == $_SERVER['REQUEST_METHOD']) { $password = $_POST['password']; if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password)) { echo 'Wrong Format'; exit; } while (TRUE) { $reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/'; if (6 > preg_match_all($reg, $password, $arr)) break; $c = 0; $ps = array('punct', 'digit', 'upper', 'lower'); foreach ($ps as $pt) { if (preg_match("/[[:$pt:]]+/", $password)) $c += 1; } if ($c < 3) break; if ("42" == $password) echo $flag; else echo 'Wrong password'; exit; } } highlight_file(__FILE__); ?>
// flag.php <?php $flag = "HRCTF{Pr3g_R3plac3_1s_Int3r3sting}";?>
以上是“如何解決正則使用不當導致的路徑穿越問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯行業資訊頻道!
網站題目:如何解決正則使用不當導致的路徑穿越問題
當前路徑:http://vcdvsql.cn/article46/pehohg.html
成都網站建設公司_創新互聯,為您提供App設計、微信小程序、云服務器、企業建站、網頁設計公司、品牌網站設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯