一天晚上,刚刚打开QQ,就看到小企鹅的图标不断闪动,原来是一迷上脚本攻击的学生发来的求救消息:“获得了一个WebShell,但是可能服务器在IIS里限制了上传文件大小,cmd.exe就是传不上去,小一点的文件都可以传,是什么原因啊?”。没有哪个网管会BT到在IIS中把文件上传大小限制得连289K的Cmd.exe也传不上去的,肯定是IIS6.0的默认设置。于是我就回了一句:“是IIS6.0的默认设置引起的。”,“那有什么好的解决办法吗?”学生还不死心。因为自己急着要测试一个软件,想也没想就回复:“拆分、合并啊!”,这下子惹麻烦了,当学生继续询问:“拆分我会,但是如何合并?”时我才想起,Cmd.exe都无法上传,怎么执行“copy /b”命令呢?幸好自己脑子转弯比较快,ASP中的Adodb.Stream对象不是可以操作二进制文件的吗?那肯定可以实现文件合并的功能的。于是回复:“呵呵,用ASP代码实现吧!”
可惜该学生很不争气,几天后还是把我缠住,说什么网上找不到能够实现文件合并的ASP程序,说连新出的海洋6.0也没有这样的功能,甚至激我说老师吹牛……亏我还教过他ASP呢,一点不懂自己动手,丰衣足食的DIY精神,只会利用现成的工具怎么可能成为高手呢?为了不让自己的弟子失望,挽回教师的一丝尊严,于是我花了一个小时写了这个ASP文件合并器,测试了一下,效果还挺好,配合海洋之类的木马,很好地解决了IIS6.0无法上传大于200K以上文件的限制。
ASP合并文件的编程原理
Asp中的Adodb.Stream组件可以操作二进制文件,程序使用了该组件的几个重要的方法。
1.LoadFromFile方法
Object.LoadFromFile(FileName)
说明:将FileName指定的文件装入对像中,参数FileName为指定的文件名。
2.Read 方法
Object.Read(Numbytes)
说明:读取指定长度的二进制内容。
参数说明:Numbytes指定的要读取的找度,不指定则读取全部。
3.Write 方法
Object.Write(Buffer)
说明:将指定的数据装入对象中。
4.SaveToFile 方法
Object.SaveToFile(FileName,[Options])
说明:将对像的内容写到FileName指定的文件中
ASP合并文件的核心代码
为了方便调用,我写了一个子过程。
sub hb(Filename,newname) ’ Filename为要合并的文件名,用”|”放开,newname为要生成的新文件。 Filename=split(Filename,"|") i=ubound(Filename) redim fname(i),fstr(i) set fso = Server.CreateObject("Scripting.FileSystemObject") for n=0 to i fname(n)= server.MapPath(Filename(n)) if not fso.FileExists(fname(n)) then call back("文件"&name(n)&"找不到!") next set fso=nothing ’这里使用Scripting.FileSystemObject对象是为了判断文件是否存在。 ’一个成形的代码总应该要有防死、纠错的功能。 newname = server.MapPath(newname) for n=0 to i set dr=CreateObject("Adodb.Stream") dr.Mode=3 dr.Type=1 dr.Open dr.LoadFromFile(fname(n)) fstr(n)=dr.read dr.close next ‘将要合并的文件内容读到fstr数组中。 set dr=CreateObject("Adodb.Stream") dr.Mode=3 dr.Type=1 dr.Open for n=0 to i dr.write=fstr(n) next dr.SaveToFile newname,2 ‘生成新文件。 dr.Close set dr=nothing response.write "新文件"&newname&"成功生成!" end sub
小提示:这个代码除了在入侵IIS6.0时会派上用场,在其它限制上传文件大小的主机中也能用。
把写好的代码给学生,再认真做一番思想教育,什么不能用来做坏事等云云,学生学点脚本安全的知识也不是坏事。本来还想用VBS写一个VBS文件切割机,想想还是算了,这样的工具网上已经够多了,不能浪费时间。也许有人会怪我为什么不整合了文件上传功能,我想当大家需要用到这个程序的时候,一定已经获取了WebShell,我又何必多此一举呢?
学习黑客技术最大的乐趣莫过于自己编写小工具,我自己也就因为这一次的事才发现其实ASP功能挺强的,关键在于自己会不会去深入挖掘。