X RAW(16); C CLOB;
PL/SQL và Máy chủ ứng dụng Oracle
Thủ tục PL/SQL có thể được thực thi trên Web thông qua Máy chủ ứng dụng Oracle. Trên thực tế, đó là một trong những môi trường ứng dụng phổ biến hơn được sử dụng cho các ứng dụng web dựa trên Oracle. Khi sử dụng ứng dụng web dựa trên PL/SQL, về cơ bản máy chủ web đang hoạt động đơn giản như một máy chủ proxy. Nó nhận các yêu cầu từ các máy khách và chuyển các yêu cầu này đến máy chủ cơ sở dữ liệu phụ trợ để thực thi. Kết quả được chuyển trở lại máy chủ web, sau đó chuyển nó cho máy khách.
Ví dụ: giả sử có một cửa hàng sách sử dụng PL/SQL cho trang Thương mại điện tử của họ. Cửa hàng có thể tạo một số gói, một gói để duyệt sách và một gói khác để mua. Giả sử gói cho phép duyệt sách được gọi là BROWSE và nó xuất một số thủ tục như SEARCH_BY_AUTHOR, SEARCH_BY_TITLE, v.v. Để tìm kiếm sách của một tác giả nhất định, người dùng ứng dụng web sẽ yêu cầu trong trình duyệt web của 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 là trang web. /Pls chỉ ra rằng đây là một yêu cầu cho một ứng dụng PL/SQL. Một trình xử lý được xác định cho điều này trong các tệp cấu hình apache. /bookstore là DAD hoặc Bộ mô tả truy cập cơ sở dữ liệu. DAD này trỏ đến một vị trí của tệp cấu hình có chứa thông tin chi tiết về cách máy chủ web kết nối với máy chủ cơ sở dữ liệu. Thông tin này bao gồm những thứ như tên người dùng và mật khẩu mà máy chủ web sẽ xác thực. /browse là tên của gói và search_by_author là tên của thủ tục. Lưu ý rằng nếu người dùng web tình cờ biết tên của lược đồ chứa gói duyệt, giả sử SCOTT, họ có thể 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 sẽ gửi yêu cầu này đến máy chủ cơ sở dữ liệu. Máy chủ cơ sở dữ liệu thực thi thủ tục SEARCH_BY_AUTHOR chuyển Dickens làm đối số. Quy trình này truy vấn một bảng sách và gửi kết quả 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 các ứng dụng web. Bộ công cụ này chứa các gói như HTP, chứa các thủ tục để tạo văn bản HTML và HTF, chứa các hàm để tạo văn bản HTML. Ngoài ra còn có một nhóm các gói bắt đầu bằng OWA, chẳng hạn như OWA_COOKIE và OWA_UTIL. OWA_UTIL chứa một số thủ tục thú vị như CELLSPRINT. Điều này coi như là một đối số của một truy vấn chọn SQL và kết quả được trả lại cho máy khách.
Trong các phiên bản cũ hơn của Máy chủ ứng dụng Oracle, có thể thực hiện quy trình này: http://www.books.example.com/pls/bookstore/SYS.OWA_UTIL.CELLSPRINT?
Tôi đã báo cáo điều này và họ đã sửa nó. Một lúc sau, tôi quay lại và xem xét tính năng bảo vệ danh sách loại trừ này và vì tò mò, tôi đã kiểm tra tính mạnh mẽ của nó. Lần này, tôi đã chuyển từ %00 thành %FF thay thế Y của SYS và kiểm tra máy chủ web để tìm phản hồi 200 - tức là tôi có thể có lại quyền truy cập vào OWA_UTIL. Tôi thấy rằng% FF đã được máy chủ web dịch sang byte 0xFF (rõ ràng) và điều này đã được gửi đến máy chủ cơ sở dữ liệu. Tuy nhiên, điều thú vị là máy chủ cơ sở dữ liệu đã dịch 0xFF thành 0x59 - Y! Điều này cho phép tôi có quyền truy cập lại vào OWA_UTIL và cho phép tôi chạy các 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 này liên quan đến các bộ ký tự được sử dụng bởi máy chủ ứng dụng và máy chủ cơ sở dữ liệu. Để điều này hoạt động, cả hai phải sử dụng bộ ký tự WE8ISO8859P1 - một tình huống phổ biến. Tìm hiểu sâu hơn, tôi cũng thấy rằng nếu máy chủ web sử dụng bộ ký tự AMERICAN_AMERICA.WE8ISO8859P1 và máy chủ cơ sở dữ liệu sử dụng bộ ký tự ENGLISH_UNITEDKINGDOM.WE8MSWIN1252, thì %9F cũng được 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ó những sự kết hợp thú vị khác như vậy. Dù sao, tôi đã báo cáo điều này một cách hợp lệ cho Oracle và họ đã sửa nó vào tháng 8 năm 2004. Vào tháng 9, tôi đã báo cáo sự cố với quy trình PL/SQL có ảnh hưởng đến bảo mật nếu người ta có thể truy cập nó thông qua máy chủ ứng dụng, nhưng Oracle từ chối khắc phục. nó với lý do là vì "bản sửa lỗi" mới của họ cho các danh sách loại trừ, nên không thể có quyền truy cập vào quy trình. Điều này phần nào làm tôi khó chịu. Tôi đã tranh luận với họ và nói rằng tôi đã tìm thấy hai lỗi trong quá khứ trong danh sách loại trừ, và họ có thể hoàn toàn chắc chắn rằng không còn lỗi nào nữa không. Tốt hơn để sửa lỗi trong quy trình. Trên thực tế, tôi đã rất khó chịu, điều đó khiến tôi có một nguồn cảm hứng: bạn có thể đặt các số nhận dạng, chẳng hạn như SYS, trong dấu ngoặc kép - ví dụ:
EXEC “SYS”.DBMS_OUTPUT.PUT_LINE(‘Hello!’);
Tại sao không sử dụng dấu ngoặc kép khi gọi nó qua máy chủ ứng dụng. Theo quyền, điều này sẽ phá vỡ khớp mẫu. Chắc chắn nó đã làm. Xin lưu ý rằng chúng ta có một 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 bởi điều này; 10gAS lấy dữ liệu đầu vào của người dùng và chuyển tất cả các ký tự viết hoa thành chữ thường để “SYS” trở thành “sys”. Vì vậy, trong khi dấu ngoặc kép vẫn được thông qua, máy chủ cơ sở dữ liệu có thể tìm thấy lược đồ "sys". Khi trích dẫn các số nhận dạng, chúng cần phải được viết hoa). Vì vậy, Oracle hiện đang sửa lỗi này và rất may, lỗi trong quy trình.
Dù sao, quay lại PL/SQL và Máy chủ ứng dụng Oracle. Trước đó chúng ta đã thảo luận về gói DRILOAD trong lược đồ CTXSYS. Gói này có một thủ tục, cụ thể là VALIDATE_STMT, về cơ bản nhận một truy vấn do người dùng cung cấp và thực thi nó. Điều này có thể bị lạm dụng trên Web. Một điều cần lưu ý ở đây là nó dường như không hoạt động. Lý do là vì khi bạn gọi thủ tục VALIDATE_STMT, nếu bạn không chọn, thủ tục sẽ trả về
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 1
Điều này được gửi trở lại máy chủ web để máy chủ web trả về phản hồi không tìm thấy tệp 404. Mặc dù lỗi chỉ ra rằng không có câu lệnh nào được phân tích cú pháp, truy vấn vẫn được 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ả về 404. Yêu cầu http://www.books.example.com/pls/bookstore/ctxsys.driload.validate_stmt? sqlstmt=GRANT+EXECUTE+ON+WEBTEST+TO+PUBLIC
cũng trả về 404. Tuy nhiên, hiện đang yêu cầu
http://www.books.example.com/pls/bookstore/ctxsys.webtest trả về “hello”.
Điều gì đã xảy ra ở đây? Yêu cầu đầu tiên của chúng ta tạo ra một thủ tục có tên WEBTEST sử dụng HTP.PRINT để viết “hello”. Thủ tục này do CTXSYS tạo ra và sở hữu. Yêu cầu thứ hai cấp cho PUBLIC quyền thực thi trên quy trình WEBTEST. Cuối cùng chúng ta có thể gọi nó - yêu cầu cuối cùng. Từ đó phải thấy rõ điều này có thể nguy hiểm như thế nào.
Ở đây cần lưu ý rằng 99% các vấn đề được thảo luận trong phần này về PL/SQL có thể được thực hiện trên Web thông qua Máy chủ ứng dụng Oracle.
Tóm lược
Chương này mô tả cách tấn công Oracle và giới thiệu một số phương pháp mới. Trước khi xem xét cách bảo vệ máy chủ, chương tiếp theo sẽ xem xét cách kẻ tấn công di chuyển sâu hơn vào hệ điều hành và vào phần còn lại của mạng.