校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁(yè) > 知識(shí)庫(kù) > 淺談php://filter的妙用

淺談php://filter的妙用

熱門標(biāo)簽:上海公司外呼系統(tǒng)線路 芒果電銷機(jī)器人 銀川ai電話機(jī)器人 十堰ai電話機(jī)器人效果怎么樣 浙江外呼電話系統(tǒng)軟件 地圖標(biāo)注風(fēng)向標(biāo) 電梯外呼線路板維修視頻 臨沂智能電銷機(jī)器人軟件 安陽(yáng)自動(dòng)外呼系統(tǒng)價(jià)格是多少

php://filter是PHP中獨(dú)有的協(xié)議,利用這個(gè)協(xié)議可以創(chuàng)造很多“妙用”,本文說(shuō)幾個(gè)有意思的點(diǎn),剩下的大家自己下去體會(huì)。本來(lái)本文的思路我上半年就準(zhǔn)備拿來(lái)做XDCTF2016的題目的,沒(méi)想到被三個(gè)白帽的一題搶先用了,我也就只好提前分享一下。

XXE中的使用

php://filter之前最常出鏡的地方是XXE。由于XXE漏洞的特殊性,我們?cè)谧x取HTML、PHP等文件時(shí)可能會(huì)拋出此類錯(cuò)誤parser error : StartTag: invalid element name 。其原因是,PHP是基于標(biāo)簽的腳本語(yǔ)言,?php ... ?>這個(gè)語(yǔ)法也與XML相符合,所以在解析XML的時(shí)候會(huì)被誤認(rèn)為是XML,而其中內(nèi)容(比如特殊字符)又有可能和標(biāo)準(zhǔn)XML沖突,所以導(dǎo)致了出錯(cuò)。

那么,為了讀取包含有敏感信息的PHP等源文件,我們就要先將“可能引發(fā)沖突的PHP代碼”編碼一遍,這里就會(huì)用到php://filter。

php://filter是PHP語(yǔ)言中特有的協(xié)議流,作用是作為一個(gè)“中間流”來(lái)處理其他流。比如,我們可以用如下一行代碼將POST內(nèi)容轉(zhuǎn)換成base64編碼并輸出:

readfile("php://filter/read=convert.base64-encode/resource=php://input");

如下:

所以,在XXE中,我們也可以將PHP等容易引發(fā)沖突的文件流用php://filter協(xié)議流處理一遍,這樣就能有效規(guī)避特殊字符造成混亂。

如下,我們使用的是php://filter/read=convert.base64-encode/resource=./xxe.php

巧用編碼與解碼

使用編碼不光可以幫助我們獲取文件,也可以幫我們?nèi)コ恍安槐匾穆闊薄?/p>

記得前段時(shí)間三個(gè)白帽有個(gè)比賽,其中有一部分代碼大概類似于以下:

?php
$content = '?php exit; ?>';
$content .= $_POST['txt'];
file_put_contents($_POST['filename'], $content);

 $content在開(kāi)頭增加了exit過(guò)程,導(dǎo)致即使我們成功寫入一句話,也執(zhí)行不了(這個(gè)過(guò)程在實(shí)戰(zhàn)中十分常見(jiàn),通常出現(xiàn)在緩存、配置文件等等地方,不允許用戶直接訪問(wèn)的文件,都會(huì)被加上if(!defined(xxx))exit;之類的限制)。那么這種情況下,如何繞過(guò)這個(gè)“死亡exit”?

幸運(yùn)的是,這里的$_POST['filename']是可以控制協(xié)議的,我們即可使用 php://filter協(xié)議來(lái)施展魔法:使用php://filter流的base64-decode方法,將$content解碼,利用php base64_decode函數(shù)特性去除“死亡exit”。

眾所周知,base64編碼中只包含64個(gè)可打印字符,而PHP在解碼base64時(shí),遇到不在其中的字符時(shí),將會(huì)跳過(guò)這些字符,僅將合法字符組成一個(gè)新的字符串進(jìn)行解碼。

所以,一個(gè)正常的base64_decode實(shí)際上可以理解為如下兩個(gè)步驟:

?php
$_GET['txt'] = preg_replace('|[^a-z0-9A-Z+/]|s', '', $_GET['txt']);
base64_decode($_GET['txt']);

所以,當(dāng)$content被加上了?php exit; ?>以后,我們可以使用 php://filter/write=convert.base64-decode 來(lái)首先對(duì)其解碼。在解碼的過(guò)程中,字符、?、;、>、空格等一共有7個(gè)字符不符合base64編碼的字符范圍將被忽略,所以最終被解碼的字符僅有“phpexit”和我們傳入的其他字符。

“phpexit”一共7個(gè)字符,因?yàn)閎ase64算法解碼時(shí)是4個(gè)byte一組,所以給他增加1個(gè)“a”一共8個(gè)字符。這樣,"phpexita"被正常解碼,而后面我們傳入的webshell的base64內(nèi)容也被正常解碼。結(jié)果就是?php exit; ?>沒(méi)有了。

最后效果是 :

利用字符串操作方法

有的同學(xué)說(shuō),base64的算法我不懂,上面的方法太復(fù)雜了。

其實(shí),除了使用base64特性的方法外,我們還可以利用php://filter字符串處理方法來(lái)去除“死亡exit”。我們觀察一下,這個(gè)?php exit; ?>實(shí)際上是什么?

實(shí)際上是一個(gè)XML標(biāo)簽,既然是XML標(biāo)簽,我們就可以利用strip_tags函數(shù)去除它,而php://filter剛好是支持這個(gè)方法的。

編寫如下測(cè)試代碼即可查看 php://filter/read=string.strip_tags/resource=php://input 的效果:

echo readfile('php://filter/read=string.strip_tags/resource=php://input');

可見(jiàn),?php exit; ?>被去除了。但回到上面的題目,我們最終的目的是寫入一個(gè)webshell,而寫入的webshell也是php代碼,如果使用strip_tags同樣會(huì)被去除。

萬(wàn)幸的是,php://filter允許使用多個(gè)過(guò)濾器,我們可以先將webshell用base64編碼。在調(diào)用完成strip_tags后再進(jìn)行base64-decode。“死亡exit”在第一步被去除,而webshell在第二步被還原。

最終的數(shù)據(jù)包如下:

除此之外,我們還可以利用rot13編碼獨(dú)立完成任務(wù)。原理和上面類似,核心是將“死亡exit”去除。?php exit; ?>在經(jīng)過(guò)rot13編碼后會(huì)變成?cuc rkvg; ?>,在PHP不開(kāi)啟short_open_tag時(shí),php不認(rèn)識(shí)這個(gè)字符串,當(dāng)然也就不會(huì)執(zhí)行了:

當(dāng)然,這個(gè)方法的條件就是不開(kāi)啟短標(biāo)簽。

以上就是關(guān)于php://filter的妙用的疑惑全部?jī)?nèi)容,感謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • php中使用array_filter()函數(shù)過(guò)濾空數(shù)組的實(shí)現(xiàn)代碼
  • 巧用php中的array_filter()函數(shù)去掉多維空值的代碼分享
  • php array_filter除去數(shù)組中的空字符元素

標(biāo)簽:遂寧 常州 吐魯番 遵義 寧夏 武威 荊門 徐州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談php://filter的妙用》,本文關(guān)鍵詞  淺談,php,filter,的,妙用,淺談,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談php://filter的妙用》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于淺談php://filter的妙用的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 昌宁县| 古丈县| 交城县| 会东县| 沈丘县| 中宁县| 亳州市| 德令哈市| 苗栗县| 同德县| 县级市| 泰和县| 专栏| 亳州市| 射洪县| 东至县| 隆昌县| 湘潭市| 温泉县| 姜堰市| 同心县| 泸州市| 新晃| 茂名市| 新乡县| 洛南县| 个旧市| 重庆市| 浮山县| 永嘉县| 聂荣县| 军事| 板桥市| 和龙市| 龙川县| 隆林| 远安县| 贡嘎县| 酒泉市| 台东县| 卓尼县|