最近打算將 Struts 2.0.x 版本直接升到 2.2.1,但如此一來之前為 Struts 2.0.x 所寫的一些能讓 XML 配置檔的 include tag 使用萬用字元的 Class 就無法運作了。
為了讓 Struts 2.2.1 XML 配置檔的 include tag 也能使用萬用字元,所以我又回頭去追原始碼,打算像之前 Struts 2.0.x 版一樣自己來寫一個,但是在追原始碼的過程中,我發現 Struts 2.2.1 本身已經有支援 include tag 使用萬用字元了,於是我在往前回溯到之前一度用過的 Struts 2.1.6,發現在 2.1.6 其實就已經有支援了,雖然我沒有再往前追查 2.1 最早的版本,但我相信 2.1 應該就已經支援了,而且不論如何,至少 2.1.6 確定是有支援配置檔的 include tag 使用萬用字元。
Struts 2 有關讀入並解析 XML 配置檔的程式是在 com.opensymphony.xwork2.config.providers.XmlConfigurationProvider 類別,其中的 loadConfigurationFiles() 方法內可以看到解析 include tag 萬用字元的程式碼。
大笨鳥 發表在 痞客邦 留言(0) 人氣(134)
會有這個後續篇,主要是因為笨鳥對於用來攻擊的 OGNL 語法不甚了解,於是想研究看看,再加上在找相關資料的過程中,看到了這篇文章「Struts2 與 Webwork 遠程命令執行漏洞分析」裏提到,光只過濾「\u0023」仍無法堵住這個漏洞,因此在土法鍊鋼的反覆測試與參考上述文章後,有了些心得可以記錄下來。
因為是土法鍊鋼,所以有些地方笨鳥就只能針對觀察到的現象加以描述,而無法用什麼理論來驗證,這個可能要先說在前頭了。
首先就先從 OGNL 談起好了。(本來想一口氣寫完,不過後來發現我沒那麼有毅力,所以還是分兩篇好了)
由於 OGNL 本身就是一個龐大的東西,因此這裏不會講解整個 OGNL,有興趣的請自行上官網看文件,此處只針對攻擊用的語法「Expression Evaluation」,也就是攻擊語法中的圓括弧用法。
大笨鳥 發表在 痞客邦 留言(0) 人氣(411)
大笨鳥 發表在 痞客邦 留言(0) 人氣(1,761)
版本:
Struts 2.0.14
問題描述:
當開放 Struts2 的 Filter 能服務 INCLUDE 轉來的需求時,即
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
此時,若在 JSP 的頁面上有任何與 include 相關的運作,如:<jsp:include>、<s:include> 甚至是 <tiles:insertAttribute>,則在之後若再使用任何一種 Struts2 的 Tag 時,都會導致ComponentTagSupport 類別內的 doStartTag() 方法中,取得 Container 的程式碼 (Dispatcher.getInstance().getContainer()) 丟出 NullPointerException。
大笨鳥 發表在 痞客邦 留言(0) 人氣(333)
問題描述:
在 struts2 讀取 Cookie 可以使用 CookieInterceptor 與 Action 實作 CookiesAware 介面的方式,讓 CookieInterceptor 將 Cookie 裏的值放入 Map 並丟入 Action 中。但此次在實作時,CookieInterceptor 竟然會丟出『No object in the CompoundRoot has a publicly accessible property named 'Cookie 名稱' (no setter could be found) 』的錯誤並中斷程式的執行。
追查程式的結果,發現 CookieInterceptor 不但會將 cookie 值包成 Map 丟入 Action,還會透過 Ognl 試著找出 set'Cookie名稱'(String value) 來將值塞入 Action 中,因此,如果 Action 中沒有相對應的 set 方法,就會丟出 Exception。
解決方法:
方法有二種
1. 在 Action 內加入 set'Cookie名稱'(String value) 的方法。
2. 在 struts.xml 中,將 struts.devMode 設成 false。(建議使用)
<constant name="struts.devMode" value="true" />
大笨鳥 發表在 痞客邦 留言(0) 人氣(276)
小弟最近將 Struts 2.0.11 提升到 2.1.6 之後,發現了一個問題,那就是使用 Ognl 呼叫類別中的靜態方法時,吐出來的值竟然空空如也,連錯誤訊息也沒有。
<s:property value="@java.util.Locale@getDefault()" />
一開始我還以為是我寫錯了,搞了老半天最後也只能求助於古狗大神。很快的我找到二篇相關的文章,才發現原來在 struts 2.1.2 之後,如果要讓 Ognl 能夠呼叫類別中的靜態方法,還需要額外設定…真是一整個昏倒。
大笨鳥 發表在 痞客邦 留言(0) 人氣(123)