TẤN CÔNG SQL INJECTION TIMELINE BASED HIỆU QUẢ BẰNG CÁCH SỬ DỤNG CÁC HÀM VÀ CÁC TOÁN TỬ BIT CỦA MYSQL


TẤN CÔNG SQL INJECTION TIMELINE BASED HIỆU QUẢ BẰNG CÁCH SỬ DỤNG CÁC HÀM VÀ CÁC TOÁN TỬ BIT CỦA MYSQLTôi đã thực hiện một số thử nghiệm thâm nhập trong năm 2011 – 2012 đối với các ứng dụng PHP khác nhau được tích hợp với cơ sở dữ liệu MySQL vốn dễ bị tấn công bởi Time Based Blind SQL Injection. Do nhiều ràng buộc và giới hạn khác nhau, việc khai thác hơi phức tạp và tôi buộc phải điều tra một phương pháp cho phép tôi truy xuất dữ liệu với ít yêu cầu nhất có thể.


Tôi đã tình cờ đọc qua bài báo này minh họa việc sử dụng SQL injection bằng cách sử dụng các kỹ thuật chuyển bit: https://www.exploit-db.com/papers/17073/
Trong một bài tập CTF gần đây của Hack the Box (https://www.hackthebox.eu/) tôi thấy mình đang xem xét lại phương pháp này để khai thác một số SQL injection phức tạp.
Bài đăng trên blog này sẽ minh họa cách toán tử ‘right shift’ (>>) có thể được sử dụng để liệt kê các bit nhị phân của một giá trị được trả lại từ truy vấn SQL.
Lưu ý: Bạn có thể tìm thấy mô tả đầy đủ về các hàm bit và toán tử tại URL sauhttps://dev.mysql.com/doc/refman/5.7/en/bit-functions.html
Toán tử dịch chuyển phải sẽ dịch số bit của vị trí giá trị nhị phân là 1 sang phải, như được minh họa trong ví dụ bên dưới:
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Điều này có thể được sử dụng để liệt kê một ký tự của một chuỗi khi khai thác Blind SQL injection. Điều này đảm bảo rằng dữ liệu có thể được liệt kê bởi tối đa 8 yêu cầu cho mỗi ký tự nếu dữ liệu xuất hiện trong bảng ASCII đầy đủ.
Dữ liệu chúng tôi muốn trích xuất thông qua phương thức này là ký tự đầu tiên được trả lại cho truy vấn: select user()
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Bit đầu tiên:
Chúng ta bắt đầu bằng cách tìm giá trị của bit đầu tiên:
????????
Hai khả năng cho điều này:
0 (Giá trị thập phân: 0) // điều kiện TRUE
HOẶC
1 (Giá trị thập phân: 1) // điều kiện FALSE
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Truy vấn SQL dẫn đến thời gian trễ, do đó điều kiện là TRUE, dẫn đến bit đầu tiên là 0
0???????
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL

BIT THỨ HAI:

Bây giờ chúng ta cần tìm giá trị của bit thứ hai. Như trước đây, có hai khả năng cho điều này:
0(Giá trị thập phân: 0) // điều kiện TRUE
HOẶC
OR
01 (Giá trị thập phân: 1) // điều kiện FALSE
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Truy vấn SQL dẫn đến không có thời gian trễ, do đó điều kiện là FALSE, dẫn đến bit thứ hai là 1
01?????
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL

BIT THỨ BA:

Bây giờ chúng ta cần tìm giá trị của bit thứ ba. Như trước đây, có hai khả năng cho điều này:
010 (Giá trị thập phân: 2) // TRUE
OR
011 (Giá trị thập phân: 3) // FALSE
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Truy vấn SQL dẫn đến không có thời gian trễ, do đó điều kiện là FALSE, dẫn đến bit thứ ba là 1
011?????
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL

BIT THỨ TƯ:

Bây giờ chúng ta cần tìm giá trị của bit thứ tư. Như trước đây, có hai khả năng cho điều này:
0110 (Giá trị thập phân: 6) // TRUE
OR
0111 (Giá trị thập phân: 7) // FALSE
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Truy vấn SQL dẫn đến không có thời gian trễ, do đó điều kiện là FALSE, dẫn đến bit thứ tư là 1
0111????
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL

BIT THỨ NĂM:

Bây giờ chúng ta cần tìm giá trị của bit thứ năm. Như trước đây, có hai khả năng cho điều này:
01110 (Giá trị thập phân: 14) /// TRUE
OR
01111 (Giá trị thập phân: 15) // FALSE
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Truy vấn SQL dẫn đến thời gian trễ, do đó điều kiện là TRUE, dẫn đến bit thứ năm là 0
01110???
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Sixth Bit:
Bây giờ chúng ta cần tìm giá trị của bit thứ sáu. Như trước đây, có hai khả năng cho điều này:
011100 (Giá trị thập phân: 28) // TRUE
OR
011101 (Giá trị thập phân: 29) // FALSE
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Truy vấn SQL dẫn đến thời gian trễ, do đó điều kiện là TRUE, dẫn đến bit thứ sáu là 0
011100??
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL

BIT THỨ BẢY:

Bây giờ chúng ta cần tìm giá trị của bit thứ bảy. Như trước đây, có hai khả năng cho điều này:
0111000 (Giá trị thập phân: 56) // TRUE
OR
0111001 (Giá trị thập phân: 57) // FALSE
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Truy vấn SQL dẫn đến không có thời gian trễ, do đó điều kiện là FALSE, dẫn đến bit thứ bảy là 1
0111001?
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL

BIT THỨ TÁM:

Bây giờ chúng ta cần tìm giá trị của bit thứ tám và cuối cùng. Như trước đây, có hai khả năng cho điều này:
01110010 (Giá trị thập phân: 114) // TRUE
OR
01110011 (Giá trị thập phân: 115) // FALSE
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Truy vấn SQL dẫn đến thời gian trễ, do đó điều kiện là TRUE, dẫn đến 8 bit là 0
01110010
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Bây giờ chúng ta có thể kết luận rằng giá trị nhị phân cho ký tự đầu tiên được trả về bởi truy vấn: select user () là 01110010 dẫn đến giá trị thập phân 114. 114 là ký tự ‘r’ của bảng ASCII.
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Để chứng minh loại tấn công Blind SQL injection này, tôi đã suy ra cách liệt kê bit nhị phân đầu tiên và cuối cùng của ký tự đầu tiên được trả về bởi ‘select user()’ trên ứng dụng bWAPP: https://www.vulnhub.com/entry/bwapp-bee-box-v16,53/
1. Chuỗi SQLi trả về một điều kiện TRUE cho bit đầu tiên:
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
2. Chuỗi SQLi trả về một điều kiện FALSE cho bit đầu tiên:
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
3. Chuỗi SQLi trả về một điều kiện TRUE cho bit tám:
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL
Tấn công SQL Injection Timeline based hiệu quả bằng cách sử dụng các hàm và các toán tử bit của MySQL