
CVE-2022-29464 के लिए एक्सप्लॉइट, WSO2 सर्वरों में एक बिना प्रमाणीकरण वाली मनमानी फ़ाइल अपलोड भेद्यता, जो दुर्भावनापूर्ण JSP फ़ाइल अपलोड के माध्यम से रिमोट कोड निष्पादन को सक्षम बनाती है।
WSO2 RCE (CVE-2022-29464) एक्सप्लॉइट।
CVE-2022-29464 WSO2 पर एक गंभीर भेद्यता है जिसे Orange Tsai ने खोजा है। यह भेद्यता एक अनप्रमाणित अप्रतिबंधित मनमाना फ़ाइल अपलोड है, जो अनप्रमाणित हमलावरों को दुर्भावनापूर्ण JSP फ़ाइलें अपलोड करके WSO2 सर्वर पर RCE प्राप्त करने की अनुमति देती है।
भेद्य अपलोड रूट /fileupload है, जिसे FileUploadServlet द्वारा हैंडल किया जाता है, जो एक असुरक्षित रूट है, जैसा कि हम indentity.xml कॉन्फ़िगरेशन फ़ाइल में देख सकते हैं:```xml
`FileUploadServlet` और [`init`](https://github.com/wso2/carbon-kernel/blob/d47232dfb2b26c0ef18a74e2ef4aa503caa59697/core/org.wso2.carbon.ui/src/main/java/org/wso2/carbon/ui/transports/FileUploadServlet.java#L71) पर, तथा मेथड कॉल्स की एक श्रृंखला के माध्यम से, अंततः `carbon.xml` कॉन्फ़िगरेशन फ़ाइल से कई अपलोड फ़ाइल प्रारूपों/क्रियाओं को, उस ऑब्जेक्ट के साथ लोड करता है जो प्रत्येक प्रारूप को संभालता है।```java
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig = servletConfig;
try {
fileUploadExecutorManager = new FileUploadExecutorManager(bundleContext, configContext, webContext);
//Registering FileUploadExecutor Manager as an OSGi service
bundleContext.registerService(FileUploadExecutorManager.class.getName(), fileUploadExecutorManager, null);
} catch (CarbonException e) {
log.error("Exception occurred while trying to initialize FileUploadServlet", e);
throw new ServletException(e);
}
}
FileUploadExecutorManager क्लास का कंस्ट्रक्टर निम्नानुसार है:```java
public FileUploadExecutorManager(BundleContext bundleContext,
ConfigurationContext configCtx,
String webContext) throws CarbonException {
this.bundleContext = bundleContext;
this.configContext = configCtx;
this.webContext = webContext;
this.loadExecutorMap();
}
कंस्ट्रक्टर निजी विधि [`loadExecutorMap()`](https://github.com/wso2/carbon-kernel/blob/d47232dfb2b26c0ef18a74e2ef4aa503caa59697/core/org.wso2.carbon.ui/src/main/java/org/wso2/carbon/ui/transports/fileupload/FileUploadExecutorManager.java#L131) को कॉल करता है, जहाँ कॉन्फ़िगरेशन लोडिंग की जाती है:```java
private void loadExecutorMap() throws CarbonException {
[snipped]
try {
documentElement = XMLUtils.toOM(serverConfiguration.getDocumentElement());
} catch (Exception e) {
String msg = "Unable to read Server Configuration.";
log.error(msg);
throw new CarbonException(msg, e);
}
[snipped]
OMElement fileUploadConfigElement =
documentElement.getFirstChildWithName(
new QName(ServerConstants.CARBON_SERVER_XML_NAMESPACE, "FileUploadConfig"));
for (Iterator iterator = fileUploadConfigElement.getChildElements(); iterator.hasNext();) {
OMElement mapppingElement = (OMElement) iterator.next();
if (mapppingElement.getLocalName().equalsIgnoreCase("Mapping")) {
OMElement actionsElement =
mapppingElement.getFirstChildWithName(
new QName(ServerConstants.CARBON_SERVER_XML_NAMESPACE, "Actions"));
String confPath = System.getProperty(CarbonBaseConstants.CARBON_CONFIG_DIR_PATH);
[snipped]
फ़ाइल अपलोड प्रारूप कॉन्फ़िगरेशन XML कॉन्फ़िगरेशन फ़ाइल में FileUploadConfig नेमस्पेस के भीतर है, यह डिफ़ॉल्ट कॉन्फ़िगरेशन है:```xml
100
<Mapping>
<Actions>
<Action>keystore</Action>
<Action>certificate</Action>
<Action>*</Action>
</Actions>
<Class>org.wso2.carbon.ui.transports.fileupload.AnyFileUploadExecutor</Class>
</Mapping>
<Mapping>
<Actions>
<Action>jarZip</Action>
</Actions>
<Class>org.wso2.carbon.ui.transports.fileupload.JarZipUploadExecutor</Class>
</Mapping>
<Mapping>
<Actions>
<Action>dbs</Action>
</Actions>
<Class>org.wso2.carbon.ui.transports.fileupload.DBSFileUploadExecutor</Class>
</Mapping>
<Mapping>
<Actions>
<Action>tools</Action>
</Actions>
<Class>org.wso2.carbon.ui.transports.fileupload.ToolsFileUploadExecutor</Class>
</Mapping>
<Mapping>
<Actions>
<Action>toolsAny</Action>
</Actions>
<Class>org.wso2.carbon.ui.transports.fileupload.ToolsAnyFileUploadExecutor</Class>
</Mapping>
</FileUploadConfig>
`loadExecutorMap()` विधि कॉन्फ़िग फ़ाइल से निकाले गए Actions और Classes के साथ `<Action, Class>` का एक `HashMap` बनाती और भरती है, जिसका उपयोग बाद में यह चुनने के लिए किया जाएगा कि किसी दिए गए format/action को सही ढंग से संभालने के लिए किस class का उपयोग किया जाए।
बाद में जब `/fileupload` रूट पर एक POST अनुरोध प्राप्त होता है, तो सर्वलेट की [`doPost()`](https://github.com/wso2/carbon-kernel/blob/d47232dfb2b26c0ef18a74e2ef4aa503caa59697/core/org.wso2.carbon.ui/src/main/java/org/wso2/carbon/ui/transports/FileUploadServlet.java#L53) विधि कॉल की जाएगी। यह विधि केवल अनुरोध और प्रतिक्रिया ऑब्जेक्ट को `fileUploadExecutorManager` की `execute()` विधि को अग्रेषित करती है, जिसे `init()` पर प्रारंभ किया गया था।```java
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
fileUploadExecutorManager.execute(request, response);
} catch (Exception e) {
String msg = "File upload failed ";
log.error(msg, e);
throw new ServletException(e);
}
}
execute() विधि, अनुरोध URL को fileupload/ स्ट्रिंग के ठीक बाद विभाजित करती है, जिसका अर्थ है कि यह अनुरोध URL में /fileupload/ के बाद जो कुछ भी है उसे निकालती है और इसे actionString को सौंपती है।```java
public boolean execute(HttpServletRequest request,
HttpServletResponse response) throws IOException {
HttpSession session = request.getSession();
String cookie = (String) session.getAttribute(ServerConstants.ADMIN_SERVICE_COOKIE);
request.setAttribute(CarbonConstants.ADMIN_SERVICE_COOKIE, cookie);
request.setAttribute(CarbonConstants.WEB_CONTEXT, webContext);
request.setAttribute(CarbonConstants.SERVER_URL,
CarbonUIUtil.getServerURL(request.getSession().getServletContext(),
request.getSession()));
String requestURI = request.getRequestURI();
//TODO - fileupload is hardcoded
int indexToSplit = requestURI.indexOf("fileupload/") + "fileupload/".length();
String actionString = requestURI.substring(indexToSplit);