Tóm Tắt
Chào mọi người! Chúc các bạn một năm mới tràn đầy niềm vui! Hôm nay, mình muốn chia sẻ về một lỗ hổng bảo mật thú vị mà mình vừa phát hiện. Sự việc này liên quan đến việc kiểm tra dữ liệu không chặt chẽ ở backend, dẫn đến việc một lỗi tưởng chừng nhỏ có thể khiến hệ thống bị từ chối dịch vụ (DOS), không thể hoạt động bình thường.
Mô Tả Lỗ Hổng
Hệ thống đã gặp khó khăn trong việc xử lý URL khi người dùng tương tác với API để cấu hình menu. Cụ thể hơn:
- Frontend: Có cơ chế kiểm tra tính hợp lệ của URL trước khi gửi yêu cầu.
- Backend: Không thực hiện bất kỳ kiểm tra nào, hoàn toàn bỏ qua!
Kết quả? Kẻ tấn công có thể gửi những URL không hợp lệ hoặc chứa mã độc trực tiếp tới backend thông qua API, gây ra lỗi trong quá trình xử lý và khiến hệ thống không thể hoạt động bình thường.
Tại Sao Đây Là Một Vấn Đề Lớn?
Hãy xem xét tình huống: bạn có một trang web bán hàng và menu hiển thị trên ứng dụng. Nhưng khi người dùng truy cập, Frontend không hiển thị được do liên tục gặp lỗi từ những URL "độc hại". Thay vì phục vụ khách hàng, hệ thống của bạn bị treo cứng, gây mất mát lớn.
Câu Chuyện Tìm Bug
Truy Tìm Manh Mối
Trong thời gian gần đây, mình tham gia một dự án bug bounty. Với các chức năng giống như Phở Bò, mình áp dụng các bước nghiên cứu như Recon, Threat Modeling, và kết quả là...
Khi làm việc, mình đã có cơ hội trò chuyện với một idol trong giới bug hunter, điều này thực sự đã động viên mình để tiếp tục tìm kiếm lỗi.
Sau khi xem xét lại các chức năng, mình phát hiện một chức năng tiềm năng cho phép tạo một menu item với các trường là title và URL. Mình nghi ngờ rằng đây là điểm có thể chèn giá trị không hợp lệ.
- Bắt đầu với vấn đề chính: liệu có thể chèn một giá trị không phải URL và không có https:// không? ==> Thành công!
- Tiếp theo, liệu payload này có thể gây ra XSS không? ==> Không!
- Liệu HTML Injection có được không? ==> Không!
Mình đã làm việc một thời gian và nhận ra rằng, nếu đây chỉ là lỗi Invalid Data Input thì impact thấp. Nhưng sau đó...
POC: Tấn Công Như Thế Nào?
Trong một thử nghiệm, mình đã cố gắng trigger XSS bằng cách thử với payload http://javascript:alert(1)
. Bởi vì chức năng cho phép tạo tab mới khi click vào menu item, và mình muốn biết liệu nó có thể hiển thị ra một alert không.
Lúc đầu thử nghiệm, trang web chạy rất chậm, và mình nghĩ chỉ là do server test. Nhưng sau đó, những request với http://javascript:alert(1)
luôn khiến trang web bị lỗi và mất thời gian load. Có vẻ như đây chính là bug.
Một chuỗi ý tưởng để báo cáo bug nảy ra: Invalid input lead to DOS
. Để kiểm tra kỹ lưỡng, mình đã thực hiện một request như sau:
POST /net/xxx/menu/?method=PUT&access_token=token HTTP/2
Host: xxx.yyy.zzz
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
Accept: */*
Accept-Language: en-US,en;q=0.7,ko-KR;q=0.3
Accept-Encoding: gzip, deflate, br
Content-Type: text/plain
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
X-Pwnfox-Color: cyan
Priority: u=0
Te: trailers
{
"collection": [{
"context": {
"icon": {
"name": "heart"
},
"newTab": true,
"title": "test",
"uri": "http://javascript:alert()"
},
"id": "zzz",
"type": "link"
}]
}
Sau khi thêm menu item này, mình đã đăng nhập vào các tài khoản khác và kiểm tra lỗi. Kết quả là lỗi ảnh hưởng đến toàn bộ Frontend của hệ thống. Để khắc phục chỉ cần gửi lại request với URL hợp lệ là ổn.
Mặc dù mình đã thử để khiến cả Backend bị sập, nhưng không thành công. Mình vẫn thắc mắc tại sao Frontend với giá trị http://javascript:alert()
lại gây lỗi như vậy. Thật sự mình chưa tìm được câu trả lời.
Kết
Trong quá trình viết báo cáo, mình đã tham khảo phần Out of Scope của chương trình. Ban đầu, mình có chút không tự tin với chuỗi bug mình tạo ra. Nhưng sau khi báo cáo, mình đã đặt nó vào loại lỗi Business vì nguồn gốc của nó là do lỗi nghiệp vụ trong việc kiểm tra dữ liệu.
Khi báo cáo đã được xem xét, công ty đã xác nhận đây là một bug valid đúng thời điểm năm mới! Thật tuyệt vời!
Bài Học Rút Ra!
- Đừng sợ, hãy tự tin với những gì bạn làm được.
- (Thử và sai, thử và sai) * 3.14 ==> Thử và đúng!
- Đôi khi, ảnh hưởng lớn nhưng cách thực hiện đơn giản và thuộc về out of scope vẫn có thể là trường hợp ngoại lệ.