日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

php://filter利用条件,浅谈php://filter技巧

發(fā)布時(shí)間:2024/9/27 php 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php://filter利用条件,浅谈php://filter技巧 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。