DEV Community

tRavOndAtrACk
tRavOndAtrACk

Posted on

Lab: Finding and exploiting an unused API endpoint

Lab: Finding and exploiting an unused API endpoint

1. Thông tin lab

  • Tên lab: Finding and exploiting an unused API endpoint
  • Mức độ: Practitioner
  • Trạng thái: Solved
  • Mục tiêu: Khai thác một API endpoint ẩn/không được sử dụng để mua sản phẩm Lightweight "l33t" Leather Jacket với giá thấp hơn giá gốc.
  • Tài khoản được cung cấp: wiener:peter

2. Mô tả lỗ hổng

Ứng dụng tồn tại lỗ hổng trong API quản lý giá sản phẩm. Mặc dù chức năng thay đổi giá không hiển thị trực tiếp trên giao diện người dùng, endpoint API /api/products/<id>/price vẫn hỗ trợ phương thức PATCH.

Attacker có thể lợi dụng việc API endpoint chưa được bảo vệ chặt chẽ để gửi request thay đổi giá sản phẩm. Bằng cách sửa giá của sản phẩm Lightweight "l33t" Leather Jacket về 0, attacker có thể thêm sản phẩm vào giỏ hàng và đặt mua với giá $0.00.


3. Công cụ sử dụng

  • Burp Suite
  • Burp Browser
  • Proxy HTTP history
  • Repeater

4. Các bước thực hiện

Bước 1: Truy cập lab và quan sát sản phẩm

Truy cập lab bằng Burp Browser.

Ban đầu, chưa cần đăng nhập. Truy cập vào một sản phẩm bất kỳ trên website.

Trong quá trình truy cập sản phẩm, Burp Suite sẽ ghi lại các request liên quan đến API trong phần HTTP history.


Bước 2: Quan sát request trong Burp Suite

Vào:

Proxy > HTTP history
Enter fullscreen mode Exit fullscreen mode

Tìm request API liên quan đến giá sản phẩm, ví dụ:

GET /api/products/3/price HTTP/2
Host: <lab-domain>
Enter fullscreen mode Exit fullscreen mode

Request này cho thấy ứng dụng sử dụng API để lấy thông tin giá của sản phẩm.

Các thành phần đáng chú ý:

  • Method: GET
  • Endpoint: /api/products/1/price
  • Chức năng: lấy giá sản phẩm
  • API có cấu trúc RESTful, có thể thử thay đổi HTTP method để kiểm tra thêm chức năng ẩn

Bước 3: Gửi request sang Repeater

Nhấp chuột phải vào request:

GET /api/products/1/price HTTP/2
Host: <lab-domain>
Enter fullscreen mode Exit fullscreen mode

Chọn:

Send to Repeater
Enter fullscreen mode Exit fullscreen mode

Mục đích là chỉnh sửa method và nội dung request để kiểm tra phản hồi từ server.


Bước 4: Kiểm tra các HTTP method được hỗ trợ

Trong tab Repeater, đổi method từ GET sang OPTIONS:

OPTIONS /api/products/1/price HTTP/2
Host: <lab-domain>
Enter fullscreen mode Exit fullscreen mode

Gửi request và quan sát response.

Response cho biết endpoint này hỗ trợ các method:

GET, PATCH
Enter fullscreen mode Exit fullscreen mode

Điều này cho thấy ngoài việc lấy giá sản phẩm bằng GET, endpoint này còn có thể hỗ trợ cập nhật giá bằng PATCH.


Bước 5: Thử gửi request PATCH

Tiếp tục đổi method từ GET sang PATCH:

PATCH /api/products/1/price HTTP/2
Host: <lab-domain>
Content-Type: application/json
Enter fullscreen mode Exit fullscreen mode

Sau khi gửi request, server trả về thông báo:

Unauthorized
Enter fullscreen mode Exit fullscreen mode

Thông báo này cho thấy có thể cần đăng nhập trước khi thực hiện thao tác cập nhật giá.


Bước 6: Đăng nhập vào tài khoản được cung cấp

Quay lại Burp Browser và đăng nhập bằng tài khoản:

Username: wiener
Password: peter
Enter fullscreen mode Exit fullscreen mode

Sau khi đăng nhập thành công, truy cập sản phẩm:

Lightweight "l33t" Leather Jacket
Enter fullscreen mode Exit fullscreen mode

Bước 7: Tìm request API của sản phẩm Leather Jacket

Trong:

Proxy > HTTP history
Enter fullscreen mode Exit fullscreen mode

Tìm request lấy giá của sản phẩm Lightweight "l33t" Leather Jacket, ví dụ:

GET /api/products/1/price HTTP/2
Host: <lab-domain>
Cookie: session=<session-value>
Enter fullscreen mode Exit fullscreen mode

Nhấp chuột phải vào request này và chọn:

Send to Repeater
Enter fullscreen mode Exit fullscreen mode

Bước 8: Chuyển method sang PATCH

Trong Repeater, đổi method từ GET sang PATCH:

PATCH /api/products/1/price HTTP/2
Host: <lab-domain>
Cookie: session=<session-value>
Enter fullscreen mode Exit fullscreen mode

Gửi request.

Server trả về lỗi liên quan đến Content-Type, cho biết request cần sử dụng:

Content-Type: application/json
Enter fullscreen mode Exit fullscreen mode


Bước 9: Thêm Content-Type và body JSON

Thêm header:

Content-Type: application/json
Enter fullscreen mode Exit fullscreen mode

Sau đó thêm body rỗng:

{}
Enter fullscreen mode Exit fullscreen mode

Request lúc này có dạng:

PATCH /api/products/1/price HTTP/2
Host: <lab-domain>
Cookie: session=<session-value>
Content-Type: application/json

{}
Enter fullscreen mode Exit fullscreen mode

Gửi request.

Server tiếp tục trả về lỗi vì thiếu tham số price.

Thông báo lỗi này giúp xác định rằng API cần một tham số tên là:

price
Enter fullscreen mode Exit fullscreen mode


Bước 10: Khai thác lỗ hổng thay đổi giá sản phẩm

Thêm tham số price vào JSON body và đặt giá trị là 0:

PATCH /api/products/1/price HTTP/2
Host: <lab-domain>
Cookie: session=<session-value>
Content-Type: application/json

{
  "price": 0
}
Enter fullscreen mode Exit fullscreen mode

Gửi request.

Response cho thấy request được xử lý thành công. Điều này chứng minh attacker có thể cập nhật giá sản phẩm thông qua API endpoint ẩn.


Bước 11: Kiểm tra giá sản phẩm trên giao diện

Quay lại Burp Browser và reload trang sản phẩm Lightweight "l33t" Leather Jacket.

Quan sát thấy giá sản phẩm đã được thay đổi thành:

$0.00
Enter fullscreen mode Exit fullscreen mode

Điều này xác nhận rằng request PATCH đã thay đổi thành công giá sản phẩm.


Bước 12: Hoàn thành mục tiêu lab

Thêm sản phẩm Lightweight "l33t" Leather Jacket vào giỏ hàng.

Sau đó vào giỏ hàng và chọn:

Place order
Enter fullscreen mode Exit fullscreen mode

Kết quả:


5. Kết quả

Lab đã được giải thành công.

Mục tiêu hoàn thành:

Sản phẩm Lightweight "l33t" Leather Jacket đã được mua thành công với giá $0.00.
Enter fullscreen mode Exit fullscreen mode

6. Nguyên nhân

Nguyên nhân chính của lỗ hổng là:

  • API endpoint /api/products/<id>/price vẫn hỗ trợ phương thức PATCH.
  • Chức năng cập nhật giá sản phẩm không được bảo vệ phân quyền đầy đủ.
  • Server cho phép người dùng thường gửi request thay đổi giá sản phẩm.
  • Ứng dụng để lộ thông tin qua error message, giúp attacker biết cần sử dụng Content-Type: application/json và tham số price.
  • Server tin tưởng dữ liệu từ phía client mà không kiểm tra quyền hạn phù hợp.

7. Tác động

Attacker có thể lợi dụng lỗ hổng để:

  • Thay đổi giá sản phẩm trái phép.
  • Mua sản phẩm với giá thấp hơn giá gốc.
  • Gây thiệt hại tài chính cho hệ thống thương mại điện tử.
  • Lạm dụng các API endpoint ẩn để thực hiện hành động không được phép.
  • Ảnh hưởng đến tính toàn vẹn của dữ liệu sản phẩm.

8. Khuyến nghị khắc phục

Để khắc phục lỗ hổng, cần:

  • Kiểm tra phân quyền chặt chẽ ở phía server trước khi cho phép cập nhật giá sản phẩm.
  • Không cho phép người dùng thường truy cập các API quản trị hoặc API chỉnh sửa dữ liệu nhạy cảm.
  • Giới hạn method được phép sử dụng trên từng endpoint.
  • Không để lộ quá nhiều thông tin chi tiết trong error message.
  • Kiểm tra role của người dùng trước khi xử lý request PATCH.
  • Áp dụng nguyên tắc least privilege.
  • Ghi log và giám sát các request bất thường đến các endpoint nhạy cảm.
  • Tách biệt rõ API dành cho người dùng thường và API dành cho quản trị viên.

9. Kết luận

Lab này minh họa cách khai thác lỗ hổng unused API endpoint trong ứng dụng web. Mặc dù giao diện người dùng không hiển thị chức năng thay đổi giá sản phẩm, endpoint API vẫn tồn tại và hỗ trợ method PATCH.

Thông qua Burp Suite, attacker có thể phát hiện endpoint /api/products/1/price, kiểm tra method được hỗ trợ bằng OPTIONS, sau đó gửi request PATCH với body JSON để thay đổi giá sản phẩm về 0.

Kết quả cho thấy việc để lộ hoặc không kiểm soát chặt chẽ các API endpoint ẩn có thể dẫn đến hành vi trái phép nghiêm trọng. Do đó, hệ thống cần kiểm tra xác thực, phân quyền và giới hạn quyền truy cập API ở phía server.

Top comments (0)