#1
huaxiong
· 2026-06-26 09:34:34
stalltrix
以前的IE时代,可是有很多这种写法的
```js
var xhr = new ActiveXObject("Microsoft.XMLHTTP")
xhr.open("GET", "/api")
xhr.send()
```
其中ActiveXObject是不是感觉很熟悉,小到XHR异步请求,大到flash插件,甚至ActiveXObject("WScript.Shell")这种挂马等直接浏览器执行shell的危险指令都是ActiveX。
不过现在不同了,现代浏览器都不存在ActiveXObject这些对象了,历史的问题被解决了。
但是形成了另一种有趣的玩法,由于浏览器不存在ActiveXObject这个名称的对象,同时用户可以自定义未命名的函数对象。
比如我们定义,这个函数可以叫做ActiveXObject。
```
window.ActiveXObject = function(name) {
if (name === "Microsoft.XMLHTTP") {
return new XMLHttpRequest()
}
throw new Error("ActiveXObject not supported: " + name)
}
```
于是现代浏览器就能使用我们的ActiveX。你看看下面的写法熟不熟悉?
```
var xhr = new ActiveXObject("Microsoft.XMLHTTP")
xhr.open("GET", "/api")
xhr.send()
```
并且在现代浏览器中,还能正常运行
甚至你还可以定义一些以前的危险COM组件(当然现在都是模拟,其实都不危险了)
```
var fso = new ActiveXObject("Scripting.FileSystemObject")
var ws = new ActiveXObject("WScript.Shell")
```
以前写入文件到硬盘再shell启动,这可是web挂马的常见操作。
不过现在web环境也变得很多了,沙盒化完善倒是不用担心以前的问题了。不过这种现代方法,写出过去经典的感觉,不过其实感觉相当于把新车换上老外壳,扮猪吃老虎之类的,哈哈
。于是外设朴实无华,内设精益求精。
