1. 程式人生 > 實用技巧 >攻防世界-web-blgdel(.htaccess檔案上傳、上傳+包含漏洞)

攻防世界-web-blgdel(.htaccess檔案上傳、上傳+包含漏洞)

題目來源:CISCN-2018-Final
題目描述:暫無

開啟頁面,是一個購物網站,可以註冊、登入、新增購物車、購買商品等。

掃描目錄

發現robots.txt

開啟/config.txt,發現是原始碼

程式碼審計(我給加了一些註釋,方便理解)

<?php

class master
{
    private $path;
    private $name;
    
    function __construct()
    {
        
    }
    
    function stream_open($path) #對path的傳參和name的傳參從字串到變數,做了一個方法對應。
{ if(!preg_match('/(.*)\/(.*)$/s',$path,$array,0,9)) return 1; $a=$array[1]; parse_str($array[2],$array);#parse_str() 函式把查詢字串解析到變數中。 if(isset($array['path'])) { $this->path=$array['path']; } else return
1; if(isset($array['name'])) { $this->name=$array['name']; } else return 1; if($a==='upload') { return $this->upload($this->path,$this->name); } elseif($a==='search') {
return $this->search($this->path,$this->name); } else return 1; } function upload($path,$name) #過濾了檔案內容。 { if(!preg_match('/^uploads\/[a-z]{10}\/$/is',$path)||empty($_FILES[$name]['tmp_name'])) return 1; $filename=$_FILES[$name]['name']; echo $filename; $file=file_get_contents($_FILES[$name]['tmp_name']); #將檔案內容中的< " ' .都替換成! $file=str_replace('<','!',$file); $file=str_replace(urldecode('%03'),'!',$file); $file=str_replace('"','!',$file); $file=str_replace("'",'!',$file); $file=str_replace('.','!',$file); #過濾檔案內容中的file:、http和pre if(preg_match('/file:|http|pre|etc/is',$file)) #/i不區分大小寫,/s單行模式匹配 { echo 'illegalbbbbbb!'; return 1; } file_put_contents($path.$filename,$file); #將過濾後的檔案內容寫回檔案中 file_put_contents($path.'user.jpg',$file); #將過濾後的檔案內容寫入user.jpg中 echo 'upload success!'; return 1; } #判斷是否存在path路徑,對當前目錄進行遍歷,存在和name相同的檔案或者目錄替換為空 並列出當前目錄。 function search($path,$name) { if(!is_dir($path)) { echo 'illegal!'; return 1; } $files=scandir($path); echo '</br>'; foreach($files as $k=>$v) { if(str_ireplace($name,'',$v)!==$v) { echo $v.'</br>'; } } return 1; } function stream_eof() { return true; } function stream_read() { return ''; } function stream_stat() { return ''; } } stream_wrapper_unregister('php'); stream_wrapper_unregister('phar'); stream_wrapper_unregister('zip'); stream_wrapper_register('master','master'); ?>

註冊並登陸一個使用者,進入個人中心,發現有上傳點

點選上傳一個頭像,系統提示級別過低

估計要拿一個高分的賬戶

後面注意到註冊頁面有個推薦人,試了一下,註冊一個新賬戶給10個積分

到達100積分的時候可以上傳檔案

嘗試上傳木馬,失敗。

但是上傳一個正常的php檔案是可以的

從剛開始目錄掃描的結果,我們知道,存在uploads目錄,找到hacker.php檔案並在瀏覽器開啟

發現<已被替換成了!,無法執行。

繼續嘗試,我們發現.htaccess可以被上傳,意味著我們可以包含檔案。

首先,通過構造master協議來搜尋檔案

構造 php_value auto_append_file master://search/path=%2fhome%2f&name=flag

放進.htaccess裡面,上傳

訪問hacker.php,在同目錄下的 php檔案中讀取到flag名字檔案。

然後,直接將flag檔案內容包含進來

構造php_value auto_append_file /home/hiahiahia_flag

放進.htaccess裡面,上傳

訪問hacker.php,得到flag。

這道題太難了,附上官方的wp參考

首先可以對本系統進行常規測試,發現沒有注入,xss等常見漏洞,接著觀察系統在基本功能要求之外的功能,即一個上傳點(上傳頭像圖片),和一個搜尋點(搜尋以前頭像)或許就是突破口,需要積分,註冊10個新使用者,得到100分即可到達這個level,然後目錄通過使用者圖片位置得到 還發現了robots.txt,其中有一個提示config.txt,訪問config.txt得到config.php的原始碼,發現常規的偽協議如php,zip,phar都被登出掉了,但是新註冊了一個master協議 根據原始碼和測試,發現經過上傳點上傳的檔案目錄不可控,同時檔案內容中的<被過濾掉了,觀察原始碼,搜尋點是根據分配給使用者的目錄搜尋的,不能控制,而檔名也是通過匹配得到的,不是通過命令執行什麼的得到的,所以也沒辦法控制。 因為給了每個使用者單獨目錄,所以可以嘗試著上傳一個.htaccess,其中可以寫入php_value auto_prepend_file 1 這種語句,即通過上傳漏洞,上傳一個包含點上去,將上傳漏洞變為上傳+包含漏洞 通過測試,可以發現php,zip,phar都不能使用,而結合上傳時pre為黑名單,可以想到此時的網站auto_prepend_file為這個config.php,無法修改,即無法替換auto_prepend_file而使用php,zip等偽協議 所以只能考慮遠端包含,和新註冊的master協議,遠端包含失敗,只能考慮master協議 分析協議的構成,發現如果我們可以控制協議,則可以給任意目錄上傳/搜尋檔案,而協議流程和物件注入差不多,先是執行__construct,再是stream_open,upload/search,stream_read...主要是upload和search,其餘方法都做了處理,可以不管。 而上傳目錄被限制了,但我們可以搜尋檔案 通過上傳.htaccess,內容為php_value auto_append_file master://search/path={}&name={},可以在任意目錄下搜尋檔案,此時注意/要替換為%2f,否則不能成功 搜尋結果可以通過上傳並訪問一個test.php看到 通過幾次簡單測試,可以得到在payload為php_value auto_append_file master://search/path=%2fhome%2f&name=flag時,找到了hiahiahia_flag檔案 此時我們再上傳一個.htaccess,內容為php_value auto_append_file /home/hiahiahia_flag即包含flag 再訪問test.php,可以看到flag。

參考:https://www.cnblogs.com/mke2fs/p/11569913.html