我们需要为一个大学项目编写XSS蠕虫,使这些蠕虫相互抗争。目标是获得尽可能多的积分,这些积分是由我们的团队ID发送给服务器的发帖请求产生的。每个蠕虫发送的邮件数量不得超过其中的一个,并自我复制一次。
为赢,我们被允许攻击其他蠕虫。我们还可以保护自己的蠕虫免受他人侵害。因此,我们希望蠕虫比其他蠕虫发出更成功的帖子请求。
我考虑过阻止或重写send()
的{{1}}方法,以便其他蠕虫/团队的发布请求将发送我们的团队ID或根本不会发送。但是我不熟悉JavaScript,而且我不知道这样的事情是否可能...
在JavaScript中是否可以覆盖类/对象(或该类/对象的函数),尤其是XMLHttpRequest
?如果是这样,被覆盖的类在全局上下文中是否仍然有效(对另一个XMLHttpRequest
标签有效)?
假设我们有第一个<script>
标签,其内容如下:(不确定JavaScript是否正确)
<script>
第二个XMLHttpRequest = function () { // or class () ?
const originalXMLHttpRequest = XMLHttpRequest;
function send () {
alert('successful attack');
originalXMLHttpRequest.send(our_team_id);
}
};
标签用<script>
调用send()
方法:
their_team_id
现在从第二个const request = new XMLHttpRequest();
// ... configure request here
request.send(their_team_id);
标签发出的呼叫会触发警报并将<script>
发送到服务器吗?
是否可以检测到覆盖的类/对象?如果是这样,我可以以某种方式撤消更改或访问原始功能吗?
假设我们只能在第二个our_team_id
标记内编写代码,而第一个标记已经覆盖<script>
的{{1}}方法,那么仍然可以以某种方式访问原始方法吗?
如果有人可以考虑其他(更好的)攻击或防御媒介,我想听听。
答案 0 :(得分:2)
我认为可以覆盖Object/function
。但是,只有当创建的变量/函数在当前scope上可见时,它才起作用。请检查此article about javascript function overriding
JavaScript支持重写而不是重载,这意味着,如果您定义两个具有相同名称的函数,则最后一个定义将覆盖先前定义的版本,并且每次对该函数进行调用时,都会获得最后一个定义的函数被执行。
答案 1 :(得分:1)
我认为您想要的是重新定义XMLHttpRequest的send
方法。
如果是这种情况,您可以执行以下操作:
// save original `send` method
const origSend = XMLHttpRequest.prototype.send;
// redefine `send` method
// you could also pass extra parameters if needed
XMLHttpRequest.prototype.send = (...origParams) => {
console.log('send called');
origSend(...origParams);
}
const req = new XMLHttpRequest();
req.open("GET", "http://www.example.org/example.txt");
req.send();
// will print `send called`
这种方法通常适用于您要重新定义的任何事情。