Luận văn Chống tấn công sql injection sử dụng các khuôn mẫu tổng quát

CHƯƠNG 1 TỔNG QUAN VỀ TẤN CÔNG TIÊM NHIỄM SQL. 12

1.1. Khái niệm tấn công tiêm nhiễm SQL . 12

1.2. Phân loại tấn công tiêm nhiễm SQL. 13

1.2.1. Order Wise. . 14

1.2.2. Blind SQL Injection . 15

1.2.3. Against Database. 16

1.3. Các phương pháp ngăn chặn tấn công tiêm nhiễm SQL . 18

1.4. Kết chương . 21

CHƯƠNG 2: MỘT SỐ PHƯƠNG PHÁP CHỐNG TẤN CÔNG TIÊM NHIỄM

SQL SỬ DỤNG KHUÔN MẪU TỔNG QUÁT. 23

2.1. Phương pháp chống tấn công tiêm nhiễm SQL sử dụng các khuôn mẫu

hợp lệ theo bối cảnh, SDriver . 23

2.1.1. Kiến trúc của SDriver . 23

2.1.2. Cách thức hoạt động của SDriver . 24

2.1.3. Stack trace . 26

2.2. SDriver cải tiến của luận văn Thạc sỹ Nguyễn Thanh Liêm. 30

2.2.1. Những lỗ hổng trong SDriver . 30

2.2.2. SDriver cải tiến của luận văn Nguyễn Thanh Liêm. 34

2.3. Kết chương . 35

CHƯƠNG 3: ĐỀ XUẤT CỦA CHÚNG TÔI. 37

3.1. Phân tích hoạt động của SDriver cải tiến. 37

3.2. Giải thuật đề xuất. 38

3.2.1. Cơ chế hoạt động mới. 39

3.2.2. Triển khai giải thuật đề xuất . 41

3.3. Mô phỏng thực nghiệm giải thuật đề xuất . 42

3.4. Đánh giá hoạt động giải thuật đề xuất . 48

3.4.1. Đánh giá về chi phí. 48

3.4.2. Đánh giá về độ chính xác . 49

3.4.3. Một số hạn chế . 51

pdf55 trang | Chia sẻ: honganh20 | Ngày: 03/03/2022 | Lượt xem: 346 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Luận văn Chống tấn công sql injection sử dụng các khuôn mẫu tổng quát, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
quan sát cẩn thận hành vi thay đổi của trang web, kẻ tấn công có thể ngoại suy không chỉ các tham số dễ bị tổn thương mà còn có thêm thông tin về các giá trị trong cơ sở dữ liệu. Các nhà nghiên cứu đã báo cáo rằng với những kỹ thuật này, họ đã có thể đạt được tốc độ trích xuất dữ liệu là 1B / s. Xem xét hai chuỗi tiêm nhiễm có thể thêm vào trường đăng nhập. Đầu tiên là “admin’ and 1 = 0 --” và “admin’ and 1 = 1 --". Điều này dẫn đến hai truy vấn sau: “SELECT * FROM user_account WHERE user_name = ’admin’ and 1=0 -- ' AND password = ’abc123’;” “SELECT * FROM user_account WHERE user_name = ’admin’ and 1=1 -- ' AND password = ’abc123’;” Trong trường hợp đầu tiên, ứng dụng được bảo mật và đầu vào để đăng nhập được xác thực chính xác. Cả hai truy vấn sẽ trả về thông báo lỗi đăng nhập và kẻ tấn công sẽ biết rằng tham số đăng nhập không dễ bị tấn công. Trong kịch bản thứ hai, ứng dụng không an toàn và tham số đăng nhập dễ bị tiêm nhiễm. Kẻ tấn công gửi chuỗi tiêm nhiễm đầu tiên và nhận được thông báo lỗi đăng nhập, vì nó luôn bị đánh giá là sai. Tuy nhiên, kẻ tấn công không biết liệu đây có phải là do ứng dụng xác thực đầu vào chính xác và ngăn chặn tấn công hay do chính cuộc tấn công gây ra lỗi đăng nhập. Kẻ tấn công sau đó gửi truy vấn thứ hai, kèm mệnh đề luôn đúng. Nếu trong trường hợp này không 18 có thông báo lỗi đăng nhập, thì kẻ tấn công biết rằng cuộc tấn công đã đi qua và tham số đăng nhập dễ bị tiêm nhiễm. Truy vấn Union: Với kỹ thuật này, kẻ tấn công lợi dụng lỗ hổng tham số để thay đổi bộ dữ liệu trả về cho một câu truy vấn. Với câu truy vấn hợp lệ bên trên, kẻ tấn công có thể tiêm nhiễm vào trường login là “’ UNION SELECT bankNumber FROM Bank WHERE ID =101--”. Lúc này câu truy vấn sẽ trở thành: “SELECT * FROM user_account WHERE user_name = ’’ UNION SELECT bankNumber FROM Bank WHERE ID = 101 - -' AND password = ’’;” Với câu truy vấn đã bị thay đổi trên, CSDL dù không tìm thấy bản ghi login nào phù hợp với “user_name = ’’”nhưng vẫn sẽ tìm thấy bản ghi bankNumber phù hợp với “ID = 101”. CSDL sẽ tiến hành hợp 2 bộ kết quả, và bankNumber vẫn sẽ được trả về cho ứng dụng. Truy vấn Piggy-Backed: Kỹ thuật tấn công này dựa vào máy chủ CSDL được cấu hình để thực thi nhiều câu truy vấn khác nhau trên cùng 1 dòng mã và được ngăn cách bởi dấu “;”. Kẻ tấn công sẽ chèn thêm các câu truy vấn trái phép vào câu truy vấn ban đầu với mục đích trích xuất dữ liệu, thay đổi dữ liệu, thực hiện từ chối dịch vụ hay thực thi lệnh từ xa. Ví dụ, kẻ tấn công có thể nhập mã độc “’; SHUTDOWN --” vào trường user_name. Câu truy vấn lúc này sẽ là “SELECT * FROM user_account WHERE user_name = ’’; SHUTDOWN -- ‘; AND password =’’;” Khi thực thi câu truy vấn trên, CSDL sẽ thực thi luôn câu lệnh “SHUTDOWN”, CSDL sẽ bị tắt, một loạt các truy vấn hợp lệ sau đó sẽ không kết nối được. 1.3. Các phương pháp ngăn chặn tấn công tiêm nhiễm SQL Các nhà nghiên cứu đã đề xuất ra rất nhiều các biện pháp phòng chống và ngăn chặn tấn công tiêm nhiễm SQL. Các biện pháp được thực thi ở các mức khác nhau từ ứng dụng web, trung gian đến CSDL. Các biện pháp ngăn chặn tấn công tiêm nhiễm SQL có thể kể đến như sau: Tham số hóa truy vấn: Sử dụng tham số hóa truy vấn là một trong những cách tốt nhất để ngăn chặn việc tiêm nhiễm SQL. Nó cũng đơn giản để viết và 19 dễ hiểu hơn các truy vấn SQL động. Phương pháp này nhắm tới việc ngăn chặn tấn công tiêm nhiễm SQL bằng cách cho phép nhà phát triển có thể xác định chính xác cấu trúc của câu truy vấn và truyền các tham số giá trị một cách tách biệt. Nếu người dung nhập “12345’ or 1=1 --“ vào trường user_name thì truy vấn tham số hóa sẽ tìm kiếm trong CSDL để khớp với toàn chuỗi “12345’ or 1=1 -- “. Điều đó sẽ ngăn ngừa cấu trúc câu truy vấn bị thay đổi bởi bất kỳ đầu vào nào. Sau đây là một số ngôn ngữ lập trình có áp dụng kỹ thuật này:  Java EE - sử dụng PreparedStatement () với các biến liên kết.  .NET - sử dụng các truy vấn được tham số hóa như SqlCommand () hoặc OleDbCommand () với các biến liên kết  PHP - sử dụng PDO với các truy vấn được tham số hóa mạnh mẽ.  Hibernate - sử dụng createQuery () với các biến liên kết (được gọi là tham số có tên trong Hibernate)  SQLite - sử dụng sqlite3_prepare () để tạo đối tượng câu lệnh Ví dụ trong PHP. $stmt = $dbh->prepare('SELECT * FROM customers WHERE ssn = :ssn'); $stmt-> bindParam(':ssn' => $ssn); Sử dụng các thủ tục lưu trữ: Các thủ tục được lưu trữ sẽ thêm một lớp bảo mật bổ sung vào CSDL bên cạnh sử dụng truy vấn tham số. Nó thực hiện giúp cho ứng dụng xử lý dữ liệu đầu vào dưới dạng thủ tục được xây dựng từ trước thay vì thực thi câu lệnh SQL trực tiếp. Các thủ tục được viết và lưu trữ trong máy chủ CSDL, sau đó được gọi từ ứng dụng web. Nếu người dùng truy cập vào CSDL chỉ được phép thông qua các thủ tục được lưu trữ thì không cần thiết phải phân quyền người dùng trên các bảng dữ liệu. Bằng cách này, tính an toàn của CSDL được nâng cao. Xác thực dữ liệu đầu vào của người dùng: Ngay cả khi sử dụng tham số trong truy vấn được áp dụng, việc thực hiện xác thực đầu vào là cần thiết để đảm bảo các thuộc tính dữ liệu phù hợp như kiểu/ loại, độ dài, định dạng,... Chỉ xử lý dữ liệu đầu vào đã qua xác thực cho CSDL. 20 Với những kiểm soát đơn giản như kiểm soát về kiểu dữ liệu cũng có thể hạn chế đáng kể các cuộc tấn công. Ví dụ, trường bankNumber được khai báo ở kiểu số. Khi nhận dữ liệu đầu vào, các ký tự không phải là số sẽ bị loại bỏ. Mã hóa dữ liệu đầu vào: Tấn công tiêm nhiễm SQL thường lợi dụng đưa các chuỗi ký tự đặc biệt hay các chuỗi được sử dụng trong ngữ pháp SQL như OR, AND, UNION, để tiêm nhiễm, đánh lừa CSDL. Trong thực tế, giải pháp hạn chế nhập những ký tự đặc biệt đã được áp dụng nhưng nó lại đi kèm với hạn chế làm giảm đi tính an toàn ở khía cạnh dữ liệu dễ bị suy đoán, dễ bị tiết lộ. Vì vậy mà ngoài kết hợp với tham số hóa truy vấn, chuỗi dữ liệu đầu vào có thể được tiến hành mã hóa thay cho dạng plain text thông thường. Việc mã hóa dữ liệu vừa hữu ích trong chống tấn công tiêm nhiễm SQL lại vừa có giá trị trong việc bảo mật thông tin. Ẩn thông tin của các thông báo: Thông báo lỗi rất hữu ích cho những kẻ tấn công tìm hiểu thêm về kiến trúc CSDL. Trong trường hợp tấn công suy đoán, kẻ tấn công có thể lợi dụng các thông báo lỗi để hoàn thiện kiến thức, phương án tấn công. Vì vậy thông báo lỗi nên chỉ hiển thị các thông tin cần thiết. Tốt hơn hết là hiển thị thông báo lỗi chung cho biết có lỗi xảy ra và khuyến khích người dùng liên hệ với nhóm hỗ trợ kỹ thuật trong trường hợp sự cố vẫn còn. Hạn chế đặc quyền: không kết nối với cơ sở dữ liệu của bằng tài khoản có quyền truy cập root trừ khi được yêu cầu vì những kẻ tấn công có thể có quyền truy cập vào toàn bộ hệ thống. Do đó, tốt nhất là sử dụng một tài khoản có các đặc quyền hạn chế để giới hạn phạm vi thiệt hại trong trường hợp bị tấn công tiêm nhiễm SQL. Ngoài ra, xác định người dùng khác nhau với các đặc quyền khác nhau và sử dụng trong quá trình phát triển có thể thực sự hữu ích trong việc giảm thiểu rủi ro của cuộc tấn công tiêm nhiễm SQL. Trên đây là một số phương pháp có thể được thực hiện ngay để giảm nguy cơ bị tấn công tiêm nhiễm SQL. Tuy nhiên những phương pháp này lại phụ thuộc nhiều vào quá trình thiết kế, phát triển ứng dụng web cũng như CSDL. Bên cạnh đó, có thêm các giải pháp hỗ trợ với mục đích phát hiện và ngăn chặn tấn công tiêm nhiễm SQL như: Phát hiện và ngăn chặn dựa trên chữ ký “signature”: Phương pháp này tập trung xây dựng tập các mẫu tấn công tiêm nhiễm SQL có thể có. Quá trình xây dựng đòi hỏi phải cập nhật thường xuyên các mẫu tấn công. Phương pháp hoạt động tương tự như các chương trình anti – virus. Khi có một truy vấn bất 21 kỳ đến CSDL, nó sẽ được so sánh với các mẫu tấn công. Nếu khớp mẫu tấn công, truy vấn sẽ bị chặn lại. Phát hiện và ngăn chặn trên bất thường: Ngược lại với phương pháp phát hiện và ngăn chặn dựa trên chữ ký, phương pháp này xây dựng tập các mẫu hợp lệ. Bất kỳ một truy vấn đến CSDL nằm ngoài tập mẫu này sẽ bị cho là tấn công và ngăn chặn lại. Phân tích mã: Phương pháp này sử dụng kiểm thử để phát hiện ra lỗ hổng của ứng dụng. Bộ kiểm thử sẽ sinh ra một loạt các dạng tấn công tiêm nhiễm SQL nhằm kiểm tra phản hồi của ứng dụng web. Dựa vào kết quả trả về của bộ kiểm thử, nhà phát triển có thể xác định các lỗ hổng trên ứng dụng và tìm cách khắc phục các lỗ hổng này. Một số bộ kiểm thử thông dụng với tấn công tiêm nhiễm SQL như SQLMap, Acunetix, Burp suite, Netsparker, 1.4. Kết chương Chương 1 đã nêu lên một cách tổng về tấn công tiêm nhiễm SQL, các loại tấn công và một số phương pháp phát hiện, ngăn chặn. Tiêm nhiễm SQL (còn gọi là SQL Injection) không còn là khái niệm quá mới, nhưng nó vẫn là một trong những kiểu tấn công mạng khá phổ biến. Tấn công tiêm nhiễm SQL là một kỹ thuật tấn công vào hệ thống cơ sở dữ liệu của ứng dụng (web, mobile hoặc desktop ) thông qua việc kẻ tấn công lợi dụng lỗ hổng để tiến hành tiêm nhiễm mã độc vào câu truy vấn SQL và thi hành các câu lệnh SQL bất hợp pháp trên cơ sở dữ liệu đằng sau ứng dụng web. Tấn công tiêm nhiễm SQL vô cùng nguy hiểm vì kẻ tấn công không chỉ có thể ăn cắp được dữ liệu chứa thông tin nhạy cảm mà chúng còn có thể thay đổi dữ liệu, thậm chí là kiểm soát cả máy chủ mà CSDL đang chạy. Tấn công tiêm nhiễm SQL xảy ra trên các hệ quản trị CSDL quan hệ như MySQL, MS SQL, DB2, Oracle Tấn công tiêm nhiễm SQL có thể phân loại thành Order Wise, Blind SQL Injection và Against Database. Order Wise gồm: Tiêm nhiễm First Order, Tiêm nhiễm Second Order, Tiêm nhiễm Lateral. Blind SQL Injection gồm: Tấn công dựa vào nội dung phản hồi, Tấn công dựa vào độ trễ thời gian phản hồi. 22 Kỹ thuật thao tác SQL gồm có: tautologies, chú thích cuối dòng, suy luận, truy vấn Union, truy vấn Piggy-Backed. Một số phương pháp phát hiện, ngăn chặn tấn công tiêm nhiễm SQL: Tham số hóa truy vấn, Sử dụng các thủ tục lưu trữ, Xác thực dữ liệu đầu vào của người dùng, Ẩn thông tin của các thông báo lỗi, Hạn chế đặc quyền, Phát hiện và ngăn chặn dựa trên chữ ký “signature”, Phát hiện và ngăn chặn dựa trên bất thường, Phân tích mã. 23 CHƯƠNG 2: MỘT SỐ PHƯƠNG PHÁP CHỐNG TẤN CÔNG TIÊM NHIỄM SQL SỬ DỤNG KHUÔN MẪU TỔNG QUÁT 2.1. Phương pháp chống tấn công tiêm nhiễm SQL sử dụng các khuôn mẫu hợp lệ theo bối cảnh, SDriver 2.1.1. Kiến trúc của SDriver SDriver được đề xuất bởi Dr. Dimitris Mitropoulos và Prof. Diomidis Spinellis. Ý tưởng của kỹ thuật này là dựa vào kiến trúc điển hình của một ứng dụng web bao gồm ít nhất một ứng dụng đang chạy trên một máy chủ web và cơ sở dữ liệu ở phía sau. Giữa hai tầng này, có một trình điều khiển kết nối dựa trên các giao thức như ODBC (Open Database Connectivity) hoặc JDBC (Java Database Connectivity). Theo đề xuất của hai nhà khoa học, SDriver được thêm vào giữa ứng dụng web và trình điều khiển kết nối tới cơ sở dữ liệu. Tất cả mọi truy vấn từ ứng dụng web đều phải đi qua SDriver trước khi đến CSDL. Sau khi nhận được truy vấn, SDriver sẽ tiến hành so sánh với tập các mẫu hợp lệ được xây dựng từ trước. Nếu truy vấn đến phù hợp với tập dữ liệu, SDriver thực hiện kết nối đến CSDL. Nếu truy vấn đến nằm ngoài tập dữ liệu này, SDriver cảnh báo tấn công, ngăn chặn ngay lập tức. Hình 2.1 [2, tr.5] là mô tả kiến trúc đề xuất của SDriver. Hình 2.1 Kiến trúc đề xuất của SDriver [2, tr.5] Trong phần nghiên cứu của hai nhà khoa học, SDriver được triển khải trên nền tảng ngôn ngữ Java, tuy nhiên SDriver cũng có thể xây dựng trên những nền 24 tảng ngôn ngư khác. Mô hình triển khai SDriver sẽ giống như hình 2.2 [2, tr.8]. Một CSDL ssql sẽ được xây dựng để chứa tập các mẫu truy vấn hợp lệ. Hình 2.2 Kiến trúc thực tế của Sdriver [2, tr.8] SDriver là trong suốt và không phụ thuộc vào ứng dụng, CSDL hay trình điều khiển kết nối của ứng dụng. Bản thân SDriver cũng không phải là một trình điều khiển kết nối mà là trung gian giữa ứng dụng web và trình điều khiển kết nối. Một điểm đặc biệt là SDriver gắn các mẫu truy vấn hợp lệ với bối cảnh. Bối cảnh ở đây chính là Stack trace. 2.1.2. Cách thức hoạt động của SDriver SDriver có 2 chế độ hoạt động: chế độ huấn luyện (training mode) và chế độ thực thi (Production mode). Tập các khuôn mẫu hợp lệ sẽ được xây dựng trong chế độ huấn luyện. Do giả thuyết toàn bộ truy vấn trong chế độ này là hợp lệ nên cần thực hiện trong môi trường không trực tuyến. Chế độ huấn luyện Khuôn mẫu hợp lệ được xây dựng trên 3 thành phần.  Thông tin về stack trace của câu truy vấn.  Các từ khóa SQL.  Các bảng và các trường có trong câu truy vấn. 25 Sau khi kết hợp các đặc trưng trên của câu truy vấn sẽ thu được khuôn mẫu hợp lệ. Tập hợp khuôn mẫu hợp lệ sẽ có dạng sau: 𝑺 = { 𝝎 ∶ 𝝎 = (𝒌, 𝒂𝟏, 𝒂𝟐, ), 𝒌 ∈ 𝑲, 𝒂𝒊 ∈ (𝑳 ∪ 𝑴 ∪ 𝑵)} Trong đó, S là tập hợp khuôn mẫu hợp lệ,  là khuôn mẫu hợp lệ, K là tập hợp stack trace của câu truy vấn, L là tập hợp các từ khóa SQL tương ứng, M là tập hợp các bảng tương ứng và N là tập hợp các trường tương ứng. Hình 2.3 Chế độ huấn luyện của SDriver 26 Khi một câu truy vấn thực thi trong chế độ huấn luyện – “traning mode”, SDriver thực hiện một số việc như sau: - Rút gọn chuỗi truy vấn, loại bỏ dữ liệu, số, chuỗi đầu vào. - Thu thập thông tin StackTrace bằng cách lần ngược lại ngăn xếp được gọi cho đến khi tìm được vị trí câu truy vấn thực thi. - Kết hợp chuỗi truy vấn rút gọn, Stack trace thành khuôn mẫu hợp lệ. - Kiểm tra khuôn mẫu thu được trong bảng signatures của CSDL ssql. - Lưu khuôn mẫu thu được vào bảng signatures của CSDL ssql nếu khuôn mẫu chưa tồn tại trong đó. Ví dụ về rút gọn chuỗi truy vấn: “Select * from USER_ACCOUNT where USER_NAME = 'admin' and PASSWORD = 'abc123'” Câu rút gọn: Select * from USER_ACCOUNT where USER_NAME = and PASSWORD = Chế độ thực thi Trong chế độ thực thi, SDriver sẽ sử dụng các khuôn mẫu hợp lệ đã được lưu trữ trong CSDL ssql trong quá trình huấn luyện để xác định một câu truy vấn là hợp lệ hay không. Các bước thực hiện chế độ thực thi được mô tả như hình 2.4. Khác biệt duy nhất giữa hai chế độ là ở chế độ thực thi, nếu khuôn mẫu tổng hợp ra được không khớp với bất kỳ một mẫu nào trong ssql thì SDriver kết luận luôn là tấn công, ngăn chặn kết nối đến CSDL thay vì thêm khuôn mẫu vào ssql như ở chế độ huấn luyện. 2.1.3. Stack trace Trong đề xuất xây dựng khuôn mẫu của SDriver, ngoài mẫu chuỗi rút gọn truy vấn hợp lệ còn kèm thêm phần Stack trace – đóng vai trò là bối cảnh. Stack Trace tạo ra sự khác biệt giữa kỹ thuật này với các kỹ thuật chống tấn công tiêm nhiễm SQL sử dụng khuôn mẫu hợp lệ khác. Stack Trace là một danh sách các 27 lệnh gọi chương trình con mà ứng dụng thực hiện trong khi thực thi, bao gồm thông tin chi tiết về tất cả phương thức, vị trí gọi (vị trí dòng lệnh). Mỗi câu truy Hình 2.4 Chế độ thực thi của SDriver vấn sẽ có thông tin về Stack Trace là không giống nhau. Vì vậy sử dụng stack trace để tạo thành đặc trưng của chuỗi truy vấn sẽ tạo ra sự khác biệt nhất định trong việc phát hiện ngăn chặn tấn công. 28 Ví dụ về vai trò của Stack Trace Hình 2.5 Ví dụ vai trò của stack trace.[1,tr.25] Ví dụ trên có hai form nhập dữ liệu: Form đăng nhập với chuỗi truy vấn 1: “Select * from USER_ACCOUNT where USER_NAME = 'admin' and PASSWORD = 'abc123'” Form quản lý user với chuỗi truy vấn 2: “Select * from USER_ACCOUNT where USER_NAME = 'admin'” Sự khác nhau của hai truy vấn này là ở phần điều kiện “and PASSWORD = 'abc123'”. Với các kỹ thuật ngăn chặn tấn công tiêm nhiễm SQL sử dụng các khuôn mẫu hợp lệ không sử dụng Stack Trace, tập dữ liệu hợp lệ chỉ chứa các mẫu truy vấn hợp lệ ( các mẫu truy vấn hợp lệ có thể được xử lý thêm trước khi thêm vào CSDL tùy theo từng kỹ thuật khác nhau. Sự kiện đặt ra có một kẻ tấn công sử dụng chuỗi “ admin’ -- “ nhập vào trường USER_NAME. Chuỗi truy vấn số 1 trở thành như sau: “Select * from USER_ACCOUNT where USER_NAME = 'admin' –- ‘and PASSWORD = 'abc123'” Do trong ngữ pháp SQL, chuỗi đằng sau “–-“ được coi là thành phần chú thích và không được thực thi. Mặc nhiên, nó sẽ biến thành truy vấn hợp lệ tương tự như chuỗi số 2. Kẻ tấn công có thể đăng nhập mà ko cần dùng mật 29 khẩu. Trong SDriver, đây là hai câu truy vấn khác nhau nên Stack Trace của 2 chuỗi truy vấn là khác nhau. Mặc dù chuỗi truy vấn hợp lệ nhưng Stack Trace không đúng, SDriver cũng có thể phát hiện ra chuỗi tấn công và ngăn chặn kết nối đến CSDL sau ứng dụng. Ví dụ về Stack Trace: SStatement.java:654)org.SStatement.manageQuery(SStatement.java:58 2)org.SStatement.executeQuery(SStatement.java:545)simplewebapp.ut ils.DBUtils.findUser(DBUtils.java:42)simplewebapp.servlet.DoLogin Servlet.doGet(DoLoginServlet.java:53)simplewebapp.servlet.DoLogin Servlet.doPost(DoLoginServlet.java:108)javax.servlet.http.HttpSer vlet.service(HttpServlet.java:648)javax.servlet.http.HttpServlet. service(HttpServlet.java:729)org.apache.catalina.core.Application FilterChain.internalDoFilter(ApplicationFilterChain.java:292)org. apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF ilterChain.java:207)org.apache.tomcat.websocket.server.WsFilter.d oFilter(WsFilter.java:52)org.apache.catalina.core.ApplicationFilt erChain.internalDoFilter(ApplicationFilterChain.java:240)org.apac he.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilte rChain.java:207)simplewebapp.filter.JDBCFilter.doFilter(JDBCFilte r.java:96)org.apache.catalina.core.ApplicationFilterChain.interna lDoFilter(ApplicationFilterChain.java:240)org.apache.catalina.cor e.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207 )org.apache.catalina.core.StandardWrapperValve.invoke(StandardWra pperValve.java:212)org.apache.catalina.core.StandardContextValve. invoke(StandardContextValve.java:106)org.apache.catalina.authenti cator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)org.apa che.catalina.core.StandardHostValve.invoke(StandardHostValve.java :141)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorRepo rtValve.java:79)org.apache.catalina.valves.AbstractAccessLogValve .invoke(AbstractAccessLogValve.java:616)org.apache.catalina.core. StandardEngineValve.invoke(StandardEngineValve.java:88)org.apache .catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522) org.apache.coyote.http11.AbstractHttp11Processor.process(Abstract Http11Processor.java:1095)org.apache.coyote.AbstractProtocol$Abst ractConnectionHandler.process(AbstractProtocol.java:672)org.apach e.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.j ava:1500)org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.r un(NioEndpoint.java:1456)java.util.concurrent.ThreadPoolExecutor. runWorker(ThreadPoolExecutor.java:1149)java.util.concurrent.Threa dPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)org.apache.t omcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.jav a:61)java.lang.Thread.run(Thread.java:748 30 2.2. SDriver cải tiến của luận văn Thạc sỹ Nguyễn Thanh Liêm 2.2.1. Những lỗ hổng trong SDriver Luận văn của Nguyễn Thanh Liêm đã tiến hành phân tích cơ chế hoạt động của SDrive. Một khuôn mẫu của SDriver bao gồm có 2 phần là Stack Trace và chuỗi truy vấn rút gọn. Stack Trace rất khó, thậm chí có thể nói là không thể giả mạo. Vì vậy, nếu có trường hợp kẻ tấn công có thể vượt qua được SDriver thì chỉ có thể xảy ra vấn đề trong chuỗi truy vấn rút gọn hay nói cách khác, cách thức rút gọn truy vấn tiềm tàng lỗ hổng có thể khai thác được. Về cơ chế, SDriver sử dụng Regular Expression để tiến hành rút gọn chuỗi truy vấn, loại bỏ những phần được coi là không cần thiết . Định nghĩa Regular Expression trong SDriver. “//Initializing patterns trivia = Pattern.compile("\\+|-|\\."); escapeChar = Pattern.compile("\\'(?:.|[\\n\\r])*?\\'"); numbers = Pattern.compile("([,\\(]+\\s*)(?:[0-9A-Fa-f])+"); comments = Pattern.compile("/\\*(?:.|[\\n\\r])*?\\*/");” Các bước tiến hành xóa bỏ: 1. Xóa bỏ các ký tự được cho là thông thường: “+”, “-” và “.”. 2. Xóa bỏ các chữ số đằng sau các phép toán “”. 3. Xóa bỏ thành phần chú thích “/* */”. 4. Xóa bỏ chuỗi nhập liệu nằm giữa cặp dấu ngoặc đơn “'”. “public String strippedDownQuery(String sql){ Matcher tmpMatcher = this.trivia.matcher(sql); sql = tmpMatcher.replaceAll(""); tmpMatcher = this.numbers.matcher(sql); sql = tmpMatcher.replaceAll("$1"); tmpMatcher = this.comments.matcher(sql); sql = tmpMatcher.replaceAll(""); tmpMatcher = this.escapeChar.matcher(sql); 31 sql = tmpMatcher.replaceAll(""); System.out.println("SDriver: The stripped query: " +sql); return sql; }” Bước một và ba chủ yếu là loại bỏ các ký tự, chuỗi được cho là “thừa”, không phải là đặc trưng của câu truy vấn. Trong khi bước hai và bốn là loại bỏ các ký tự số, chuỗi nhập liệu của người dùng. Ví dụ: đầu vào là câu truy vấn “Select a.Code, a.Name, a.Price, a.Vendor from Product a where a.Vendor like '%HP%' and a.Price >=1000.0 and a.Price <=1500.0 /* Truy van Product HP */” Thì câu truy vấn rút bỏ dữ liệu sẽ là “SELECT aCode, aName, aPrice, aVendor from Product a WHERE where a.Vendor like and aPrice >=and aPrice <=” Lần ngược quá trình rút gọn một câu truy vấn của SDriver để tìm ra điểm yếu. Ví dụ với trường hợp truy vấn sử dụng đăng nhập cơ sở dữ liệu. Câu đã rút gọn cuối cùng: “Select * from USER_ACCOUNT where USER_NAME = and PASSWORD = ” Câu truy vấn ở bước 4 : “Select * from USER_ACCOUNT where USER_NAME = '?' and PASSWORD = '?' ” Câu truy vấn rút gọn ở bước 3: “Select * from USER_ACCOUNT where USER_NAME = '?'/* */ and PASSWORD = '/* */' ” Ở bước rút gọn số 3, SDriver tiến hành rút gọn chú thích. Trong câu truy vấn chú thích được phân tách bằng “/**/” và có thể đặt ở bất kỳ nơi nào trong câu. Ở vị trí đầu tiên, chú thích thật sự hoạt động đúng chức năng nhưng ở vị trí số 2. Cụm chú thích nằm trong cặp ngoặc đơn. Bản thân các dấu chú thích này 32 nếu nằm trong cặp ngoặc đơn thì chúng sẽ được giải mã như những ký tự thông thường chứ không phải là dấu chú thích. Vậy nên nếu lồng ghép dấu “/*” và “*/” vào các cặp ngoặc đơn, ví dụ như “’/*’ OR ‘*/’” thì chuỗi “OR” sẽ không được tính như một thành phần chú thích mà là một toán tử của SQL. Trong khi đó SDriver lại tiến hành xóa bỏ chuỗi chú thích trước khi xóa bỏ chuỗi dữ liệu trong cặp nháy đơn. Do vậy ở bước ba, SDriver có thể sẽ loại bỏ nhầm những chuỗi mã độc hại. Ở bước thứ bốn, SDriver chỉ chú tâm vào việc loại bỏ các chuỗi nằm trong cặp dấu ngoặc đơn mà không quan tâm đến việc có bao nhiêu chuỗi đã bị loại bỏ. Trong một số ví dụ, chuỗi truy vấn có đến 3 chuỗi trong cặp ngoặc đơn nhưng khi SDriver thực hiện rút gọn thì lại chỉ có 2 do 1 cặp ngoặc đơn nằm trong phần chú thích nên đã bị loại bỏ tại bước trước. Một số ví dụ kiểm chứng: Kỹ thuật tautologies: Nhập “/*admin' or 1=1 -- */” vào trường Username, Password bất kỳ. Kết quả kiểm tra tại SDriver như hình 2.6. SDriver: This is the query the application sent: Select * from USER_ACCOUNT where USER_NAME = '/*admin' or 1=1 -- */' and PASSWORD = 'dsdsd' SDriver: The stripped query: Select * from USER_ACCOUNT where USER_NAME = and PASSWORD = SDriver: NO NEED TO WORRY Hình 2.6 Ví dụ tấn công tautologies thành công 33 Kỹ thuật truy vấn Union: Nhập chuỗi “/*' union select * from USER_ACCOUNT -- */” vào Username, Password bất kỳ. Kết quả kiểm tra tại SDriver như hình 2.7. SDriver: This is the query the application sent: Select * from USER_ACCOUNT where USER_NAME = '/*' union select * from USER_ACCOUNT -- */' and PASSWORD = 'dsds' SDriver: The stripped query: Select * from USER_ACCOUNT where USER_NAME = and PASSWORD = SDriver: NO NEED TO WORRY Hình 2.7 Ví dụ tấn công UNION thành công Kỹ thuật truy vấn Piggy-Backed: Nhập chuỗi “admin” vào Username và chuỗi “/*'; shutdown -- */” vào Password. Kết quả kiểm tra tại SDriver như hình 2.8. SDriver: This is the query the application sent: Select * from USER_ACCOUNT where USER_NAME = 'admin' and PASSWORD = '/*'; shutdown -- */' SDriver: The stripped query: Select * from USER_ACCOUNT where USER_NAME = and PASSWORD = SDriver: NO NEED TO WORRY 34 Kẻ tấn công đã vượt qua được SDriver, tuy vậy lệnh “SHUTDOWN” sẽ không được thực thi là do phương thức gọi lệnh thực thi truy vấn trong trường hợp trên là excuteQuery, phương thức này chỉ truy vấn để lấy dữ liệu chứ không thực hiện bất kỳ thay đổi nào trên CSDL. Qua một số trường hợp trên, kẻ tấn công có thể lợi dùng lỗ hổng SDriver để thực hiện tấn công tiêm nhiễm SDriver, Hình 2.8 Ví dụ tấn công Piggy-Backed thành công 2.2.2. SDriver cải tiến của luận văn Nguyễn Thanh Liêm N

Các file đính kèm theo tài liệu này:

  • pdfluan_van_chong_tan_cong_sql_injection_su_dung_cac_khuon_mau.pdf
Tài liệu liên quan