SQL injection (SQLi) vẫn là một trong những lỗ hổng web phổ biến nhất hiện nay. Nhưng làm thế nào để học cách khai thác nó một cách hợp pháp? Đơn giản thôi, bạn chỉ cần tải xuống và định cấu hình Burp Suite Community Edition, đồng thời tạo và lập tài khoản trong PortSwigger Labs.
Để khai thác SQL Injection, trước tiên bạn nên tải Burp Suite Pro để thực hành nhé.
Kế hoạch
Nhiệm vụ: Tìm Lab “SQL injection attack, liệt kê nội dung cơ sở dữ liệu trên cơ sở dữ liệu không phải Oracle”. Mình đã chọn Lab này vì nó hiển thị tất cả các bước của SQLi cơ bản và giúp bạn hiểu các công cụ của Burp Suite.
Tóm lại: tìm thông tin đăng nhập Admin
Các bước cần thiết:
- Tìm và xác nhận Entry Point (Điểm vào) trong request web
- Tìm hiểu loại SQL comment hợp lệ
- Tìm số Row trong bảng hiện tại
- Tìm các Column trả về STRING
- Tìm Table nào nằm trong cơ sở dữ liệu của ứng dụng web này
- Tìm Tablemục tiêu (Table có thông tin đăng nhập admin)
- Xác định tên Column của Table
- Lấy nội dung
SQL Injection cơ bản với Burp Suite
1. Tìm và xác nhận Entry Point trong request web
Khi truy cập trang, bạn sẽ thấy một trang đích bình thường. Mục tiêu của chúng ta là khám phá trang này và tìm kiếm các tham số có liên quan đến cơ sở dữ liệu.
Ở đây rõ ràng chúng ta có hai tùy chọn: các bộ lọc như ‘All’, ’Clothing’,… và My Account nằm ở trên cùng bên phải.
Hãy tập trung vào các bộ lọc.
Nhấp vào “All” sẽ không gọi bất kỳ bộ lọc nào.
Vì vậy, hãy chọn bộ lọc “Gifts” để nhận được một phản hồi hợp lệ.
Bây giờ, hãy tăng sức mạnh cho Burp và truy cập lịch sử HTTP của Proxy của nó. Đảm bảo rằng bạn đã tắt Intercept. Nếu không, nó vẫn hoạt động nhưng mọi thứ sẽ chậm hơn nhiều… bạn có thể tự mình thử.
Burp đã chặn một Request tới Ứng dụng Lab. Bây giờ chúng ta cần chỉnh sửa nó. Chúng ta gửi Request này tới Repeater trong Burp bằng cách nhấp chuột phải vào Request Body và chọn “Send to Repeater”.
Sau đó, chuyển đến tab Repeater trong Burp và tìm Request. Bạn có thể chỉnh sửa nó ngay bây giờ.
Máy chủ web chỉ hiểu các ký tự URL và chỉ một số nội dung con người có thể đọc được. Vì vậy, hãy bật bộ mã hóa URL tự động trong Burp bằng cách nhấp vào Request body trong Repeater và chọn URL-encode as you type. Bây giờ, bất cứ khi nào chúng ta nhập các ký tự mà máy chủ Web không hiểu được sẽ được mã hóa dưới dạng URL và hầu hết các ký tự mà con người có thể đọc được sẽ được giữ nguyên.
Cách dễ nhất để tìm entry point trong SQLi là chèn các Ký tự Xấu. Đây là danh sách cơ bản:
‘ %27 “ %22 # %23 ; %3B ) Wildcard (*)
Bắt đầu thử chúng từ trên xuống dưới bằng cách đưa chúng vào tham số “category”. Ví dụ:
?category='
Ngay sau khi thử ký tự đầu tiên là ‘, đã xảy ra lỗi. Đây là một dấu hiệu tốt vì nó có nghĩa là máy chủ đó đã không lọc yêu cầu. Biểu tượng mà chúng ta gửi đã gây ra lỗi trong SQL.
Bạn có thể tự động hóa quy trình này với Burp Intruder.
2. Tìm ra loại SQL comment hợp lệ
Chúng ta đã có entry point, là giá trị của tham số “category” sau dấu =.
Bây giờ, chúng ta cần học cách kiểm soát điểm nhập này vì nó có thể phá vỡ request SQL hợp lệ.
Việc kiểm soát được thực hiện bằng cách sử dụng comment phù hợp. Tùy thuộc vào kiểu SQL mà có các comment khác nhau. Vì vậy, cách tốt nhất là hãy thử tất cả chúng nhưng hầu hết các cơ sở dữ liệu đều là MSSQL hoặc MySQL.
Comment dấu gạch ngang kép (-) không tạo ra lỗi, vì vậy nó hợp lệ và chúng ta có thể nhập các câu lệnh hợp lệ trước nó.
3. Tìm số hàng trong bảng
Để khai thác cơ sở dữ liệu dễ bị tấn công, trước tiên bạn cần phải tìm cách chuyển các lệnh đến nó. Lưu ý rằng các lệnh trực tiếp không có hiệu lực.
‘ SELECT * FROM information_schema.tables —
Ứng dụng trả về kết quả truy vấn SQL trong các phản hồi của nó, vì vậy có thể sử dụng kiểu tấn công UNION Injection.
Để thực hiện cuộc tấn công UNION, bạn cần xác định số lượng các cột của bảng đang hoạt động.
Số lượng cột: mỗi bảng SQL có một số cột nhất định. Để làm cho cuộc tấn công UNION hoạt động, request sau từ khoá UNION cần phải chứa cùng một lượng cột như bảng đang hoạt động có.
Bảng đang hoạt động: không phải là một thuật ngữ SQL chính thức nhưng mình thích sử dụng nó vì nó phù hợp với cách hoạt động của SQL trên web. Bảng đang hoạt động là bảng được ứng dụng sử dụng để cung cấp các phản hồi dự kiến cho các yêu cầu của người dùng.
Do đó, số lượng cột có thể được xác định bằng cách sử dụng: ORDER BY. Bằng cách tăng số lượng sau nó, chúng ta có thể xác định số lượng cột chính xác.
Bạn sẽ nhận thấy rằng ‘ORDER BY 1 -‘ không tạo ra lỗi nhưng ‘ORDER BY 1 0—‘ thì số lượng cột lớn hơn 1 nhưng nhỏ hơn 10.
Thử 2 kết quả không có lỗi nhưng cái thứ 3 thì lỗi. Có không quá 3 cột: có đúng 2 cột trong bảng đang hoạt động.
4. Tìm các cột trả về STRING
Bây giờ, chúng ta đã biết số lượng cột, nhưng chúng ta cần biết những cột nào sẽ cung cấp phản hồi. Chỉ các cột có kiểu dữ liệu CHAR và tương tự mới có thể trả về thông tin con người có thể đọc được.
Điều này có thể được kiểm tra bằng truy vấn UNION SELECT. Nó hoạt động bằng cách kết hợp các kết quả của nhiều câu lệnh select. Câu lệnh select đầu tiên cung cấp thông tin từ bảng đang hoạt động nhưng vì chúng ta hãm truy vấn đầu tiên, nên nó không cung cấp gì cả. Sau UNION là câu lệnh select tiếp theo. Câu lệnh này chỉ là một truy vấn trống nhưng nó nhận được kết quả đầu ra cùng với các kết quả trống từ truy vấn mới nhất.
Nnhập một chuỗi ngẫu nhiên vào mỗi cột:
‘ UNION SELECT ‘a’, ‘b’ —
Câu trả lời in ra cả a và b. Vì vậy, cả hai cột đều có thể khai thác được.
Hãy sử dụng cột đầu tiên cho phản hồi và vô hiệu hoá cột thứ hai bằng NULL.
Những gì chúng ta cần khi phản hồi là tên bảng, trong điều kiện bình thường sẽ được xác định bằng:
SELECT table_name FROM information_schema.tables
information_schema là một bảng quan trọng trong bất kỳ Cơ sở dữ liệu SQL nào. Nó chứa tất cả tên bảng, cột và những thứ thú vị khác.
Vì vậy, chúng ta yêu cầu nó cung cấp cho chúng ta tất cả các bảng có thể được lưu trữ trong DB để chúng ta có thể tự tay chọn những bảng phù hợp nhất.
Việc tích hợp truy vấn select ở trên vào câu lệnh UNION SELECT sẽ mang lại:
Truy vấn được đưa vào sẽ tìm thấy nhiều bảng. Thông thường, bạn sẽ chọn trường Search trong phản hồi của Burp để tìm các từ khóa như admin, users, credentials, passwords…
Từ khoá đầu tiên là Administrable_role_authorizations do từ admin có trong nó. Hãy xem tên các cột trong bảng này là gì.
Không có gì nổi bật… Vì vậy, chúng ta hãy bỏ qua bảng này.
Bảng tiếp theo là users_spkopw do có từ users trong đó.
Truy vấn tên cột.
Tốt hơn rồi nè. Hãy xuất nội dung của các cột trong bảng này. Lần này, chúng ta sẽ xuất ra phản hồi trong cả hai cột UNION.
Có một số thông tin đăng nhập, nhưng quản trị viên là những gì chúng ta cần. Bây giờ hãy truy cập trang login và sử dụng chúng.
Vậy là thành công rồi đó.