MỤC LỤC3 MỞ ĐẦU4 CHƯƠNG 1 : GIỚI THIỆU CHUNG VỀ SQL INJECTION5 1.1 Khái niệm SQL Injection:5 1.2 Quy trình tấn cống6 1.3 Các dạng lỗi thường gặp:6 1.3.1 Không kiểm tra ký tự thoát truy vấn6 1.3.2 Xử lý không dúng kiểu7 1.3.3 Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu8 1.3.4 Blind SQL Injection8 CHƯƠNG 2 : MỘT SỐ DẠNG TẤN CÔNG THƯỜNG GẶP VỚI CÁC ỨNG DỤNG WEB10 2.1 Dạng tấn công vượt qua kiểm tra lúc đăng nhập10 2.2 Dạng tấn công sử dụng câu lệnh SELECT12 2.3 Dạng tấn công sử dụng câu lệnh INSERT13 2.4 Dạng tấn công sử dụng Strored-Procedures14 CHƯƠNG 3 : MÔ PHỎNG TẤN CÔNG SQL INJECTION VÀO WEBSERVER14 3.1 Một số công cụ rò tìm, tấn công lỗ hổng SQL Injection14 CHƯƠNG 4 : HẬU QUẢ CỦA SQL INJECTION VÀ CÁCH PHÒNG CHỐNG SQL26 4.1 Hậu quả:26 4.2 Cách phòng chống:26 KẾT LUẬN29
TRƯỜNG ĐẠI HỌC MỎ - ĐỊA CHẤT KHOA CÔNG NGHỆ THÔNG TIN BÀI TẬP LỚN MÔN HỌC AN NINH MẠNG ĐỀ TÀI TRIỂN KHAI MÔ PHỎNG TẤN CÔNG SQL INJECTION VÀO WEB SERVER HÀ NỘI 2020 TRƯỜNG ĐẠI HỌC MỎ -ĐỊA CHẤT KHOA CÔNG NGHỆ THÔNG TIN BÀI TẬP LỚN MÔN HỌC AN NINH MẠNG ĐỀ TÀI TRIỂN KHAI MÔ PHỎNG TẤN CÔNG SQL INJECTION VÀO WEB SERVER SINH VIÊN THỰC HIỆN Lê Thế Quý 1721050540 Hoàng Hải Hà 1721050311 Hoàng Thị Hồng Gấm 1621050275 HÀ NỘI 2020 Giảng Viên hướng dẫn: Đỗ Như Hải HÀ NỘI 2020 Bài Tập Lớn An Ninh Mạng MỤC LỤC MỤC LỤC MỞ ĐẦU CHƯƠNG : GIỚI THIỆU CHUNG VỀ SQL INJECTION 1.1 Khái niệm SQL Injection: .5 1.2 Quy trình cống 1.3 Các dạng lỗi thường gặp: 1.3.1 Không kiểm tra ký tự thoát truy vấn 1.3.2 Xử lý không dúng kiểu 1.3.3 Lỗi bảo mật bên máy chủ sở liệu 1.3.4 Blind SQL Injection .8 CHƯƠNG : MỘT SỐ DẠNG TẤN CÔNG THƯỜNG GẶP VỚI CÁC ỨNG DỤNG WEB 10 2.1 Dạng công vượt qua kiểm tra lúc đăng nhập 10 2.2 Dạng công sử dụng câu lệnh SELECT 12 2.3 Dạng công sử dụng câu lệnh INSERT 13 2.4 Dạng công sử dụng Strored-Procedures 14 CHƯƠNG : MÔ PHỎNG TẤN CÔNG SQL INJECTION VÀO WEBSERVER 14 3.1 Một số cơng cụ rị tìm, công lỗ hổng SQL Injection 14 CHƯƠNG : HẬU QUẢ CỦA SQL INJECTION VÀ CÁCH PHÒNG CHỐNG SQL 26 4.1 Hậu quả: 26 4.2 Cách phòng chống: 26 KẾT LUẬN 29 Bài Tập Lớn An Ninh Mạng MỞ ĐẦU Giới thiệu chung Tại SQL Injection lại “thần thánh”? Những lý sau tạo nên tên tuổi lừng lẫy SQL Injection: Cực kỳ nguy hiểm – Có thể gây thiệt hại khổng lồ Với SQL Injection, hacker truy cập phần toàn liệu hệ thống Rất phổ biến dễ thực – Lỗ hổng tiếng, từ developer đến hacker gần biết Ngồi ra, cịn có số tool công SQL Injection cho dân “ngoại đạo”, người khơng biết lập trình Rất nhiều ơng lớn bị dính – Sony, Microsoft UK Mọi vụ lùm xùm liên quan tới “lộ liệu người dùng” nhiều dính dáng tới SQL Injection Dễ công, phổ biến, gây hậu nghiêm trọng, lý dó Inject (Khơng SQL mà OS LDAP) nằm chễm chễ vị trí đầu bảng top 10 lỗ hỗng bảo mật OWASP Vậy SQL Injection thực “Thần thánh” nào? Bài báo cáo này, nhóm 01 nói rõ đặc điểm trội Bài Tập Lớn An Ninh Mạng CHƯƠNG : GIỚI THIỆU CHUNG VỀ SQL INJECTION 1.1 Khái niệm SQL Injection: SQL (Structured Query Language) sử dụng để truy vấn, thao tác liệu Database SQL Injection kỹ thuật công vào câu lệnh sở liệu thông qua chèn đoạn mã độc vào SQL để đánh lạc hướng xử lý với mục đích phá hủy liệu ăn cắp SQL injection cho phép kẻ công thực thao tác, delete, insert, update… 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… MsAccess: thường dành cho website tin tức quy mô nhỏ, sử dụng ngôn ngữ ASP để thiết kế MSSQL: dùng cho website có quy mơ lớn, sử dụng ngơn ngữ ASP, ASPX (ASP.Net) để thiết kế MySQL: tất website dùng, sử dụng ngơn ngữ PHP để thiết kế (MySQL PHP anh em song sinh, chúng kèm với ) Oracle: tương tự MySQL Db2: dùng cho hệ thông website ngân hàng hệ thống cần chế độ bảo mật cao! Công cụ dùng để công trình duyệt web bất kì, chẳng hạn Internet Explorer, Netscape, Lynx, 1.2 Quy trình cống Hacker tìm form lỗ hổng qua URL website Hacker chèn lệnh SQL vào lỗ hổng Bài Tập Lớn An Ninh Mạng Hacker lấy thông tin mong muốn, ví dụ thơng tin đăng thông tin User, thông tin đăng nhập SQL Hacker giải mã password admin, thay mật vào đăng nhập tài khoản Admi Thay đổi nội dung website, đánh cắp liệu… 1.3 Các dạng lỗi thường gặp: 1.3.1 Khơng kiểm tra ký tự truy vấn Đây dạng lỗi SQL injection xảy thiếu đoạn mã kiểm tra liệu đầu vào câu truy vấn SQL Kết người dùng cuối thực số truy vấn không mong muốn sở liệu ứng dụng Dòng mã sau minh họa lỗi này: statement = "SELECT * FROM users WHERE name = '" + userName + "';" Câu lệnh thiết kế để trả ghi tên người dùng cụ thể từ bảng người dùng Tuy nhiên, biến "userName" nhập xác theo cách người dùng ác ý, trở thành câu truy vấn SQL với mục đích khác hẳn so với mong muốn tác giả đoạn mã Ví dụ, ta nhập vào giá trị biến userNamenhư sau: a' or 't'='t Khiến câu truy vấn hiểu sau: SELECT * FROM users WHERE name = 'a' or 't'='t'; Nếu đoạn mã sử dụng thủ tục xác thực ví dụ sử dụng để bắt buộc lựa chọn tên người dùng hợp lệ Bài Tập Lớn An Ninh Mạng 't'='t' Trong hầu hết SQL server cho phép thực nhiều truy vấn lúc với lần gọi, nhiên số SQL API mysql_query php lại khơng cho phép điều lý bảo mật Điều ngăn cản tin tặc công cách sử dụng câu lệnh riêng rẽ mà không ngăn cản tin tặc thay đổi từ cú pháp truy vấn Các giá trị biến "userName" câu truy vấn gây việc xoá người dùng từ bảng người dùng tương tự việc xóa tất liệu từ bảng liệu (về chất tiết lộ thông tin người dùng), ví dụ minh họa API cho phép thực nhiều truy vấn lúc: a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't Điều đưa tới cú pháp cuối câu truy vấn sau: SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't'; 1.3.2 Xử lý không dúng kiểu Lỗi SQL injection dạng thường xảy lập trình viên hay người dùng định nghĩa đầu vào liệu không rõ ràng thiếu bước kiểm tra lọc kiểu liệu đầu vào Điều xảy trường số sử dụng truy vấn SQL lập trình viên lại thiếu bước kiểm tra liệu đầu vào để xác minh kiểu liệu mà người dùng nhập vào có phải số hay khơng Ví dụ sau: statement:= "SELECT * FROM data WHERE id = " + a_variable + ";" Ta nhận thấy cách rõ ràng ý định tác giả đoạn mã nhập vào số tương ứng với trường id - trường số Tuy nhiên, người dùng cuối, thay nhập vào số, họ nhập vào chuỗi ký tự, Bài Tập Lớn An Ninh Mạng trở thành câu truy vấn SQL hoàn chỉnh mà bỏ qua ký tự Ví dụ, ta thiết lập giá trị biến a_variable là: 1;DROP TABLE users đó, thực thao tác xóa người dùng có id tương ứng khỏi sở liệu, câu truy vấn hồn chỉnh hiểu là: SELECT * FROM data WHERE id=1;DROP TABLE users; 1.3.3 Lỗi bảo mật bên máy chủ sở liệu Đơi lỗ hổng tồn phần mềm máy chủ sở liệu, trường hợp hàm mysql_real_escape_string() máy chủ MySQL Điều cho phép kẻ cơng thực công SQL injection thành công dựa ký tự Unicode không thông thường đầu nhập vào thoát 1.3.4 Blind SQL Injection Lỗi SQL injection dạng dạng lỗi tồn ứng dụng web hậu chúng lại không hiển thị trực quan cho kẻ cơng Nó gây sai khác hiển thị nội dung trang chứa lỗi bảo mật này, hậu công SQL injection dạng khiến cho lập trình viên hay người dùng phải nhiều thời gian để phục hồi xác bit liệu Những kẻ cơng cịn sử dụng số cơng cụ để dị tìm lỗi dạng cơng với thông tin thiết lập sẵn a Thay đổi giá trị điều kiện truy vấn Dạng lỗi khiến cho kẻ cơng thay đổi giá trị điều kiện câu truy vấn, làm sai lệch hiển thị ứng dụng chứa lỗi Bài Tập Lớn An Ninh Mạng SELECT booktitle from booklist where bookId = 'OOk14cd' AND 1=1; Sẽ hiển thị trang cách bình thường, khi: SELECT booktitle from booklist where bookId = 'OOk14cd' AND 1=2; Sẽ hiển thị nội dung khác, khơng hiển thị ứng dụng web có chứa lỗi SQL injection dạng Lỗ hổng dạng cịn cho phép tin tặc khơng gây ảnh hưởng tới bảng hay liệu mà ảnh hưởng tới liệu hay bảng khác phụ thuộc vào nội dung liệu hay bảng b Điều kiện lỗi Mỗi SQL injection dạng dẫn tới việc buộc sở liệu phép đánh giá mà giá trị câu lệnh WHERE Ví dụ: SELECT 1/0 from users where username='Ralph'; Phép chia cho đánh giá lỗi mà người dùng có tên "Ralph" tồn sở liệu c Thời gian trễ Lỗi SQL injection dạng tồn thời gian xử lý hay nhiều truy vấn SQL phụ thuộc vào liệu logic nhập vào trình xử lý truy vấn SQL engine cần nhiều thời gian Tin tặc sử dụng lỗi SQL injection dạng để xác định thời gian xác mà trang cần tải giá trị nhập vào Bài Tập Lớn An Ninh Mạng Hồn tất cấu hình bắt đầu qt Thu thập kết Bài Tập Lớn An Ninh Mạng Ở có số lỗi XSS, SQL injection, RFI Ta dùng SQLmap để khai thác lỗ hổng SQL Injection Bài Tập Lớn An Ninh Mạng Gõ câu lệnh: sqlmap -u http://testphp.vulnweb.com/product.php?pic=7%20AND %201=2%20 %20 keep-alive random-agent -u : url cần quét keep-alive : sử dụng HTTP(s) connections random-agent : sử dụng HTTP User-Agent ngẫu nhiên sqlmap -u http://testphp.vulnweb.com/product.php?pic=7%20AND %201=2%20 %20 dbs Bài Tập Lớn An Ninh Mạng dbs : liệt kê databases Sau dung SQLmap có thơng tin có databases, thử xem databases acuart có khơng sqlmap -u http://testphp.vulnweb.com/product.php?pic=7%20AND %201=2%20 %20 -D acuart –columns -D: Chọn database để thao tác colmns: liệt kê columns Bài Tập Lớn An Ninh Mạng Xem bảng user có sqlmap -u http://testphp.vulnweb.com/product.php?pic=7%20AND %201=2%20 %20 -D acuart -T users dump -T: chọn bảng thực thi dump : lấy liệu Dị tìm lỗ hổng SQLInjection website Bài Tập Lớn An Ninh Mạng Nhập URL Chọn Free Scan Sau chọn Light Scan Full Scan Demo công lỗ hổng SQL Injection Bài Tập Lớn An Ninh Mạng Nhập email: user@email.com Password: password Log in Bài Tập Lớn An Ninh Mạng Server trả kết “Unknow email or password” khơng tìm thấy liệu user Nhập lại password “ password’ ” Lần server trả kết “An unexpected error occurred” Do Hacker nhập thêm ký tự ‘ khiến SQL server trả kết lỗi cú pháp : Rendering login page: Server kết xuất trang đăng nhập Đây câu lệnh SQL server Bài Tập Lớn An Ninh Mạng “ password’ “ chèn trực tiếp vào chuỗi SQL kết thúc truy vấn Đây nguyên nhân gây lỗi cú pháp mà thấy server trả Hành vi hacker website bị công SQL Injection Tiếp tục nhập password “ ‘ or 1=1 “ Bài Tập Lớn An Ninh Mạng Hacker đăng nhập vào hệ thống mà không cần mật khẩu, nhờ khai thác lỗ hổng SQL Injection Hệ thống bị đánh lừa ký tự “ “ hacker nhập khiến sở liệu bỏ qua phần lại câu lệnh SQL, cho phép xác thực mà nhập mật Bài Tập Lớn An Ninh Mạng CHƯƠNG 4: HẬU QUẢ CỦA SQL INJECTION VÀ CÁCH PHÒNG CHỐNG SQL 4.1 Hậu quả: Hậu lớn mà SQL Injection gây là: Làm lộ liệu database Tuỳ vào tầm quan trọng liệu mà hậu dao động mức nhẹ vô nghiêm trọng Nếu lộ liệu credit card, hacker dùng credit card để “mua sắm hộ” chôm tiền người dùng Hàng triệu Credit Card chùa tồn mạng, hacker chôm từ trang bán hàng thông qua SQL Injection Lộ liệu khách hàng ảnh hưởng nghiêm trọng đến cơng ty Hình ảnh cơng ty bị ảnh hưởng, khách hàng chuyển qua sử dụng dịch vụ khác, dẫn đến phá sản v…v Lỗ hỗng ảnh hưởng lớn đến khách hàng Do họ thường dùng chung mật cho nhiều tài khoản, cần lộ mật tài khoản tài khoản khác lộ theo Trong nhiều trường hợp, hacker không đọc liệu mà cịn chỉnh sửa liệu Lúc hacker đăng nhập vai trị admin, lợi dụng hệ thống, xố tồn liệu để hệ thống ngừng hoạt động 4.2 Cách phòng chống: Hầu hết mã nguồn mở không lo lỗi này, nhiên plugin hay module viết nhiều lập trình viên khác lại hay để sơ hở tạo điều kiện cho lỗi phát sinh Cách phịng tránh có nhiều cách, đó: Mặc dù SQL nguy hại dễ phịng chống Gần đây, viết SQL mà toàn sử dụng ORM (Object-Relational Mapping) framework Các framework web tự tạo câu lệnh Bài Tập Lớn An Ninh Mạng SQL nên hacker khó cơng Tuy nhiên, có nhiều site sử dụng SQL để truy cập liệu Đây mồi ngon cho hacker Để bảo vệ thân trước SQL Injection, ta thực biện pháp sau 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 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 khơng nên 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 Viết lại đường dẫn website phịng lỗi SQL Injection, hacker thường phải tìm sơ hở website đường link form nhập liệu người dùng, khơng nhìn thấy biến query hacker phải tìm cách khác để thử lỗi Lọc kĩ người dùng nhập Với số người dùng nhập vào, để ăn bạn lọc qua hàm như: $num = ( int ) $_POST['num']; Bài Tập Lớn An Ninh Mạng $num = is_numeric ( $num ) ? $num : 0; Ví dụ sử dụng sprinf: $data = sprintf('select * from %s where data = %d limit 1', $table, $must_be_number ); Sử dụng kết hợp với mysql_real_escape_string() để câu SQL an toàn: $data = sprintf('select * from %s where data = %d limit 1', $table, mysql_real_escape_string($must_be_number ) ); Sử dụng tường lửa: Ứng dụng web (Web Application Firewall) để ngăn chặn lỗ hổng SQL Injection Khi sử dụng dịch vụ máy chủ Cloud EXA cung cấp để làm web hosting chạy ứng dụng web tích hợp dịch vụ Web Application Firewall để ngăn chặn lỗ hồng SQL Injection http://exa.vn Bài Tập Lớn An Ninh Mạng KẾT LUẬN Lỗi SQL Injection lỗi phổ thơng, nhiên phịng chống việc hồn tồn khơng khó, cần bạn ln tự nhủ với người dùng nhập ta khơng thể tin điều gì, phải xác định lại chúng sử dụng phương pháp ép kiểu thêm dấu “” vào biến người dùng nhập ( addslashes() ) hạn chế tối đa lỗi ! Với mã nguồn mở, an tâm phần hầu hết câu query lọc qua lọc lại cách kĩ lưỡng, phát sinh lỗi viết không quy chuẩn mà thôi, bạn nên để ý sử dụng Bài Tập Lớn An Ninh Mạng