Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 18 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
18
Dung lượng
2,93 MB
Nội dung
Học Viện Công Nghệ Bưu Chính Viễn Thông KHOA CÔNG NGHỆ THÔNG TIN 1 BÁO CÁO NGHIÊN CỨU Đề tài: Tìm hiểu về các dạng tấn công SQL Injection Xây dựng và demo các kịch bản tấn công SQL Injection cho phép vượt qua khâu đăng nhập, thêm, sửa, xóa và đánh cắp dữ liệu GVHD : T.S Hoàng Xuân Dậu Bộ môn : Cơ sở An toàn thông tin Số điện thoại : 0904534390 Lớp D19AT-02_Nhóm G01 Sinh viên : Nguyễn Lê Đức Anh - B19DCAT006 Sinh viên : Nguyễn Phương Anh - B19DCAT007 Sinh viên : Lê Chí Công - B19DCAT014 Sinh viên: Trần Hữu Cương - B19DCAT017 Sinh Viên: Bùi Kim Cường - B19DCAT018 Sinh Viên: Lã Mạnh Cường - B19DCAT019 Hà Nội - 2021 1 Giới thiệu tổng quan về tấn công tiêm nhiễm SQL injection Khái niệm về tấn công tiên nhiễm SQL injection 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 (CSDL) đằng sau ứng dụng Các dạng tấn công SQL injection thường gặp: - Tùy vào mức độ tinh vi, SQL Injection có thể cho phép kẻ tấn công: + Vượ + Vượt qua các khâu xác thực người dùng + Vượ + Chèn, xóa hoặc sửa đổi dữ liệu + Vượ + Đánh cắp các thông tin trong CSDL + Vượ + Chiếm quyền điều khiển hệ thống Phương pháp SQL Injection: + đưa vào thông qua đầu vào của người dùng + Chèn thông qua các trường cookie chứa các chuỗi tấn công + Chèn thông qua các biến máy chủ + Second-Order Injection nơi các câu lệnh ẩn sẽ được thực thi vào một thời điểm khác bởi một hàm khác Quy trình tấn công tiêm nhiễm: Bước 1: Kẻ tấn công dò quét lỗ hổng của ứng dụng web Khi phát hiện lỗ hổng, hắn tiến hành tiêm nhiễm chuỗi ký tự độc hại, gửi đến CSDL thông qua ứng dụng web Bước 2: Máy chủ web tiếp nhận truy vấn tiêm nhiễm và gửi nó đến máy chủ ứng dụng web (Application server) Bước 3: Tại máy chủ ứng dụng web, truy vấn tiêm nhiễm sẽ tiếp tục đượcchấp nhận do kẻ tấn công đã khai thác lỗ hổng của chính ứng dụng web Nó tiếp tục được gửi đến máy chủ CSDL (Database server) Bước 4: Tại máy chủ CSDL, truy vấn tiêm nhiễm được thực thi Dữ liệu chứa thông tin nhạy cảm của người dùng sẽ được trả về và hiển thị trên ứng dụng web Bước 5: Kẻ tấn công nhận được thông tin nhạy cảm Sau đó, kẻ tấn công tiếp tục thực hiện các tấn công tiêm nhiễm SQL khác Sau khi thực hiện tấn công tiêm nhiễm CSDL, kẻ tấn công đã thu thập được thông tin nhạy cảm của người dùng hợp lệ như User ID, Password,… Kẻ tấn công có thể sử dụng chính những thông tin này để thực hiện các cuộc tấn công khác như leo thang, chiếm quyền điều khiển máy chủ CSDL 2 Các điểm yếu, lỗ hổng và các dạng tấn công SQL injection 2.1 Các điểm yếu, lỗ hổng SQL injection Theo như kinh nghiệm của những người quản trị Website qua nhiều năm làm việc và tích lũy thì những phần sau đây là những phần dễ bị tấn công Các bộ phận dễ bị tấn công bao gồm: Form đăng nhập Form tìm kiếm Form nhận xét Bất kỳ trường nhập và lưu dữ liệu nào khác Các liên kết của trang web Có một quy tắc đơn giản để xác định các lỗ hổng SQL injection: Kích hoạt sự bất thường bằng cách gửi dữ liệu không mong muốn Quy tắc này ngụ ý rằng: Xác định tất cả các mục nhập dữ liệu trên ứng dụng Web Biết loại yêu cầu nào có thể gây ra sự bất thường Phát hiện sự bất thường trong phản hồi từ máy chủ Trước tiên,cần xem cách trình duyệt Web của bạn gửi yêu cầu đến Máy chủ web Các ứng dụng khác nhau hoạt động theo những cách khác nhau, nhưng các nguyên tắc cơ bản phải giống nhau, vì chúng đều là môi trường dựa trên Web Khi bạn xác định được tất cả dữ liệu được ứng dụng chấp nhận, bạn cần sửa đổi dữ liệu đó và phân tích phản hồi từ máy chủ Đôi khi phản hồi sẽ bao gồm lỗi SQL trực tiếp từ cơ sở dữ liệu và sẽ làm cho cuộc sống của bạn rất dễ dàng; tuy nhiên, những lần khác bạn sẽ cần duy trì sự tập trung và phát hiện những khác biệt tinh tế Có 2 nguyên nhân chính của lỗ hổng trong ứng dụng cho phép thực hiện tấn công chèn mã SQL là: Dữ liệu đầu vào từ người dùng hoặc từ các nguồn khác không được kiểm tra hoặc kiểm tra không kỹ lưỡng Sử dụng các câu lệnh SQL động trong ứng dụng, trong đó có thao tác nối dữ liệu người dùng với mã lệnh SQL gốc 2.1.1 Không kiểm tra ký tự thoát truy vấn Đây là dạng lỗi SQL injection xảy ra khi thiếu đoạn mã kiểm tra dữ liệu đầu vào trong câu truy vấn SQL Kết quả là người dùng cuối có thể thực hiện một số truy vấn không mong muốn đối với cơ sở dữ liệu của ứng dụng Dòng mã sau sẽ minh họa lỗi này statement ="SELECT * FROM users WHERE name = '"+userName +"';" Câu lệnh này được thiết kế để trả về các bản ghi tên người dùng cụ thể từ bảng những người dùng Tuy nhiên, nếu biến "userName" được nhập chính xác theo một cách nào đó bởi người dùng ác ý, nó có thể trở thành một câu truy vấn SQL với mục đích khác hẳn so với mong muốn của tác giả đoạn mã trên Ví dụ, ta nhập vào giá trị của biến userName như sau: a' or 't'='t Khiến câu truy vấn có thể được hiểu như sau: SELECT * FROM users WHERE name = a' OR 't'='t Nếu đoạn mã trên được sử dụng trong một thủ tục xác thực thì ví dụ trên có thể được sử dụng để bắt buộc lựa chọn một tên người dùng hợp lệ bởi 't'='t' luôn đúng Trong khi hầu hết các SQL server cho phép thực hiện nhiều truy vấn cùng lúc chỉ với một lần gọi, tuy nhiên một số SQL API như mysql_query của php lại không cho phép điều đó vì lý do bảo mật Điều này chỉ ngăn cản tin tặc tấn công bằng cách sử dụng các câu lệnh riêng rẽ mà không ngăn cản tin tặc thay đổi các từ trong cú pháp truy vấn Các giá trị của biến "userName" trong câu truy vấn dưới đây sẽ gây ra việc xoá những người dùng từ bảng người dùng cũng tương tự như việc xóa tất cả các dữ liệu được từ bảng dữ liệu (về bản chất là tiết lộ các thông tin của mọi người dùng), ví dụ này minh họa bằng một API cho phéo thực hiện nhiều truy vấn cùng lúc a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't Khiến câu truy vấn có thể được hiểu như sau: SELECT * FROM users WHERE name = 'a' OR 't' = 't' ; Nếu đoạn mã trên được sử dụng trong một thủ tục xác thực thì ví dụ trên có thể được sử dụng để bắt buộc lựa chọn một tên người dùng hợp lệ bởi 't'='t' luôn đúng Trong khi hầu hết các SQL server cho phép thực hiện nhiều truy vấn cùng lúc chỉ với một lần gọi, tuy nhiên một số SQL API như mysql_query của php lại không cho phép điều đó vì lý do bảo mật Điều này chỉ ngăn cản tin tặc tấn công bằng cách sử dụng các câu lệnh riêng rẽ mà không ngăn cản tin tặc thay đổi các từ trong cú pháp tru vấn Các giá trị của biến "userName" trong câu truy vấn dưới đây sẽ gây ra việc xoá những người dùng từ bảng người dùng cũng tương tự như việc xóa tất cả các dữ liệu được từ bảng dữ liệu (về bản chất là tiết lộ các thông tin của mọi người dùng), ví dụ này minh họa bằng một API cho phéo thực hiện nhiều truy vấn cùng lúc: a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't Điều này đưa tới cú pháp cuối cùng của câu truy vấn trên như sau: SELECT * FROM users WHERE name = 'a' ;DROP TABLE users; SELECT * FROM DATA WHERE 't' = 't' ; 2.1.2 Xử lý không đúng kiểu Lỗi SQL injection dạng này thường xảy ra do lập trình viên hay người dùng định nghĩa đầu vào dữ liệu không rõ ràng hoặc thiếu bước kiểm tra và lọc kiểu dữ liệu đầu vào.Điều này có thể xảy ra khi một trường số được sử dụng trong truy vấn SQL nhưng lập trình viên lại thiếu bước kiểm tra dữ liệu đầu vào để xác minh kiểu của dữ liệu mà người dùng nhập vào có phải là số hay không Ví dụ như sau: statement := "SELECT * FROM data WHERE id = " + a_variable + ";" Ta có thể nhận thấy một cách rõ ràng ý định của tác giả đoạn mã trên là nhập vào một số tương ứng với trường id - trường số Tuy nhiên, người dùng cuối, thay vì nhập vào một số, họ có thể nhập vào một chuỗi ký tự, và do vậy có thể trở thành một câu truy vấn SQL hoàn chỉnh mới mà bỏ qua ký tự thoát Ví dụ, ta thiết lập giá trị của biến a_variable là: 1;DROP TABLE users khi đó, nó sẽ thực hiện thao tác xóa người dùng có id tương ứng khỏi cơ sở dữ liệu, vì câu truy vấn hoàn chỉnh đã được hiểu là: SELECT * FROM DATA WHERE id = 1; DROP TABLE users; 2.1.3 Blind SQL injection SQL injection dạng này là dạng lỗi tồn tại ngay trong ứng dụng web nhưng hậu quả của chúng lại không hiển thị trực quan cho những kẻ tấn công Nó có thể gây ra sự sai khác khi hiển thị nội dung của một trang chứa lỗi bảo mật này, hậu quả của sự tấn công SQL injection dạng này khiến cho lập trình viên hay người dùng phải mất rất nhiều thời gian để phục hồi chính xác từng bit dữ liệu Những kẻ tấn công còn có thể sử dụng một số công cụ để dò tìm lỗi dạng này và tấn công với những thông tin đã được thiết lập sẵn 2.2 Các dạng tấn công SQL injection thường gặp Các cuộc tấn công nhắm tới lớp database của ứng dụng Web xét theo mục đích được chia làm hai nhánh chính: thứ nhất là nhắm tới dữ liệu chứa trong database thứ hai là nhắm tới chính bản thân database Trường hợp thứ nhất thường là kẻ tấn công nhắm tới các thông tin có giá trị như thông tin cá nhân, thông tin tài chính, … trường hợp thứ hai thì kẻ tấn công muốn biến database thành cửa ngõ để thâm nhập sâu hơn vào trong mạng lưới của tổ chức sở hữu ứng dụng Web đang bị tấn công Chúng ta sẽ xét một số phương pháp tấn công phục vụ hai mục đích này 2.2.1 Vượt qua các khâu xác thực người dùng Với dạng tấn công này, kẻ tấn công có thể dễ dàng vượt qua các trang đăng nhập nhờ vào lỗi khi dùng các câu lệnh SQL thao tác trên cơ sở dữ liệu của ứng dụng web Xét một ví dụ điển hình, thông thường để cho phép người dùng truy cập vào các trang web được bảo mật, hệ thống thường xây dựng trang đăng nhập để yêu cầu người dùng nhập thông tin về tên đăng nhập và mật khẩu Sau khi người dùng nhập thông tin vào, hệ thống sẽ kiểm tra tên đăng nhập và mật khẩu có hợp lệ hay không để quyết định cho phép hay từ chối thực hiện tiếp Xem xét một form đăng nhập (Log in) và đoạn mã xử lý xác thực người dùng lưu trong bảng cơ sở dữ liệu tbl_accounts(username, password) cho như sau: Nếu người dùng nhập 'admin' vào trường username và 'abc123' vào trường password của form, mã xử lý hoạt động đúng: Nếu tồn tại người dùng với username và password kể trên, hệ thống sẽ cho phép đăng nhập với thông báo đăng nhập thành công; Nếu không tồn tại người dùng với username và password đã cung cấp, hệ thống sẽ từ chối đăng nhập và trả lại thông báo lỗi Tuy nhiên, nếu người dùng nhập aaaa' OR 1=1 vào trường username và một chuỗi bất kỳ, chẳng hạn 'aaaa' vào trường password của form, mã xử lý hoạt động sai và chuỗi chứa câu truy vấn SQL trở thành: SELECT * FROM tbl_accounts WHERE username='aaaa' OR 1=1 ' AND password='aaaa' Câu truy vấn sẽ trả về mọi bản ghi trong bảng do thành phần OR 1=1 làm cho điều kiện trong mệnh đề WHERE trở lên luôn đúng và phần kiểm tra mật khẩu đã bị loại bỏ bởi ký hiệu ( ) Phần lệnh sau ký hiệu ( ) được coi là ghi chú và không được thực hiện Nếu trong bảng tbl_accounts có chứa ít nhất một bản ghi, kẻ tấn công sẽ luôn đăng nhập thành công vào hệ thống 2.2.2 Chèn, sửa đổi, hoặc xóa dữ liệu Xem xét một form tìm kiếm sản phẩm và đoạn mã xử lý tìm sản phẩm lưu trong bảng cơ sở dữ liệu tbl_products(product_id, product_name, product_desc, product_cost) cho như trên Nếu người dùng nhập chuỗi "Samsung Galaxy S4" vào trường keyword của form, mã xử lý hoạt động đúng: Nếu tìm thấy các sản phẩm có tên chứa từ khóa, hệ thống sẽ hiển thị danh sách các sản phẩm tìm thấy; Nếu không tìm thấy sản phẩm nào có tên chứa từ khóa, hệ thống thông báo không tìm thấy sản phẩm Tuy nhiên, nếu người dùng nhập chuỗi "Samsung Galaxy S4';DELETE FROM tbl_products; " vào trường keyword của form, mã xử lý sẽ hoạt động sai và chuỗi chứa câu truy vấn SQL trở thành: SELECT * FROM tbl_products WHERE keyword like '%Samsung Galaxy S4';DELETE FROM tbl_products; %' Chuỗi lệnh SQL mới gồm 2 lệnh SQL: câu lệnh SELECT tìm kiếm các sản phẩm có tên chứa từ khóa "Samsung Galaxy S4" trong bảng tbl_products và câu lệnh DELETE xóa tất cả các sản phẩm trong bảng tbl_products Sở dĩ kẻ tấn công có thể làm được điều này là do hệ quản trị cơ sở dữ liệu MS-SQL server nói riêng và hầu hết các hệ quản trị cơ sở dữ liệu nói chung cho phép thực hiện nhiều lệnh SQL theo lô và dùng dấu ; để ngăn cách các lệnh Ký hiệu dùng để hủy tác dụng của phần lệnh còn lại nếu có Bằng thủ thuật tương tự, kẻ tấn công có thể thay lệnh DELETE bằng lệnh UPDATE hoặc INSERT để chỉnh sửa, hoặc chèn thêm dữ liệu Chẳng hạn, kẻ tấn công chèn thêm lệnh UPDATE để cập nhật mật khẩu của người quản trị bằng cách nhập chuỗi sau làm từ khóa tìm kiếm (giả thiết bảng tbl_administrators chứa thông tin người quản trị): Galaxy S4';UPDATE tbl_administrators SET password=abc123 WHERE username = 'admin'; Hoặc kẻ tấn công có thể chèn thêm bản ghi vào bảng tbl_administrators bằng cách nhập chuỗi sau làm từ khóa tìm kiếm: Galaxy S4';INSERT INTO tbl_administrators (username, password) VALUES ('attacker', 'abc12345'); 2.2.3 Đánh cắp các thông tin trong cơ sở dữ liệu Lỗ hổng chèn mã SQL có thể giúp kẻ tấn công đánh cắp dữ liệu trong cơ sở dữ liệu thông qua một số bước như sau: o Tìm lỗ hổng chèn mã SQL và thăm dò các thông tin về hệ quản trị cơ sở dữ liệu: Nhập một số dữ liệu mẫu để kiểm tra một trang web có chứa lỗ hổng chèn mã SQL, như các dấu nháy đơn, dấu ,… Tìm phiên bản máy chủ cơ sở dữ liệu: nhập các câu lệnh lỗi và kiểm tra thông báo lỗi, hoặc sử dụng @@version (với MS-SQL Server), hoặc version() (với MySQL) trong câu lệnh ghép với UNION SELECT o Tìm thông tin về số lượng và kiểu dữ liệu các trường của câu truy vấn hiện tại của trang web Sử dụng mệnh đề ORDER BY Sử dụng UNION SELECT 1, 2, 3, … o Trích xuất thông tin về các bảng, các trường của cơ sở dữ liệu thông qua các bảng hệ thống (metadata) o Sử dụng lệnh UNION SELECT để ghép các thông tin định trích xuất vào câu truy vấn hiện tại của ứng dụng 2.2.4 Chiếm quyền điều khiển hệ thống máy chủ cơ sở dữ liệu Khả năng máy chủ cơ sở dữ liệu bị chiếm quyền điều khiển xảy ra khi trang web tồn tại đồng thời 2 lỗ hổng: Lỗ hổng cho phép tấn công chèn mã SQL Lỗ hổng thiết lập quyền truy nhập cơ sở dữ liệu – sử dụng người dùng có quyền quản trị để truy nhập và thao tác dữ liệu của website Khai thác 2 lỗ hổng này, kẻ tấn công có thể gọi thực hiện các lệnh hệ thống của máy chủ cơ sở dữ liệu cho phép can thiệp sâu vào cơ sở dữ liệu, hệ quản trị cơ sở dữ liệu và cả hệ điều hành nền Chẳng hạn, hệ quản trị cơ sở dữ liệu MS-SQL Server cung cấp thủ tục sp_send_dbmail cho phép gửi email từ máy chủ cơ sở dữ liệu và thủ tục xp_cmdshell cho phép chạy các lệnh và chương trình cài đặt trên hệ điều hành MS Windows Sau đây là một số ví dụ chạy các lệnh Microsoft Windows thông qua thủ tục xp_cmdshell: EXEC xp_cmdshell 'dir *.exe' : liệt kê nội dung thư mục hiện thời EXEC xp_cmdshell 'shutdown /s /t 00' : tắt máy chủ nền chạy hệ quản trị CSDL EXEC xp_cmdshell 'net stop W3SVC' : dừng hoạt động máy chủ web EXEC xp_cmdshell 'net stop MSSQLSERVER' : dừng hoạt động máy chủ CSDL Ngoài ra, kẻ tấn công có thể thực hiện các thao tác nguy hiểm đến cơ sở dữ liệu nếu có quyền của người quản trị cơ sở dữ liệu hoặc quản trị hệ thống, như: Xóa cả bảng (gồm cả cấu trúc): DROP TABLE Xóa cả cơ sở dữ liệu: DROP DATABASE Tạo 1 tài khoản mới truy nhập CSDL: sp_addlogin Đổi mật khẩu tài khoản truy nhập CSDL: sp_password 2.3 Xây dựng demo 2.3.1 Demo tấn công vượt qua kiểm tra đăng nhập Sử dụng String SQL Injection để bỏ qua xác thực Sử dụng SQL injection để đăng nhập với tư cách là admin ('Neville') mà không cần sử dụng mật khẩu chính xác Xác minh rằng hồ sơ của Neville có thể được xem và tất cả các chức năng đều có sẵn (bao gồm Tìm kiếm, Tạo và Xóa) String SQL : 'select user from employees where employee_id=' + input.employee_id + 'and password=' + input.password ' Input.pasword = X'OR'1'='1 Đăng nhập thành công 2.3.2 Demo tấn công sử dụng câu lệnh INSERT Biểu mẫu dưới đây cho phép người dùng xem tiền lương được liên kết với một USERID (từ bảng có tên là SALARY) Sử dụng SQL Injection để thêm USERID và SALARY String SQL : jsmith';insert into salaries (userid, salary) values ('PHUONGANH', '100000') 'or salary is not null; (KIỂM TRA KẾT QUẢ) INSERT thành công 2.3.3 Demo tấn công sử dụng câu lệnh UPDATE Biểu mẫu dưới đây cho phép người dùng xem tiền lương được liên kết với một userid (từ bảng có tên là tiền lương) Biểu mẫu này dễ bị tấn công bởi String SQL Injection Sử dụng SQL Injection để sửa đổi mức lương cho userid jsmith String SQL : jsmith';update salaries set salary=9001 where userid='jsmith' Update thành công từ 20000 -> 9001 2.3.4 Demo xóa dữ liệu Cài đặt ứng dụng web thực hành khai thác lỗ hổng OWASP WebGoat: Chọn bài thực hành thay đổi dữ liệu Injection Flaws -> Modify Data with SQL Injection: Mã SQL của biểu mẫu nhập userid: SELECT * FROM salaries WHERE USERID = ‘string input’ Nhập vào chuỗi: jsmith';DROP TABLE salaries; SQL query trở thành: SELECT * FROM salaries WHERE USERID = ‘jsmith’;DROP TABLE salaries; ’ Table salaries đã bị xóa 2.3.5 Demo đánh cắp dữ liệu sử dụng chèn câu lệnh SELECT UNION vào URL -Trang web thử nghiệm: http://www.nhuaphucthinh.com.vn/ Truy cập vào một sản phẩm trên trang web: http://www.nhuaphucthinh.com.vn/product.php?id=20 Thêm kí tự ‘ để xem web xử lý truy vấn đã được thêm kí tự ra sao Web hiển thị lỗi query từ SQL, vậy trang web có lỗ hổng SQL Injection Để thực hiện lệnh UNION SELECT(Lệnh kết hợp nhiều lệnh SELECT, ta cần biết số cột của lệnh truy vấn trước vì câu lệnh SELECT sau cần có số cột đúng bằng câu lệnh trước Sử dụng extension Hackbar trên chrome do trên url kí tự khoảng trống “ ” không được dùng, thay vào đó là cụm mã hóa %20 Nhập vào extension url http://www.nhuaphucthinh.com.vn/product.php?id=20 order by 10 và chọn execute để kiểm tra số cột