XML實體注入漏洞

翘中之楚發表於2024-06-12

漏洞等級:高危

漏洞型別:XML實體注入

漏洞描述:XXE漏洞全稱XML Extemal Endy niecionlxm以外部實體注入漏洞,X在漏洞發生在應用程式經析XML輸入時,沒有禁止外部實體的載入,導致可載入惡意外部檔案,造成檔案讀取、命令執行、內網埠掃描、攻擊內網網站、發起d0s攻擊等危害。xxe漏洞觸發的點往往是可以上傳xm檔案的位置,沒有對上傳的xm,檔案進行過濾,導致可上傳惡意xm檔案。

具體修復方案:

1.需要將poi jar包升級到4.1.2版本,我當前使用的版本是3.16。

<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>4.1.2</version>
   <exclusions>
      <exclusion>
         <groupId>org.apache.xmlbeans</groupId>
         <artifactId>xmlbeans</artifactId>
      </exclusion>
   </exclusions>
</dependency>

2.升級完jar包後程式碼中引入的需要相關方法及屬性就會報錯,這時候需要我們手動調整這些錯誤。

以下是3.6及以下的版本顯示:

cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
cellStyle.setBottomBorderColor(HSSFColor.BLACK.index);
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cellStyle.setLeftBorderColor(HSSFColor.BLACK.index);
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);

更高版本是這樣的:

cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBottomBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setLeftBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setRightBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setTopBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());

3.調整完成後可以啟動成功,但是上傳檔案依然會報錯,錯誤資訊如下:

Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions;

這時候就需要我們手動排除poi裡的xmbeans,重新 引入xmbeans,注意:xmlbeans只能引入一個,不要存在其他版本的xmlbeans,不然依然會報錯。

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.xmlbeans</groupId>
                    <artifactId>xmlbeans</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
<!-- xmlbeans -->
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>3.1.0</version>
</dependency>

注意:不是pom.xml只引入一個版本就行了,是引用的Maven倉庫中只能存在一個版本的xmlbeans。

相關文章