+1

Kiểm thử các lỗi bảo mật logic bằng OpenAPI document + SwaggerStrike

Với sự phát triển của các công cụ khai thác dò quét lỗi tự động mạnh mẽ như hiện nay, có thể kể đến một vài cái tên như nuclei, burpsuite, wiz, nessus,... việc phát hiện các lỗ hổng đã trở nên rất dễ dàng. Những lỗi được phát hiện trên công cụ này có đặc điểm là mang tính quy luật, có thể dự đoán được kết quả trả về. Một số lỗi như SQLi, XSS,... được phát hiện nhanh chóng bằng những công cụ trên. Tuy nhiên, có một số lỗ hổng rất khó nhận biết, không có quy luật cụ thể, đây là những lỗ hổng về logic flaw. Một số lý do khó phát hiện được các lỗi liên quan về logic:

  • Các chức năng giao tiếp giữa client và server không có quy luật nhất định, tùy theo mô hình và thiết kế của ứng dụng theo chức năng cụ thể.
  • Các chức năng được thiết kế theo một flow nhất định, gồm nhiều bước diễn ra nối tiếp nhau.
  • Khi thực hiện viết rule, cần thiết kế riêng logic riêng cho từng nhóm API, tốn thời gian.
  • Tỷ lệ false positive của các lỗi này ở mức cao.

Giải quyết

Trong một bài viết trước đề cập về những vấn đề cần lưu ý khi thực hiện các giải pháp về API security, mình có đề cập đến một biện pháp giúp developer/tester/security team quản lý các API bằng cách thực hiện "tài liệu hóa" các endpoint, phổ biến là sử dụng Swagger 2(nay là OpenAPI 3).

Swagger hay OpenAPI Specification là một định dạng mô tả dành cho REST API, cho phép bạn mô tả toàn bộ API, bao gồm:

  • Endpoints (/users) và cách thức hoạt động của mỗi endpoint (GET/users, POST/users).
  • Các tham số đầu vào và đầu ra của từng hoạt động.
  • Phương thức xác thực.
  • Chứng chỉ, thông tin liên lạc, điều khoản sử dụng và những thông tin khác.

Việc tài liệu hóa giúp dễ dàng cho việc phát triển phần mềm, theo dõi các API có trong hệ thống. Đối với các security engineer, có thể sử dụng để kiểm thử và tìm kiếm các lỗi liên quan về logic. Với ý tưởng trên, mình đã thực hiện và phát triển công cụ SwaggerStrike.

Giới thiệu về SwaggerStrike

SwaggerStrike là một công cụ kiểm thử giúp phát hiện nhanh một số lỗ hổng về logic.

Công cụ này được thiết kế dành cho:

  • Security engineer/ Bug bounty hunter: tìm kiếm nhanh những lỗ hổng bảo mật liên quan đến logic (IDOR, function privileged).
  • Nhà phát triển phần mềm: giúp kiểm tra và nhanh chóng phát hiện những lỗ hổng bảo mật trước ở mô trường staging trước khi được release ra môi trường production.

Công cụ này hoạt động như thế nào:

Cơ bản, ứng dụng sẽ hoạt động theo các bước sau:

  1. Sau khi cung cấp địa chỉ web của Swagger 2 hoặc OpenAPI 3, công cụ sẽ tiến hành trích xuất và lấy nội dung của document.
  2. Thực hiện quá trình parse tài liệu trên.
  3. Thực hiện tạo các parameter của request và gửi lên server ứng với mỗi endpoint.
  4. Phân tích kết quả trả về và kiểm tra xem có tồn lại lỗ hổng bảo mật hay không.

Công cụ có thể giúp bạn trong các việc sau:

  • List tất cả các endpoint có trong tài liệu.
  • Tìm kiếm các lỗ hổng liên quan unauthenticated.
  • Tìm kiếm các lỗ hổng IDOR
  • Tìm kiếm các lỗ hổng về phân quyền.

Cách sử dụng công cụ: các bạn có thể đọc ở phần mô tả tại link này. image.png

Use case

Mình sẽ liệt kê một số use case có thể thực hiện bằng công cụ này.

Liệt kê tất cả endpoint

swaggerStrike listall -u "https://swagger.com/swagger" -T 'https://api.swagger.com/api/v1'

image.png Công cụ thực hiện phân tích các endpoint, gửi request và cung cấp các thông tin về: endpoint, method, status code, mô tả trạng thái.

Tìm các endpoint bị lỗi unauthenticated

swaggerStrike unauth -u "https://swagger.com/swagger" -T 'https://api.swagger.com/api/v1'

image.png

Công cụ thực hiện phân tích, liệt kê những endpoint không có xác thực.

Tìm các endpoint bị lỗi IDOR

swaggerStrike idor -u "https://swagger.com/swagger" -T 'https://api.swagger.com/api/v1'

image.png

Ở bước này, việc kiểm tra IDOR có thể theo hướng authenticated hoặc unauthenticated. Bạn có thể chỉnh sửa cấu hình các tham số xác thực ở file config profile.yaml . Nếu có nhiều profile khác nhau thì profile đầu tiên sẽ được sử dụng. Công cụ sẽ lần lượt duyệt qua các tham số, những tham số được dự đoán là key như id, key sẽ được thực hiện bruteforce. Bạn có thể chỉnh sửa và thêm config để phù hợp với ứng dụng của bạn(config tại mục Parameter)

  • Nếu không tồn tại, mặc định sẽ được bruteforce từ 1-100
  • Tham số có giá trị: 100-150 --> Công cụ thực hiện bruteforce từ 100 - 150
  • Tham số có giá trị: 110,120,140,160 --> Công cụ thực hiện brute các tham số có trong dãy.
  • 100 --> Công cụ thực hiện giữ nguyên tham số 100.

Ví dụ mẫu:

parameters:
  value-1: 1-100
  value-2: 1,2,3,4,5,5,6,7,8,9,10
  value-3: max-volume
  value-4: example 2
  order_id: 201-230
  user_id: 111,121,131,141,151,161,171

Tìm các endpoint bị lỗi phân quyền

swaggerStrike privilege -u "https://swagger.com/swagger" -T 'https://api.swagger.com/api/v1'

image.png

Ở chức năng này, bạn sẽ liệt kê theo từng nhóm endpoint được phép truy cập của mỗi profile. Công cụ sẽ thực hiện kiểm tra và liệt kê những endpoint nào được không được phép truy cập tới. Phần config bạn có thể xem ở trong file config profile.yaml.

Phần cấu hình mẫu bạn có thể tham khảo:

decentralization:
  - name: profile_1
    paths:
      - path: /pet/*
      - path: /user/*
      - path: /user
  - name: profile_2
    paths:
      - path: /user/*
      - path: /store/*
      - path: /pet/*
      - path: /pet
      - path: /user

Note: đối với các nhóm chức năng, bạn có thể sử dụng ký tự * để biểu diễn.

Kế hoạch phát triển

  • Hiện nay công cụ chỉ mới hỗ trợ một vài content length(json, url-encoded,plantext): trong các phiên bản sau mình sẽ hỗ trợ một số content-type khác như XML, file.
  • Hỗ trợ xuất ouput dưới dạng plaintext và json.
  • Có kế hoạch apply vào luồng CI-CD, quá trình scan lỗi sẽ diễn ra tự động sau mỗi bản build, ouput sẽ được tạo issue, liên kết đến các hệ thống jira hoặc sonarqube.

Công cụ thay thế:

Một số công cụ khác mà các bạn có thể tham khảo:

Link công cụ để các bạn tham khảo: https://github.com/nhthongDfVn/SwaggerStrike Công cụ đang trong quá trình phát triển, nếu bạn phát hiện có issue trong quá trình chạy công cụ có thể tạo issue ở github.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí