JavaScript中是否有可能重写XMLHttpRequest.send()然后检测并反转该重写?

时间:2019-01-26 16:29:16

标签: javascript

为什么我想知道

我们需要为一个大学项目编写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}}方法,那么仍然可以以某种方式访问​​原始方法吗?


如果有人可以考虑其他(更好的)攻击或防御媒介,我想听听。

2 个答案:

答案 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` 

这种方法通常适用于您要重新定义的任何事情。