ÆÊÎö·À»¤:Struts2 Ô¶³Ì´úÂëÖ´ÐÐÎó²î£¨S2-045£©
2017-03-08
Îó²îÆÊÎö
Apache Struts2µÄJakarta Multipart parser²å¼þ±£´æÔ¶³Ì´úÂëÖ´ÐÐÎó²î£¬Îó²î±àºÅΪCNNVD-201703-152¡£¹¥»÷Õß¿ÉÒÔÔÚʹÓøòå¼þÉÏ´«Îļþʱ£¬ÐÞ¸ÄHTTPÇëÇóÍ·ÖеÄContent-TypeÖµÀ´´¥·¢¸ÃÎó²î£¬µ¼ÖÂÔ¶³ÌÖ´ÐдúÂë¡£
Ïà¹ØÁ´½ÓÈçÏ£º
https://cwiki.apache.org/confluence/display/WW/S2-045?from=timeline&isappinstalled=0
Ó°ÏìµÄ°æ±¾
- Struts 2.3.5 - Struts 2.3.31
- Struts 2.5 - Struts 2.5.10
²»ÊÜÓ°ÏìµÄ°æ±¾
- Struts 2.3.32
- Struts 2.5.10.1
AG¹«Ë¾ÍþвÇ鱨ÖÐÐÄNTI¹ØÓÚStruts2Îó²î¹æÄ£ÂþÑÜͼ
- È«ÇòÂþÑÜͼ
- º£ÄÚÂþÑÜͼ
- È«ÇòÅÅÐÐ
- º£ÄÚÅÅÐÐ
Îó²îÆÊÎö
Apache Struts2±£´æÔ¶³Ì´úÂëÖ´ÐÐÎó²î£¬¹¥»÷Õß¿ÉÒÔ½«¶ñÒâ´úÂëͨ¹ýhttp±¨ÎÄÍ·²¿µÄContent-Type×Ö¶Îת´ï¸ø±£´æÎó²îµÄ·þÎñÆ÷£¬µ¼ÖÂí§Òâ´úÂëÖ´ÐÐÎó²î¡£
-
-
Îó²îPOC
-
-
Îó²îÑéÖ¤
-
-
ϸ½ÚÆÊÎö
It is possible to perform a RCE attack with a malicious Content-Type value. If the Content-Type value isn't valid an exception is thrown which is then used to display an error message to a user.
´Ó¹Ù·½µÄÎó²îÐÎòÎÒÃÇ¿ÉÒÔÖªµÀ£¬Õâ¸öÎó²îÊÇÓÉÓÚStrus2¶Ô¹ýʧÐÂÎÅ´¦Öóͷ£·ºÆðÁËÎÊÌ⣬ͨ¹ýContent-TypeÕâ¸öheaderÍ·£¬×¢ÈëOGNLÓïÑÔ£¬½ø¶øÖ´ÐÐÏÂÁî¡£
±¾ÎĵįÊÎöÊÇ»ùÓÚStruts 2.3.24°æ±¾¡£Ê×ÏÈ¿´Ò»ÏÂPOC£¬¹¥»÷Ö¸Áîͨ¹ý"Content-Type"ת´ï¸ø±£´æÎó²îµÄ·þÎñÆ÷£¬ÈçÏÂͼËùʾ£º
ÔÚ´«ÈëµÄ²ÎÊýÖУ¬Í¨¹ý#nike='multipart/form-data'Óï¾äʹµÃºǫ́ÅжÏÓï¾äcontent_type.contains("multipart/form-data")ÅжÏЧ¹ûΪtrue£¬ÒԱ㹥»÷´úÂëµÃÒÔ´«È롣ͬʱ½«¹¥»÷´úÂë'cat /etc/passwd'¸³Öµ¸ø#cmd²ÎÊý¡£½ÓÏÂÀ´Í¨¹ý(#cmds=(#iswin?{'cmd.exe''/c'#cmd}:{'/bin/bash''-c'#cmd})À´ÅжÏÄ¿µÄÖ÷»úµÄ²Ù×÷ϵͳÀàÐÍ£¬²¢Ñ¡ÔñÐԵľÙÐÐÖ¸Áֵ£¬×îÖÕ£¬Í¨¹ýÈçÏÂͼ´úÂ룬½«¹¥»÷Ö¸ÁîÖ´ÐУº
ÏÂÃæÏÈ¿´Ò»ÏÂÏÂÁîÖ´ÐÐ×¢Èëµã£º
ÔÚJakartaMultiPartRequest.java µÄbuildErrorMessageº¯ÊýÖУ¬Õâ¸öº¯ÊýÀïµÄlocalizedTextUtil.findText»áÖ´ÐÐOGNL±í´ïʽ£¬´Ó¶øµ¼ÖÂÏÂÁîÖ´ÐУ¬ÎÒÃÇÏÈ¿´ÏÂfindtextµÄ½ç˵£º
https://struts.apache.org/maven/struts2-core/apidocs/com/opensymphony/xwork2/util/LocalizedTextUtil.html
½ÓÏÂÀ´Ëü±»JakartaMultiPartRequest.javaÖеÄparseŲÓá£Struts2µÄÈë¿ÚFilterDispatcher.java½ÓÏÂÀ´Ö´ÐÐdoFilterº¯Êý£¬Ö´ÐÐÍêһЩ¹ýÂ˺ó½øÈëprepareDispatcherAndWrapRequestº¯Êý£¬ÔÙÖ´ÐÐdispatcher.wrapRequest½øÈërequest´¦Öóͷ£·ÖÖ§£¬ÏÂͼ¾ÍÊÇprepareDispatcherAndWrapRequestµÄʵÏÖ£¬¸Ãº¯Êý¶ÔÒªÁì¾ÙÐÐÁË´¦Öóͷ££º
½Ó×ÅÎÒÃÇ¿´dispatcher.wrapRequest£¬µ±Content-TypeΪmultipart/form-dataµÄʱ¼ä»áŲÓÃMultiPartRequestWrapperÕâ¸öÊÇÒ»¸ö¶ÔÖݪֲî±ðÉÏ´«·½·¨µÄ·â×°£¬ÆäÖоͰüÀ¨JakartaµÈ´«Êä·½·¨£º
MultiPartRequestWrapper.java·â×°ÁËparseº¯Êý£º
ÎÒÃÇÀ´¿´ÏÂparseº¯Êý£¬ÈçÏÂͼËùʾ£º
ÔÚparseº¯ÊýÖУ¬µ±Content-TypeÃûÌò»±»Ê¶±ðʱ£¬·ºÆðÒì³££¬µ¼ÖÂOGNL±í´ïʽ±»Ö´ÐУ¬Õâ¾ÍÊÇÎÒÃÇÆÊÎöµÄ×î³õµÄ×¢Èëµã¡£
²¹¶¡ÆÊÎö
- 2.5.10.1°æ±¾µÄÐÞ¸´¼Æ»®£º
https://github.com/apache/struts/commit/b06dd50af2a3319dd896bf5c2f4972d2b772cf2b
- 2.3.32°æ±¾µÄÐÞ¸´¼Æ»®£º
https://github.com/apache/struts/commit/352306493971e7d5a756d61780d57a76eb1f519a
¹Ù·½½â¾ö¼Æ»®
- ¹Ù·½ÒѾÐû²¼Á˰汾¸üУ¬½¨ÒéÓû§Éý¼¶µ½²»ÊÜÓ°ÏìµÄ×îа汾(Struts2 2.3.32»òStruts 2.5.10.1)£¬ÏÂÔØÁ´½ÓÈçÏÂËùʾ£º
Struts 2.3.32:
https://github.com/apache/struts/releases/tag/STRUTS_2_3_32
Struts 2.5.10.1:
https://github.com/apache/struts/releases/tag/STRUTS_2_5_10_1
ÔÝʱÐÞ¸´¼Æ»®
ÔÚÓû§Î´±ã¾ÙÐÐÉý¼¶µÄÇéÐÎÏ£¬×÷ΪÔÝʱµÄ½â¾ö¼Æ»®£¬Óû§¿ÉÒÔ¾ÙÐÐÒÔϲÙ×÷À´¹æ±ÜΣº¦£º
- ÐÞ¸ÄWeb-INF/classesĿ¼ÏµÄstruts.xmlÖеÄÉèÖÃ
ÔÚWeb-INF/classesĿ¼ÏµÄstruts.xml ÖеÄstruts ±êÇ©ÏÂÌí¼Ó£»
ÔÚWEB-INF/classes/ Ŀ¼ÏÂÌí¼Ó global.properties£¬ÎļþÄÚÈÝÈçÏÂ
struts.messages.upload.error.InvalidContentTypeException=1
- ÉèÖùýÂËÆ÷¹ýÂËContent-TypeµÄÄÚÈÝ
ÔÚwebÓ¦ÓõÄweb.xmlÖÐÉèÖùýÂËÆ÷£¬ÔÚ¹ýÂËÆ÷ÖжÔContent-TypeÄÚÈݵÄÕýµ±ÐÔ¾ÙÐмì²â£º
|
public void doFilter(ServletRequest request ServletResponse response FilterChain chain) throws java.io.IOException ServletException { String contentType = request.getContentType().toLowerCase(Locale.ENGLISH); if (contentType != null && contentType.contains("multipart/form-data") && !contentType.startsWith("multipart/form-data")) { response.getWriter().write("Reject!"); } else { chain.doFilter(request response); } } |
ÊÖÒÕ·À»¤¼Æ»®
- ÈôÊÇÄú²»ÇåÎúÊÇ·ñÊÜ´ËÎó²îÓ°Ï죺
¹«Íø×ʲú ¿ÉʹÓÃAG¹«Ë¾ÔÆ ½ôÆÈÎó²îÔÚÏß¼ì²â£¬¼ì²âµØµãÈçÏ£º
http://t.cn/RipBq1c
ÄÚÍø×ʲú ¿ÉÒÔʹÓÃAG¹«Ë¾¿Æ¼¼µÄÔ¶³ÌÇå¾²ÆÀ¹Àϵͳ(RSAS V5¡¢V6)»ò WebÓ¦ÓÃÎó²îɨÃèϵͳ£¨WVSS£© ¾ÙÐмì²â¡£
Ô¶³ÌÇå¾²ÆÀ¹Àϵͳ£¨RSAS V5£©
http://update.nsfocus.com/update/listAurora/v/5
Ô¶³ÌÇå¾²ÆÀ¹Àϵͳ£¨RSAS V6£©
http://update.nsfocus.com/update/listRsasDetail/v/vulweb
WebÓ¦ÓÃÎó²îɨÃèϵͳ£¨WVSS£©
http://update.nsfocus.com/update/listWvss
ͨ¹ýÉÏÊöÁ´½Ó£¬Éý¼¶ÖÁ×îа汾¼´¿É¾ÙÐмì²â£¡
- ʹÓÃAG¹«Ë¾¿Æ¼¼·À»¤Àà²úÆ·£¨NIPS/NIDS/NF/WAF£©¾ÙÐзÀ»¤£º
ÈëÇÖ·À»¤ÏµÍ³£¨NIPS£©
http://update.nsfocus.com/update/listIps
ÈëÇÖ¼ì²âϵͳ£¨NIDS£©
http://update.nsfocus.com/update/listIds
ÏÂÒ»´ú·À»ðǽϵͳ£¨NF£©
http://update.nsfocus.com/update/listNf
WebÓ¦Ó÷À»¤ÏµÍ³£¨WAF£©
http://update.nsfocus.com/update/wafIndex
ͨ¹ýÉÏÊöÁ´½Ó£¬Éý¼¶ÖÁ×îа汾¼´¿É¾ÙÐзÀ»¤£¡

AG¹«Ë¾ÔÆ







