An ninh mạng - Bài 6: An toàn dịch vụ web sql injection
• Tổng quan về hoạt động của dịch vụ Web
• Tấn công dạng Command Injection
• SQL Injection
• XSS
• CSRF
• Quản lý phiên
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Bạn đang xem 10 trang mẫu của tài liệu "An ninh mạng - Bài 6: An toàn dịch vụ web sql injection", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: An ninh mạng - Bài 6: An toàn dịch vụ web sql injection
1BÀI 6. AN TOÀN DỊCH VỤ WEB SQL INJECTION Bùi Trọng Tùng, Viện Công nghệ thông tin và Truyền thông, Đại học Bách khoa Hà Nội 1 Nội dung • Tổng quan về hoạt động của dịch vụ Web • Tấn công dạng Command Injection • SQL Injection • XSS • CSRF • Quản lý phiên 2 CuuDuongThanCong.com https://fb.com/tailieudientucntt 21. TỔNG QUAN VỀ DỊCH VỤ WEB Bùi Trọng Tùng, Viện Công nghệ thông tin và Truyền thông, Đại học Bách khoa Hà Nội 3 World Wide Web • Ra đời năm 1990 • Hệ thống các siêu văn bản trình bày bằng ngôn ngữ HTML được liên kết với nhau • Cho phép truy cập đến nhiều dạng tài nguyên thông tin khác nhau (văn bản, hình ảnh, âm thanh, video...) qua URL (Uniform Resource Location) và URI (Uniform Resource Identifier) • Đang được điều hành bởi W3C • Các công nghệ liên quan: CSS, XML, JavaScrips, Adobe Flash, Silverlight... • Hiện tại đã trở thành nền tảng (Web-based service) 4 CuuDuongThanCong.com https://fb.com/tailieudientucntt 3Giao thức HTTP • Sử dụng TCP, cổng 80 • Trao đổi thông điệp HTTP (giao thức ứng dụng) HTTP Request HTTP Response 5 Web clients Web server IE Firefox Navigator Thông điệp HTTP Request • Mã ASCII (dễ dàng đọc được dưới dạng văn bản) 6 GET /dccn/index.html HTTP/1.1 Host: www.it-hut.edu.vn User-agent: Mozilla/4.0 Connection: close Accept-language:en-us (extra carriage return, line feed) request line (GET, POST, HEAD commands) header lines CR, LF indicates end of message CuuDuongThanCong.com https://fb.com/tailieudientucntt 4Thông điệp HTTP Response 7 HTTP/1.1 200 OK Connection close Date: Tue, 16 Mar 2008 12:00:15 GMT Server: Apache/1.3.0 (Unix) Last-Modified: Mon, 15 Mar 2008 ... Content-Length: 8990 Content-Type: text/html data data data data data ... status line (protocol status code status phrase) header lines data, e.g., requested HTML file Tương tác với web server • Địa chỉ URL 8 Giao thức Tên miền(sẽ được phân giải thành địa chỉ IP) Đường dẫn tới tài nguyên (nội dung tĩnh, thường là file HTML) CuuDuongThanCong.com https://fb.com/tailieudientucntt 5Tương tác với web server (tiếp) • Tương tác với các kịch bản được thực thi trên server (servlet) 9 Đường dẫn tới servlet, cho phép server sinh nội dung trang web tùy thuộc các tham số: CGI: Common Gateway Interface PHP, JSP, ASP: ngôn ngữ kịch bản (scrips) Các tham số cho quá trình sinh nội dung Kiến trúc chung của các dịch vụ web 10 Người dùng có thể tương tác với các tài nguyên khác thông qua dịch vụ web subdomain.mysite.com/folder/page?id=5 Database Queries HTML Page, JS file, CSS file, image, etc. run code CuuDuongThanCong.com https://fb.com/tailieudientucntt 6Các nguy cơ đối với dịch vụ web • Tấn công server từ phía client Tấn công dạng Injection File System Traversal Broken Access Control 11 Các nguy cơ đối với dịch vụ web • Tấn công từ phía server: Clickjacking HistoryProbing Phishing 12 CuuDuongThanCong.com https://fb.com/tailieudientucntt 7Các nguy cơ đối với dịch vụ web • Tấn công người dùng khác: XSS CSRF Remote Script Inclusion 13 Top 15 lỗ hổng(2015 White Hat Security) 70 56 47 29 26 24 16 15 11 8 6 6 6 5 0 10 20 30 40 50 60 70 80 14 CuuDuongThanCong.com https://fb.com/tailieudientucntt 82013 OWASP Top10 Project 15 Mã Tên Mô tả A-1 Injection Cho phép chèn dữ liệu ác tính vào câu lệnh hoặc truy vấn A-2 Authentication and Session Management Đánh cắp mật khẩu, khóa, thẻ phiên, hoặc khai thác lỗ hổng để giả mạo người dùng A-3 XSS Ứng dụng Web không kiểm tra mã thực thi nhúng vào dữ liệu nhận được và gửi lại mã thực thi này cho trình duyệt Các lỗ hổng xuất hiện trong quá trình triển khai Để lộ file, thư mục chứa thông tin cấu hình quan trọng, phân quyền truy cập không hợp lý A-8 CSRF Trình duyệt của nạn nhân gửi thông điệp HTTP Request một cách ngoài ý muốn khi nạn nhân đang ở trạng thái đăng nhập 2. TẤN CÔNG DẠNG COMMAND INJECTION Bùi Trọng Tùng, Viện Công nghệ thông tin và Truyền thông, Đại học Bách khoa Hà Nội 16 CuuDuongThanCong.com https://fb.com/tailieudientucntt 9Command Injection • Lợi dụng lỗ hổng không kiểm soát giá trị các đối số khi thực thi kịch bản (servlet) trên web server Không phân biệt các ký hiệu điều khiển (ký hiệu phép toán, dấu ; “ ‘...) trong giá trị của đối số và trong câu lệnh • Ví dụ: Website chứa servlet cung cấp tính năng tính toán biểu thức bất kỳ qua hàm eval() 17 $in = $_GET[‘exp']; eval('$ans = ' . $in . ';'); Nội dung biểu thức được truyền qua đối số exp. Ví dụ: • Servlet thực thi như thế nào nếu truyền đối số như sau: “10 ; system(‘rm *.*’)” Command Injection – Ví dụ khác 18 ServerClient 1. 2. Send page Ping for FREE Enter an IP address below: Ô nhập dữ liệu CuuDuongThanCong.com https://fb.com/tailieudientucntt 10 Command Injection – Ví dụ khác 19 ServerClient Send output Ping for FREE Enter an IP address below: $t = $_REQUEST[‘ip']; $o = shell_exec(‘ping –C 3’ . $t); echo $o PHP exec program Command Injection – Ví dụ khác 20 ServerClient 2. Send page $t = $_REQUEST[‘ip']; $o = shell_exec(‘ping –C 3’ . $t); echo $o PHP exec program CuuDuongThanCong.com https://fb.com/tailieudientucntt 11 Command Injection – Ví dụ khác 21 ServerClient 2. Send page PHP exec program $t = $_REQUEST[‘ip']; $o = shell_exec(‘ping –C 3’ . $t); echo $o 127.0.0.1;ls Command Injection – Ví dụ khác • Thực thi shell 22 netcat –v –e ‘/bin/bash’ –l –p 31337 ip=127.0.0.1+%26+netcat+-v+- e+'/bin/bash'+-l+-p+31337&submit=submit CuuDuongThanCong.com https://fb.com/tailieudientucntt 12 Command Injection – Ví dụ khác • Mã PHP để gửi email: • Chèn mã thực thi khi truyền giá trị cho đối số: • Hoặc 23 $email = $_POST[“email”] $subject = $_POST[“subject”] system(“mail $email –s $subject < /tmp/joinmynetwork”) email=hacker@hackerhome.net & subject=foo < /usr/passwd; ls email=hacker@hackerhome.net&subject=foo; echo “evil::0:0:root:/:/bin/sh">>/etc/passwd; ls Phòng chống • Kiểm tra, chỉ chấp nhận giá trị chứa các ký tự hợp lệ Ký tự nào là hợp lệ? Phụ thuộc ngữ cảnh • Sử dụng dấu ‘\’ đặt trước các ký tự đặc biệt Nếu kẻ tấn công chèn trước ký tự ‘\’ ? • Bỏ qua các ký tự đặc biệt Nếu kẻ tấn công dùng mã ASCII? Luôn có cách vượt qua kiểm tra • Cách tốt hơn: không sử dụng các hàm có quá nhiều quyền thực thi. Không hiệu quả với SQL Injection 24 CuuDuongThanCong.com https://fb.com/tailieudientucntt 13 SQL Injection • Mục tiêu: các website sử dụng CSDL ở back-end • Lỗ hổng SQL Injection: không kiểm soát giá trị đối số truyền cho các servlet khi thực hiện các truy vấn CSDL Web server không phân biệt được các ký tự là của câu truy vấn hay của giá trị truyền cho đối số • Mục đích: sửa đổi hoặc chèn truy vấn con vào các truy vấn thông thường để đọc trái phép hoặc thay thế thông tin trên trang web • Lỗ hổng phổ biến nhất trên các website 25 Kịch bản tấn công SQL Injection 26 Victim Server Victim SQL DB Attacker Thực hiện câu truy vấn nằm ngoài dự kiến Trả lại dữ liệu nằm ngoài dự kiến 1 2 3 CuuDuongThanCong.com https://fb.com/tailieudientucntt 14 SQL Injection – Ví dụ • Xem xét đoạn mã PHP sau: $user = $_POST[‘recipient’]; $sql = "SELECT AcctNum FROM Customer WHERE Balance < 100 AND Username='$recipient'"; $rs = $db->executeQuery($sql); • Giả sử đối số được truyền như sau “?recipient=Bob” câu truy vấn được web server chuyển cho DBMS để thực thi như sau: SELECT AcctNum FROM Customer WHERE Balance < 100 AND Username=‘Bob’ • Kết quả nào được trả về với truy vấn sau: SELECT AcctNum FROM Customer WHERE True 27 Phân tích truy vấn trên cây cú pháp 28 SELECT / FROM / WHERE CustomerAcctNum AND =< Balance 100 Username 'Bob' Kết quả truy vấn: Số tài khoản của tất cả khách hàng có số dư dưới 100$ và tên khách hàng là Bob CuuDuongThanCong.com https://fb.com/tailieudientucntt 15 SQL Injection – Ví dụ (tiếp) • Xem xét đoạn mã PHP sau: $recipient = $_GET[‘recipient’]; $sql = "SELECT AcctNum FROM Customer WHERE Balance < 100 AND Username='$recipient'"; $rs = $db->executeQuery($sql); • Điều gì xảy ra nếu đối số được truyền giá trị làm thay đổi ý nghĩa của câu truy vấn Ví dụ truyền vào một giá trị đặc biệt ‘recipient’ để đọc toàn bộ danh sách khách hàng 29 SQL Injection – Ví dụ (tiếp) • Truyền đối số như sau: ?recipient=anyone’ OR 1 = 1;# • Câu truy vấn được thực thi: SELECT AcctNum FROM Customer WHERE Balance < 100 AND Username=‘anyone’ OR 1 = 1;#’ • Biểu thức điều kiện trở thành WHERE Balance < 100 AND Username=‘anyone’ OR 1 = 1 luôn trả về giá trị TRUE 30 Dấu # báo hiệu đoạn chú thích bỏ qua CuuDuongThanCong.com https://fb.com/tailieudientucntt 16 Cây cú pháp 31 SELECT / FROM / WHERE CustomerAcctNum OR =AND < = 1 1 Balance 100 Username ‘anyone’ Một số kỹ thuật khai thác SQLi • Mệnh đề ORDER BY sắp xếp kết quả theo một cột nào đó được liệt kê trong mệnh đề SELECT • Sử dụng mệnh đề ORDER BY cho phép đoán số cột được liệt kê trong truy vấn Nếu STT của cột ≤ số cột liệt kê trong truy vấn: thực hiện thành công Ngược lại trả về thông báo lỗi 32 Thông báo lỗi có thể để lộ thông tin về CSDL!!! CuuDuongThanCong.com https://fb.com/tailieudientucntt 17 Một số kỹ thuật khai thác SQLi(tiếp) • Mệnh đề UNION cho phép gộp kết quả của các truy vấn • Yêu cầu: các mệnh đề SELECT phải có cùng số cột, cùng kiểu dữ liệu (hoặc có thể chuyển đổi nếu kiểu dữ liệu khác nhau) • Dùng mệnh đề UNION cho phép: Xác định số cột trong mệnh đề SELECT Kiểm tra kiểu dữ liệu Thực hiện một truy vấn tới bảng khác: trích xuất dữ liệu, đoán tên bảng, đoán tên cột 33 Thông báo lỗi có thể để lộ thông tin về CSDL!!! Một số kỹ thuật khai thác SQLi(tiếp) • Sử dụng Batched Query (còn được gọi là query stack) • Lợi dụng khả năng hỗ trợ thực thi nhiều câu truy vấn cùng lúc của một số ngôn ngữ và hệ quản trị CSDL 34 Support ASP ASP.NET PHP MySQL No Yes No PostgreSQL Yes Yes Yes MS SQL Yes Yes Yes Lưu ý: Ngay cả khi ngôn ngữ và hệ quản trị CSDL không hỗ trợ, vẫn có thể khai thác bằng mệnh đề UNION CuuDuongThanCong.com https://fb.com/tailieudientucntt 18 Batched Query – Ví dụ • Truyền đối số như sau: ?recipient=anyone’; DROP TABLE Customer -- • Câu truy vấn được thực thi: SELECT AcctNum FROM Customer WHERE Balance < 100 AND Username=‘anyone’; DROP TABLE Customer --’ 35 Chèn câu lệnh SQL khác để can thiệp sửa đổi CSDL Thậm chí có thể chèn vào một đoạn mã thực thi kịch bản hệ thống (shell code) Blind SQL Injection • Trong một số trường hợp, hệ thống không trả lại thông báo lỗi khi thực thi câu lệnh SQL • Để khai thác các lỗi dạng này, có thể sử dụng 2 kỹ thuật: Boolean based Blind SQLi: sử dụng các câu truy vấn trả về True/False Time-based Blind SQLi: kiểm tra thời gian thực thi câu truy vấn • Cần mất nhiều thời gian để khai thác lỗi Blind SQLi thường sử dụng các công cụ hỗ trợ (Ví dụ: sqlmap) 36 CuuDuongThanCong.com https://fb.com/tailieudientucntt 19 Blind SQL Injection • Ví dụ 1: Boolean-based Blind SQLi Để tìm thông tin phiên bản của CSDL, chèn lời gọi hàm vào câu truy vấn: and substring(version(),i,1)=c;# Thay i là vị trí ký tự cần kiểm tra, c là giá trị cần so sánh • Time-based Blind SQLi MySQL: sleep(), benchmark() MS SQL: waitfor delay 37 Phòng chống SQL Injection • Thêm ký tự ‘\’ vào trước dấu nháy ‘...’ hoặc “...” • PHP: addslashes( “ ’ or 1 = 1 -- ”) Đầu ra: “ \’ or 1=1 -- ” Hạn chế: tấn công dựa vào mã Unicode của một số ký tự đặc biệt $user = 0x bf 27 addslashes($user) Đầu ra: 0x bf 5c 27 • Hàm tốt hơn: mysql_real_escape_string() 38 0x 5c \ 0x bf 27 ¿′ 0x bf 5c ′ CuuDuongThanCong.com https://fb.com/tailieudientucntt 20 Phòng chống SQL Injection • Hầu hết các ngôn ngữ lập trình, DBMS hỗ trợ kiểm soát các tham số trong câu truy vấn không hiểu lầm giá trị tham số và mã thực thi. • Ví dụ: PHP và MySQL $dbh = new mysqli(); $stmt = $dbh->prepare(“SELECT AcctNum FROM Customer WHERE Balance < 100 AND Username= ?”); $recipient = $_GET[‘recipient’]; $stmt->bind_param(“s”, $recipient); $stmt->execute(); • Sử dụng ORM framework 39 s: tham số kiểu xâu ký tự i: tham số kiểu số nguyên d: tham số kiểu số thực Cây cú pháp truy vấn SQL 40 SELECT / FROM / WHERE CustomerAcctNum AND =< Balance 100 Username ? CuuDuongThanCong.com https://fb.com/tailieudientucntt 21 Cây cú pháp truy vấn SQL 41 SELECT / FROM / WHERE CustomerAcctNum AND =< Balance 100 Username ? ?recipient=anyone’ OR 1 = 1 -- $stmt->bind_param(“s”, $recipient); anyone’ OR 1 = 1 -- Bài giảng sử dụng một số hình vẽ và ví dụ từ các bài giảng: • Computer and Network Security, Stanford University • Computer Security, Berkeley University • Introduction to Computer Security, Carnegie Mellon University 42 CuuDuongThanCong.com https://fb.com/tailieudientucntt
File đính kèm:
- an_ninh_mang_bai_6_an_toan_dich_vu_web_sql_injection.pdf