欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Intigriti XSS挑战全教程

来源:本站整理 作者:佚名 时间:2019-05-14 TAG: 我要投稿


 
写在前面的话
Intigriti近期发布了一个非常有意思的XSS挑战项目,该项目要求我们制作一个特殊的URL,而这个URL不仅要能够给iframe分配src参数,而且还要能够发送eval()调用来弹出一个“alert(document.domain)”弹窗,这就是这项XSS挑战的目标和要求。那我们应该怎么做呢?接下来,我们一起看一看实现这个目标需要哪些步骤和方法。
注意:最终的漏洞以及漏洞利用代码只适用于Chrome,所以我们推荐大家使用Chrome浏览器来进行测试。
 
代码分析
现在,我们暂时先不要过多考虑XSS以及XSS漏洞利用方面的东西,首先我们要做的就是搞清楚这个XSS挑战项目所要涉及到的JavaScript代码。
const url = new URL(decodeURIComponent(document.location.hash.substr(1))).href.replace(/script|/gi, "forbidden");
const iframe = document.createElement("iframe"); iframe.src = url; document.body.appendChild(iframe);
iframe.onload = function(){ window.addEventListener("message", executeCtx, false);}
function executeCtx(e) {
  if(e.source == iframe.contentWindow){
    e.data.location = window.location;
    Object.assign(window, e.data);
    eval(url);
  }
}
1、 上述代码首先获取的是当前页面URL的哈希值,并根据哈希解码URL实体,然后使用字符串“forbidden”替换掉了所有的“script”、“”实例。最终代码运行完之后,会分配一个“url”变量。2、 接下来,代码会在当前页面中创建一个iframe,这个iframe的src参数值就是之前创建的“url”变量,然后将这个URL地址加载进iframe中。3、 当iframe加载完毕之后,我们会开始监听message事件,并在监听到message事件后调用executeCtx。4、 executeCtx函数的功能定义如下:
a) 该函数会确保事件来自于这个iframe;b) 事件中Payload的“location”属性会根据当前窗口的“location”参数进行重写,并保护当前地址不会重定向至其他URL;c) Payload对象的每一个参数都会分配当前窗口的Object.assign(window、e.data),这也就意味着,任何发送给executeCtx()函数的值都会在window中定义;d) 通过eval()函数对url变量进行处理;
仔细阅读完上述代码之后,我脑海中第一个反应就是:message事件是个什么玩意儿?翻了半天文档之后,我发现这是一个用于跨源通信的API,它使用了window.postMessage方法来允许我们向任何监听message事件的组件发送对象。这就非常有意思了!
 
XSS漏洞利用
既然我们的目标是找到一个XSS漏洞并利用之,那“eval(url)”明显就是我们的目标了。一开始,对于如何利用“url”参数来寻找并利用XSS漏洞,我是毫无头绪的,但这个阶段暂时不用过多关注XSS方面的东西。我当前主要关注的东西就是“eval()”。不过,在真正利用eval()调用之前,我们还有很多操作和步骤需要做,但如果能够成功,我们就离最终的XSS漏洞不远了。不过现在,大家先把XSS的事情放一放。
一步一步实现漏洞利用
Iframe中的JavaScript
根据我以往的经验,这种情况下的XSS漏洞一般都跟Data URL(前缀为data:的URL)有关。Data URL允许我们使用Base64来编码Payload,因此这样就可以轻松绕过
.replace(/script|/gi, "forbidden")
过滤器了。
我尝试了以下地址参数:
https://challenge.intigriti.io/#data:text/html;base64,PHNjcmlwdD5hbGVydCgnaGknKTs8L3NjcmlwdD4=
即alert(‘hi’);的Base64编码格式,并成功实现了alert弹窗。但是alert(document.domain)并没有在iframe中成功运行,因为这是一个Data URL,其中并不包含域名。虽然现在有了弹窗警告框,但是我想要的是在iframe外部实现它,所以我们现在还没成功。
向父窗口发送消息
在现在这个阶段,我们的目标仍然是eval(url)。现在,我们需要发送一条消息来运行executeCtx()函数。我尝试了刚才了解到的那个API,并使用了下列脚本代码:
script>window.postMessage("test", "*")script>
postMessage()函数的第二个参数是我们的目标源,这里我们传入的是”*”,虽然这样做不安全(任何人都可以拦截到我的消息),不过这不是我们在这里需要考虑的事情。最终编码后的URL如下:

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载