Liferay và lỗi XSS
Trung Nguyen

Liferay
Liferay là một cổng thông tin mã nguồn mở được sử dụng rộng rãi. Nó được thiết kế phù hợp với các mô hình ứng dụng trong cơ quan, tổ chức và doanh nghiệp …
Đây là một nền tảng mã nguồn mở tương tự như WordPress hay Joomla, nhưng nó được phát triển trên ngôn ngữ java/j2ee.
Đó là vài dòng giới thiệu, mục đích chính của bài viết này là nói về việc khai thác lỗ hổng của nền tảng này. Khi tôi bắt đầu tìm một vài lỗ hổng Liferay, lỗi đầu tiên có được là một lỗi XSS, cụ thể là CVE-2016-3670 nên quyết định tìm hiểu về nó.
CVE-2016-3670
CVE-2016-3670 được công bố vào ngày 13-6-2016 nói về lỗi XSS có thể khai thác được ở chức năng tìm kiếm có sẵn của Liferay. Cách thức tấn công là hacker sẽ gửi request đăng kí một tài khoản với kèm theo việc truyền payload vào trường Firstname. Khi đã đăng kí thành công, sẽ có một Stored XSS trên trang web nạn nhân. Mỗi khi ai đó (admin) sử dụng chức năng search trên trang web, tìm kiếm một thuộc tính nào có trong tài khoản vừa đăng kí thì lệnh có trong payload sẽ được thực thi.
Các phiên bản Liferay cũ hơn hoặc bằng 6.2 đều sẽ dính lỗi này.
Về đường dẫn và payload có thể được tìm thấy trên exploit-db … Tuy nhiên thì có gì đó sai sai, rõ ràng nhất là cái payload (Data). Tất nhiên tôi đã thử sử dụng payload đó và đúng là nó sai thật. Thực ra là nó bị thiếu, khi bổ sung lại, tôi có payload
%22%3e%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%27%78%73%73%27%29%3c%2f%73%63%72%69%70%74%3e
Sử dụng payload này và gửi đăng kí

Tài khoản được tạo thành công

Bước tiếp theo là sử dụng chức năng search, Liferay cung cấp một porlet (application) search sẵn có mà các trang web dùng Liferay sẽ sử dụng

Ta sẽ nhập một cái gì đó liên quan tới tài khoản vừa tạo (ví dụ như ‘sad’ là middlename) và bấm nút tìm kiếm, lúc này đã xảy ra lỗi XSS

Nếu không tìm thấy ô tìm kiếm, ta có thể request tới URL sau
web/guest/home?_3_formDate=1548686680398&p_p_id=3&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view&_3_struts_action=%2Fsearch%2Fsearch&_3_cur=1&_3_format=&_3_keywords=[nhập keyword]&_3_groupId=0&_3_entryClassName=&_3_userName=&_3_modified=&_3_modifiedselection=0&_3_modifiedfrom=01%2F27%2F2019&_3_modifieddayFrom=27&_3_modifiedmonthFrom=0&_3_modifiedyearFrom=2019&_3_modifiedto=01%2F28%2F2019&_3_modifieddayTo=28&_3_modifiedmonthTo=0&_3_modifiedyearTo=2019&_3_documentsSearchContainerPrimaryKeys=125_PORTLET_21526
Về nguyên nhân lỗi là do file users.jsp (dùng để hiển thị kết quả tìm kiếm người dùng) của porlet search, cụ thể tại dòng sau:

Chương trình sẽ “in thẳng” tên người dùng dưới dạng giá trị cho data-value
. Chính vì thế, với payload ở trên, html trả về sẽ có đoạn như sau:

Khai thác thực tế
Có thể tìm được vài trang web sử dụng Liferay trên shodan hay với từ khóa inurl:/web/guest từ google. Trước hết cần tìm những trang web cho phép truy cập vào đường dẫn /web/guest/home?p_p_id=58&p_p_lifecycle=1&p_p_state=maximized&p_p_mode=view&_58_struts_action=%2Flogin%2Fcreate_account
(hoặc tương tự …) để tạo một tài khoản tùy ý.

Và sau đó gửi một request với payload có trong Firstname. Địa chỉ email dùng trong bước này cần phải sử dụng được để có thể lấy mật khẩu đăng nhập.
Và một khi đã tạo tài khoản thành công, lỗi XSS là có thể xảy ra

Tiếp tục tìm kiếm và khai thác bằng tay, tôi cũng tìm được thêm vài trang nữa. Việc làm bằng tay mất khá nhiều thời gian và cũng khá là chán, tuy nhiên quá trình khai thác lỗi này có khá nhiều công đoạn khó có thể tự động hóa được như nhập captcha hay đăng nhập email lấy mật khẩu …
Thêm nữa, việc gửi request tới URL đã nêu trên không phải lúc nào cũng đúng. Một trang web Liferay chưa chắc đã có đường dẫn /web/guest
và điều ngược lại cũng có thể xảy ra :))) Một trang web khi truy cập tới url /web/guest
nó sẽ trả về 404

Tuy nhiên trang web này vẫn sử dụng Liferay, nhưng để vào được trang đăng kí của nó, cần thay đổi một chút ở URL

Trường hợp này cũng khá là phổ biến
Lời kết
Trong quá trình khai thác, tôi đã thử tập trung trên các trang web lớn (.gov chẳng hạn) và nhận thấy có rất nhiều cách khắc phục lỗ hổng này (dù sao đây cũng là một lỗ hổng đã có từ lâu) như bỏ đi chức năng tạo tài khoản, hay bỏ đi kết quả tìm kiếm người dùng từ porlet search … Tuy vậy cũng có khá nhiều trang web “nhỏ” vẫn dính đó thôi, dùng tay từ công đoạn tìm kiếm đến khai thác mà tôi cũng tìm được vài trang rồi.