Chiếm quyền bất kì tài khoản nào ở một trong những trang TMĐT lớn nhất Việt Nam

Mục tiêu lần này là một trong những site thương mại điện tử lớn của Việt Nam. Vì đã hứa với bên đó là không public thông tin mà sẽ review lại dưới dạng ẩn danh, nên mình sẽ gọi website đó là Z (X bị lấy ví dụ nhiều quá, nên không nỡ :> ), trái ngược với những case trước, lần contact này khá là hiệu quả, bên Z phản hồi và fix lỗi rất nhanh, tinh thần hợp tác cũng vui vẻ nên trao đổi rất cởi mở và thuận tiện. Cá nhân mình khá là vui khi được làm việc chung với Z lần này, hihi.

Nhảm rồi, vô phần chính thôi.

Như đã nói ở trên, Z là trang TMĐT tầm cỡ, có thể nói là TOP đầu ở Việt Nam hiện nay, với tốc độ phát triển khá nhanh nên thu hút được lượng lớn người dùng sử dụng, và em nó lọt vào vòng sơ khảo của mình.

Sau khi có target, mình đăng kí một tài khoản test. Quá trình này nhanh chóng và dễ dàng, cho đến khi Z yêu cầu mình đăng kí tiếp thông tin thẻ (kiểu như thẻ thành viên của Galaxy hay thẻ CGV…) để tiếp tục sử dụng dịch vụ, và quá trình này đòi hỏi phải điền số điện thoại để xác thực thông qua token được gửi tới SMS.

Bắt tay vào test nào:

Điền số sim rác thử, token gửi về luôn (hệ thống nhanh thặc), mà khoan cầm điện thoại, mình điền đại vào ô sms gửi về => thông báo sai token, điền cái nữa => vẫn sai, khúc này mình đã cảm thấy có gì đó chưa đúng, tuy nhiên mục đích tạo acc reg là để test cái khác, nên mình điền đúng token từ SMS và tạo tài khoản thành công.

Tuy nhiên với một thanh niên cảm thấy lấn cấn trong lòng, mình đăng kí một tài khoản khác, điền sđt cực đẹp 0912345678 (khúc này chém), lần này mình input sai token liên tục. Sau một hồi thì chắc chắn là không có captcha hoặc hình thức verify gì ở gate này, thì mình viết luôn 1 cái php script để thực hiện brute cái OTP (chỉ có 4 số nên nhanh thôi) => và con bug đầu tiên tòi ra: Đăng kí tài khoản và xác thực với số điện thoại bất kì

Brute OTP với đăng kí

Sau khi đi một vòng với mấy cái tạo order, inject input, param, không có gì khả quan, so sad :(. Thế là thử mấy cái chức năng liên quan đến user. Thường là brute password (spam mật khẩu vào form login), forgot pass xem hình thức đổi password như thế nào…

Đăng nhập mật khẩu bậy: captcha hiện ra ngay lần thứ 3, ôi tía. mà captcha còn khó nữa, cho em nó qua 1 bên.

Chức năng quên mật khẩu:

Thử với email, nhận được một token với cả kí tự và số (không dài, 8 kí tự chữ số), nhập wrong token => olala không có captcha sau 1 cơ số lần thử, tuy nhiên vẫn buồn, vì có xài script để auto brute cái key 8 kí tự chữ số này cũng tốn không ít thời gian, bỏ qua, coi còn cách nào không.

Chợt nhớ là nãy nhận token qua phone có số thôi, thử forgot pass với phone xem, token nhận được nhanh như thường lệ và …ý token có 6 số (hên quá). Nhập linh tinh vài lần, vẫn không có captcha. Ngon rồi.

Bình thường thì bật burp lên capture cái request và chiến, tuy nhiên đang sẵn có cái script brute cái đăng kí viết rồi, edit phát rồi chạy xem cái thông báo có hiện ra không.

Bang bang. Script chạy tốt. Con bug thứ 2 xuất hiện: Reset password bất kì tài khoản nào thông qua số điện thoại.

Kết quả không quá tệ cho 1 buổi chiều.

thực hiện brute OTP lấy tài khoản người dùng

Thông báo thực hiện thành công

 

Vậy là với con bug này, mình có thể lấy bất kì tài khoản nào từ Z chỉ với số điện thoai, coi như nắm người dùng của Z trong tay, hơi phê phê. Mần gì tiếp nhỉ, à email thông báo lỗi, hị hị.

Timeline

02/03/2017 – 5:05PM : Email thông báo lỗi cho Z.

02/03/2017 – 5:35PM : Nhận được phản hồi.

08/03/2017 : Fix xong lỗi.

09/03/2017 : Nhận được quà tri ân từ Z, hị hị.

Sau đó cho trao đổi một vài bug khác tương đối thú vị, như spam gate SMS, XSS.. Ngoài ra qua quá trình liên lạc với anh kĩ thuật của Z, mình cảm thấy rất ok, lần đầu tiên mình report bug ở Việt Nam mà được trao đổi cởi mở như vậy. LIKE LIKE.

Một vài vấn đề kĩ thuật:

Thực hiện test với tất cả những chức năng có sử dụng trên website. Z thực hiện rất tốt các vấn đề kĩ thuật đối với site chính (như đăng nhập, đăng ký, quên mật khẩu đều có captcha), tuy nhiên form mình exploit là một form phụ, đã được dev từ trước, chức năng này được tái sử dụng mà không validate lại các trường hợp như ở site chính, và trong quá trình tích hợp cũng quên luôn vì mặc định trước giờ nó chạy tốt rồi @@.

Chỉ sinh token 1 lần duy nhất, và expire token đó ngay khi có đăng nhập vào với đúng Username/Password. Ở trang này, mỗi lần mình thực hiện gửi quên mật khẩu qua SMS, OTP gửi về là 1 mã khác nhau. Đây cũng là một điểm yếu. Thực ra với OTP có nhiều cách để lấy brute token, ví dụ như thay vì mình đoán number từ 0 -> 999999, mình chỉ cần chọn 1 token 6 số như 234567, và thực hiện forgot pass 999999 lần, thế nào cũng có 1 lần generate token đúng với số mình đưa ra.

Luôn hạn chế query đến những URL nhạy cảm sau một vài ..chục lần thử (/register, /changepassword…). Có thể ban IP hay khóa tạm thời user đó trong vài tiếng. Việc này có thể được thực hiện từ server mà không cần thông qua coding.

Ngoài ra có thể sử dụng một vài kĩ thuật khác như sinh csrf cho mỗi lần request mà không được tái sử dụng lại.

Tổng kết,

Là hết :))))))).

 

A&C

About the Author

A&C

Thanh niên ham chơi hơn ham học, thích bay nhảy hơn đi mần, tinh thần giao lưu kết bạn nhưng ngại tiếp xúc. Mong manh khó vỡ, ảo tưởng sức mạnh >:)

Follow A&C:

Leave a Comment: