- 帖子
- 6
- 积分
- 110
- 技术
- 1
- 捐助
- 0
- 注册时间
- 2009-9-29
|
本帖最后由 wwjjyyff 于 2018-5-11 17:56 编辑
写了一个小的demo,具体如下:
利用mshta加载服务器的页面,例如mshta http://192.168.1.10/a.php
加载后自动下载一个文件到本地指定目录,但是提示不能跨域,下载脚本如下:
try{
var http = new ActiveXObject('MSXML2.ServerXMLHTTP');
http.open("Get", "http://192.168.1.20/t.exe", false);
http.send();
var adodbStream = new ActiveXObject('ADODB.Stream');
with(adodbStream){
Type = 1;
Mode = 3;
Open();
write(http.responseBody);
SaveToFile("D:\\t.exe", 2);
}
}catch (e){alert(e.message);}
但是通过论坛的公开接口却可以实现:
echo download('http://192.168.1.20/t.exe','D:\\t.exe') | mshta http://bathome.net/s/hta/ eval(WSH.StdIn.ReadAll())
同样是跨域,求助大神教我论坛是什么原理,如何实现的?
=================
已解决了,有两个办法:
1、论坛接口的代码,有一个root函数修改了注册表键值,允许跨站
2、通过服务器页面代理的方式,不修改本地注册表,服务器页面接受要下载的url,将url下载后转为base64编码,
再通过$.ajax给客户端取得这个编码,客户端解码以后通过ADODB.Stream对象写入到本地磁盘,相当完美
$.ajax({
type: "GET",
url: "init.php?id=" + id + "&key=" + key,
async: false,
dataType: "json",
success: function(data){
if (data.key != key) throw {"message":"key not valid"};
with(objStream){
Type = 2;//1=adTypeBinary,2=adTypeText
Mode = 3;
Charset = "iso-8859-1";
Open();
writeText(BASE64.decode(data.value));
SaveToFile(SaveFile, 2);
Close();
}
if (objFSO.GetFile(SaveFile).size != URL.size) throw {"message":"filesize not valid"};
},
error: function(http, msg){
throw {"message":"downloaded failed, " + msg};
}
});
==================
再次修改,已发现第二种方法无效,实际上也是跨站而已。因为无意中修改了注册表,导致第二种可以取得数据,大错误,再此更正。
现在的新问题是,按照论坛接口的办法,如果不采用临时文件,而用root函数改注册表,怎么样才能保证当前的mshta进程可以跨域呢?
刚才测试了一下发现,重新除非新开一个mshta进程,否则当前的mshta仍然是无法跨域的 |
-
1
评分人数
-
|