Authorization – Phân quyền trong user website
Authorization 01
Tại ví dụ này, chúng ta lợi dụng sự giới hạn quyền bị lỗi trong ứng dụng. Cụ thể, khi đăng nhập xong, giao diện cho phép chúng ta truy cập vào dữ liệu của user1, nhưng nếu chúng ta thay đổi đường dẫn URL thì có thể truy cập được dữ liệu của user2.
Authorization 02
Tương tự như ví dụ 06, tuy nhiên ở ví dụ này chúng ta không thể truy cập trực tiếp vào user2 được. Nhưng chúng ta có thể đọc được dữ liệu của user2 thông qua việc edit từ user1, sau đó sửa URL.
Authorization 03
Trong ví dụ này, chúng ta sẽ khai thác dựa trên một sai lầm cổ điển khi dev gen code tự động cho một bản ghi. Nghĩa là khi truy cập trang html, key đã bị ẩn đi nhưng khi chúng ta sửa url để vào bản ghi JSON thì thông tin đã không còn bị ẩn đi nữa.
Cách thứ hai là sử dụng terminal để curl file json về:
Hoặc curl file html nhưng accept any content:
1 |
curl http://ptl-c0a1238b-91c0a33d.libcurl.st/users/1 - H 'Accept: application/json' |
Authorization 04
Đây là một ví dụ rất hay, nó giúp chúng ta hiểu về cách bypass quyền admin của một website. Website trong ví dụ này sử dụng Object-relational mapping (ORM) để dễ dàng query database mà không cần biết SQL. Ví dụ, trong Ruby (sử dụng ActiveRecord), bạn có thể làm những việc như:
@user = User.find_by_name (‘pentesterlab’)
Điều này sẽ tự động tạo và thực thi truy vấn và lấy kết quả trong một đối tượng User. Một cách sử dụng thực sự tiện dụng khác là tự động tạo và cập nhật một đối tượng từ một hàm băm:
@user = User.create (myhash)
[…]
@ user.update_attributes (anotherhash)
Điều này tiện nhưng đi kèm với sự thiếu bảo mật, nếu nhà phát triển không đảm bảo chính xác các thuộc tính của object @user được bảo vệ, attacker có thể tuỳ ý ghi đè bất kỳ thuộc tính nào. Và ở ví dụ này, chúng ta sẽ xem một số ví dụ phổ biến của loại này: Mass-Assignment. Ở website của phần này, chúng ta có thể đăng ký một user, ứng dụng có 2 cấp độ quyền là admin và user. Admin được set bằng một thuộc tính trên đối tượng user. Chúng ta sẽ xem format user được sử dụng bởi ứng dụng web này bằng cách sử dụng Burp Suite.
- Mở trình duyệt tích hợp sẵn proxy của Burp Suite, tạo tài khoản user1/123
- Trên Burp Suite ta thấy các thông tin sau
- Decode đoạn thông tin mà chúng ta sẽ gửi lên server bằng định dạng HTML
Các thuộc tính sẽ được trình bày dạng: user[attribute]
- Chúng ta chèn thêm thuộc tính user[admin]=true vào để ứng dụng biết user đó là admin bằng các bước như sau:
Authorization 05
Tương tự như phần 04, tuy nhiên payload truyền vào &user[admin]=1
Kinh nghiệm ở đây là ngoài sử dụng true, có thể thay thế bằng 1 [boolean true=1]
Authorization 06
App sử dụng ActiveRecord
Tương tự như phần 04, tuy nhiên payload truyền vào +Query&user%5Borganisation_id%5D=1
Kinh nghiệm rút ra là check được field organisation_id=1