Hôm nay chúng ta sẽ đi tiếp về chủ đề SQL Injection. Ở phần này chúng ta sẽ cùng nhau thảo luận về các phương thức khai thác lỗ hổng SQL Injection cùng với ví dụ từ các bài lab của Portswigger.
1. Thu thập dữ liệu ẩn
- Ta có ứng dụng web thương mai điện tử
- Khi click vào một thể loại như "Accessories", đường dẫn sẽ chuyển đổi thành định dạng
Ta thử thêm dấu ' parameter category và nhận được trang lỗi internal server error 500.
- Ta thử cân bằng câu query bằng payload
- Bây giờ ta dùng payload 'OR'1'='1 để thực hiện yêu cầu của bài lab là hiển thị các sản phẩm ẩn. ('1'='1' là biểu thức luôn đúng kết hợp với toán tử OR ta sẽ có câu truy vấn sẽ trả về tất cả các sản phẩm)
2. Làm sai lệch logic của ứng dụng
- Ứng dụng web có chức năng đăng nhập https://0a78007b0424fbb1834ff636005900c7.web-security-academy.net/login
- Ta thử nhập Username có dấu ' và Password bất kỳ để thử gây lỗi
- Sử dụng payload
- Vì đây là chức năng đăng nhập ứng dụng sẽ chỉ lấy kết quả đầu tiên (có thể nằm trong câu truy vấn
3. Thu thập dữ liệu từ những bảng khác trong cơ sở dữ liệu
- Quay lại bài lab đầu tiên, ngoài khả năng lấy những dữ liệu ẩn, ta còn có thể lấy được dữ liệu của những bảng khác trong cơ sở dữ liệu bằng cách sử dụng
- Để sử dụng câu
Ví dụ: Giả sử câu truy vấn sản phẩm là :
Thì câu UNION ta chèn vào cũng chọn ra 2 cột
hoặc lấy dữ liệu từ bảng users
- Để xác định được số lượng cột câu truy vấn SQL đang chọn ta có thể dùng payload ORDER BY [NUMBER] với số NUMBER tăng dần lên đến khi gây ra lỗi (Ta sử dụng lại bài lab trước và thử đến số NUMBER = 8 - Ta xác định được câu truy vấn có 8 cột)
- Ta thử thay payload bằng
* Chúng ta sử dụng NULL làm giá trị trả về từ truy vấn SELECT được chèn vào bởi vì các kiểu dữ liệu trong mỗi cột phải tương thích giữa truy vấn gốc và truy vấn được chèn. NULL có thể chuyển đổi sang mọi kiểu dữ liệu phổ biến, vì vậy nó tối đa hóa cơ hội payload sẽ thành công khi số lượng cột là chính xác.
- Mỗi hệ cơ sở dữ liệu sẽ có những view để truy vấn về cấu trúc của cơ sở dữ liệu như danh sách bảng, cột ... Trước hết ta cần xác định hệ cơ sở dữ liệu, ở lab này hệ cơ sở dữ liệu mà PostgreSQL.
- Sử dụng hàm current_database() để lấy tên cơ sở dữ liệu hiện tại.
- Lấy danh sách các bảng và các cột ở trong cơ sở dữ liệu
Sử dụng payload
Sử dụng payload
Bài viết cũng đã dài, mình tạm dừng ở đây, bài tiếp theo mình sẽ nói về khai thác double query và blind true false trong SQL Injection.
1. Thu thập dữ liệu ẩn
- Ta có ứng dụng web thương mai điện tử
https://0aea001a03dcba0f808f58060071006c.web-security-academy.net/
thể hiện các sản phẩm của nhiều thể loại
- Khi click vào một thể loại như "Accessories", đường dẫn sẽ chuyển đổi thành định dạng
https://0aea001a03dcba0f808f58060071006c.web-security-academy.net/filter?category=Accessories
Ta thử thêm dấu ' parameter category và nhận được trang lỗi internal server error 500.

- Ta thử cân bằng câu query bằng payload
'--
, ta sẽ nhận được trang trả về kết quả như trước
- Bây giờ ta dùng payload 'OR'1'='1 để thực hiện yêu cầu của bài lab là hiển thị các sản phẩm ẩn. ('1'='1' là biểu thức luôn đúng kết hợp với toán tử OR ta sẽ có câu truy vấn sẽ trả về tất cả các sản phẩm)

2. Làm sai lệch logic của ứng dụng
- Ứng dụng web có chức năng đăng nhập https://0a78007b0424fbb1834ff636005900c7.web-security-academy.net/login

- Ta thử nhập Username có dấu ' và Password bất kỳ để thử gây lỗi

- Sử dụng payload
'OR'1'='1'--
ở Username để bypass chức năng đăng nhập (Tương tự bài 1, 'OR'1'='1'
sẽ biến điều kiện WHERE username = '[value1]'
thành câu luôn đúng, tuy nhiên sau điều kiện WHERE username
ta còn điều kiện AND password= '[value2]'
ở đây ta dùng --
để comment lại điều kiện AND password = '[value2]'
ở sau làm thay đổi logic của câu truy vấn)

- Vì đây là chức năng đăng nhập ứng dụng sẽ chỉ lấy kết quả đầu tiên (có thể nằm trong câu truy vấn
SELECT TOP 1 WHERE username = '[value1]' and password='[value2]'
hoặc được lọc lại ở trên code xử lý của ứng dụng), nên ta sẽ đăng nhập vào tài khoản đầu tiên của ứng dụng (ở đây là tài khoản administrator)3. Thu thập dữ liệu từ những bảng khác trong cơ sở dữ liệu
- Quay lại bài lab đầu tiên, ngoài khả năng lấy những dữ liệu ẩn, ta còn có thể lấy được dữ liệu của những bảng khác trong cơ sở dữ liệu bằng cách sử dụng
UNION
trong SQL.- Để sử dụng câu
UNION
ta cần xác định câu SELECT
chọn bao nhiêu cột trong bảng (vì câu UNION SELECT
phải cùng số lượng cột).Ví dụ: Giả sử câu truy vấn sản phẩm là :
SQL:
SELECT name, description FROM products WHERE category = '[value]'
SQL:
SELECT name, description FROM products WHERE category = '[value]' UNION SELECT NULL,NULL --
SQL:
SELECT name, description FROM products WHERE category = '[value]' UNION SELECT username,password FROM users --

- Ta thử thay payload bằng
'UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL --
để xác nhận câu UNION thành công.* Chúng ta sử dụng NULL làm giá trị trả về từ truy vấn SELECT được chèn vào bởi vì các kiểu dữ liệu trong mỗi cột phải tương thích giữa truy vấn gốc và truy vấn được chèn. NULL có thể chuyển đổi sang mọi kiểu dữ liệu phổ biến, vì vậy nó tối đa hóa cơ hội payload sẽ thành công khi số lượng cột là chính xác.

- Mỗi hệ cơ sở dữ liệu sẽ có những view để truy vấn về cấu trúc của cơ sở dữ liệu như danh sách bảng, cột ... Trước hết ta cần xác định hệ cơ sở dữ liệu, ở lab này hệ cơ sở dữ liệu mà PostgreSQL.
Oracle |
Mã:
|
---|---|
Microsoft | SELECT @@version |
PostgreSQL | SELECT version() |
MySQL | SELECT @@version |

- Sử dụng hàm current_database() để lấy tên cơ sở dữ liệu hiện tại.

- Lấy danh sách các bảng và các cột ở trong cơ sở dữ liệu
Oracle |
Mã:
|
---|---|
Microsoft |
Mã:
|
PostgreSQL |
Mã:
|
MySQL |
Mã:
|
Sử dụng payload
UNION SELECT NULL,NULL,table_name,NULL,NULL,NULL,NULL,NULL FROM information_schema.tables WHERE table_schema = 'public'--
thêm filter table_schema='public' để giới hạn trong những bảng thuộc schema 'public' (*là schema măc định cho các bảng trong PostgreSQL)
Sử dụng payload
' UNION SELECT NULL,NULL,column_name,NULL,NULL,NULL,NULL,NULL FROM information_schema.columns WHERE table_name = 'products'--
để lấy ra danh sách các cột trong bảng 'products'
Bài viết cũng đã dài, mình tạm dừng ở đây, bài tiếp theo mình sẽ nói về khai thác double query và blind true false trong SQL Injection.
Bài viết liên quan
Được quan tâm
Bài viết mới