(Tất cả những thông tin nhạy cảm mình đều sử dụng X để thay thế nhé)
Hôm nay mình lại tiếp tục với GraqhQL với kỹ thuật brute force (đào mỏ), về kỹ thuật này các bạn có thể tìm hiểu qua trên wiki nhé: https://vi.wikipedia.org/wiki/Brute_force
3h sáng cùng với thời tiết se lạnh của mùa đông ở Hà Nội, sau khi hoàn thành công việc trên công ty. Tôi đã ngừng lại một chút để thư giản với những clip hài. Và sẳn tiện nghịch một chút trên hệ thống của công ty X.
Trong lúc nghịch tôi phát hiện câu truy vấn trong graphql của họ có sử dụng bộ lọc trường. (Chi tiết xem ở đây nhé https://www.graph.cool/docs/reference/graphql-api/query-api-nia9nushae)
Trong lúc nghịch tôi phát hiện câu truy vấn trong graphql của họ có sử dụng bộ lọc trường. (Chi tiết xem ở đây nhé https://www.graph.cool/docs/reference/graphql-api/query-api-nia9nushae)
id: ID # matches all nodes with exact value
id_not: ID # matches all nodes with different value
id_in: [ID!] # matches all nodes with value in the passed list
id_not_in: [ID!] # matches all nodes with value not in the passed list
id_lt: ID # matches all nodes with lesser value
id_lte: ID # matches all nodes with lesser or equal value
id_gt: ID # matches all nodes with greater value
id_gte: ID # matches all nodes with greater or equal value
id_contains: ID # matches all nodes with a value that contains given substring
id_not_contains: ID # matches all nodes with a value that does not contain given substring
id_starts_with: ID # matches all nodes with a value that starts with given substring
id_not_starts_with: ID # matches all nodes with a value that does not start with given substring
id_ends_with: ID # matches all nodes with a value that ends with given substring
id_not_ends_with: ID # matches all nodes with a value that does not end with given substring
Với những bộ lọc trên tôi suy nghĩ không biết các trường như "password", "access_token", "reset_token".... có thể sử dụng được bộ lọc hay không nhỉ? Và thế là tôi đã thử với trường "reset_token_starts_with".
"reset_token_starts_with" nghĩa là tìm chuỗi được bắt đầu bằng chuỗi đã cho trước.
Ví dụ: Tìm ID và Tên của một tài khoản trong 1 - 5000 tài khoản kia bằng trường reset_token có bắt đầu bằng chữ a.
Lúc này câu truy vấn mà mình có được như sau:
{users(where:{reset_token_starts_with: "a"}) { id name}}
Và kết quả ngoài sự mong đợi của mình, nó đã trả về danh sách tất cả tài khoản nào có trường reset_token chứa ký tự a.
Thế là lúc này mình mới nghĩ ra ý tưởng viết một đoạn script nhỏ để duyệt vòng lặp chuỗi ký tự "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
để "đào" cho ra được đoạn reset_token hoàn chỉnh của một tài khoản bất kì trên hệ thống. Vậy làm thế nào để mình biết được khi nào thì nên đoạn reset_token kia hoàn chỉnh?
Lúc này mình tạo một tài khoản trên hệ thống sau đó dùng chức năng "Lấy lại mật khẩu" để hệ thống gửi về cho mình một liên kết có chứa đoạn reset_token. (Cái này thì chắc các bạn sẽ để, bất kì website nào khi bạn dùng chức năng trên thì mặc định các hệ thống đều gửi về cho bạn một liên kết chứa một đoạn mã hoá hoặc chuỗi hash dài dài, ngắn ngắn...).
Sau khi có được đoạn chuỗi mà hệ thống gửi về mình biết được trường reset_token chứa một đoạn hash có độ dài là 40 ký tự, mà thông thường thì hash có độ dài 40 ký tự là hàm băm sha1.
Bỏ qua việc nó là sha1 đi, mình chỉ cần xác định được độ dài của đoạn chuỗi ấy là bao nhiêu, để làm điểm kết thúc cho vòng lặp trên.
Mình chạy thử đoạn script với ID của mình và "tèn ten", đoạn script đã tìm ra được chuỗi reset_token mà hệ thống đã gửi mail về cho mình. Tới đây thì cũng đã gần 5h sáng nên mình tắt máy đi ngủ chờ đến tối hôm sau mình mới gửi báo cáo.
Timelime:
27/10/2019 21:15 - Gửi báo cáo đến X
27/10/2019 21:20 - X tiếp nhận báo cáo
27/10/2019 21:28 - MÌnh gửi thêm thông tin
27/10/2019 21:35 - X xác nhận thông tin và phản hồi đang vá.
28/10/2019 11:15 - Mình hỏi lại vấn đề đã được fix?
28/10/2019 12:00 - X phản hồi đã fix và báo kiểm tra
28/10/2019 12:53 - Xác nhận đã fix.
28/10/2019 hh:ii:ss - Nhận được tiền thưởng từ X ($0000)
Thế là lúc này mình mới nghĩ ra ý tưởng viết một đoạn script nhỏ để duyệt vòng lặp chuỗi ký tự "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
để "đào" cho ra được đoạn reset_token hoàn chỉnh của một tài khoản bất kì trên hệ thống. Vậy làm thế nào để mình biết được khi nào thì nên đoạn reset_token kia hoàn chỉnh?
Lúc này mình tạo một tài khoản trên hệ thống sau đó dùng chức năng "Lấy lại mật khẩu" để hệ thống gửi về cho mình một liên kết có chứa đoạn reset_token. (Cái này thì chắc các bạn sẽ để, bất kì website nào khi bạn dùng chức năng trên thì mặc định các hệ thống đều gửi về cho bạn một liên kết chứa một đoạn mã hoá hoặc chuỗi hash dài dài, ngắn ngắn...).
Sau khi có được đoạn chuỗi mà hệ thống gửi về mình biết được trường reset_token chứa một đoạn hash có độ dài là 40 ký tự, mà thông thường thì hash có độ dài 40 ký tự là hàm băm sha1.
Bỏ qua việc nó là sha1 đi, mình chỉ cần xác định được độ dài của đoạn chuỗi ấy là bao nhiêu, để làm điểm kết thúc cho vòng lặp trên.
Mình chạy thử đoạn script với ID của mình và "tèn ten", đoạn script đã tìm ra được chuỗi reset_token mà hệ thống đã gửi mail về cho mình. Tới đây thì cũng đã gần 5h sáng nên mình tắt máy đi ngủ chờ đến tối hôm sau mình mới gửi báo cáo.
Timelime:
27/10/2019 21:15 - Gửi báo cáo đến X
27/10/2019 21:20 - X tiếp nhận báo cáo
27/10/2019 21:28 - MÌnh gửi thêm thông tin
27/10/2019 21:35 - X xác nhận thông tin và phản hồi đang vá.
28/10/2019 11:15 - Mình hỏi lại vấn đề đã được fix?
28/10/2019 12:00 - X phản hồi đã fix và báo kiểm tra
28/10/2019 12:53 - Xác nhận đã fix.
28/10/2019 hh:ii:ss - Nhận được tiền thưởng từ X ($0000)
Đăng nhận xét