Bài giảng Bảo mật ứng dụng Web: SQL injection do Nguyễn Hữu Thể biên soạn nhằm cung cấp cho bạn kiến thức tổng quan về SQL injection như khái niệm, các dạng lỗi thường gặp, các dạng tấn công SQL injection. Mời các bạn tham khỏa!
BẢO MẬT ỨNG DỤNG WEB SQL INJECTION Nguyễn Hữu Thể SQL Injection Hình thức cơng vào câu lệnh SQL attacker chèn câu lệnh vào SQL chương trình • => khai thác liệu Khai thác lỗi: ứng dụng web với backend: • Khơng sử dụng data object • Dùng kết nối query • Các thông báo lỗi hệ quản trị sở liệu trả SQL Injection ❖ Các dạng lỗi thường gặp: Không kiểm tra ký tự truy vấn Xử lý khơng kiểu Lỗi bảo mật bên máy chủ sở liệu Blind SQL Injection Các dạng công SQL injection Dạng công vượt qua kiểm tra đăng nhập Dạng công sử dụng câu lệnh SELECT Dạng công sử dụng câu lệnh INSERT Dạng công sử dụng stored-procedures Dạng công vượt qua kiểm tra đăng nhập (authorization bypass) Đăng nhập nhờ vào lỗi dùng câu lệnh SQL Ví dụ: table users sau: CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(100) NULL, password VARCHAR(50) NULL, PRIMARY KEY (id) ); INSERT INTO users (username, password) VALUES ('aaa', '123456'); INSERT INTO users (username, password) VALUES ('bbb', '123456'); Dạng công vượt qua kiểm tra đăng nhập (authorization bypass) Username Password Câu truy vấn nhận liệu: $sql = "SELECT * FROM users WHERE username = '".$_POST[‘username']."' AND password = '" $_POST['password'] "'"; Dạng công vượt qua kiểm tra đăng nhập (authorization bypass) require 'dbcon.php'; $sql = "SELECT * FROM users WHERE username = '".$_POST['username']."' AND password = '" $_POST['password'] "'"; $result = mysqli_query($conn, $sql); $row = mysqli_fetch_array($result); if($row) echo "Thành công"; else echo "Thất bại"; mysqli_close($conn); Dạng công vượt qua kiểm tra đăng nhập (authorization bypass) Đăng nhập: - Nhập vào ô username: khongbiet' OR = LIMIT ] - Nhập vào ô password: khongbiet Kết truy vấn: SELECT * FROM users WHERE username = 'khongbiet' OR = LIMIT ]' AND password = 'khongbiet' Tương đương: SELECT * FROM users WHERE username = 'khongbiet' OR = LIMIT Dạng công vượt qua kiểm tra đăng nhập (authorization bypass) TH1: Nhập username password Đăng nhập thành công TH2: username password Đăng nhập thành công Dạng công sử dụng câu lệnh SELECT Lợi dụng sơ hở thông báo lỗi từ hệ thống • => Dị tìm điểm yếu khởi đầu cho việc cơng Thơng thường: • Sẽ có trang nhận ID tin cần hiển thị • Sau truy vấn nội dung tin có ID • Hoặc nhập liệu tìm kiếm 10 SQL INJECTION VÀ KHẮC PHỤC Thử công SQL Injection • TH 1: biết tên username Username: admin Password: ' OR '1'='1 // Câu truy vấn là: select * from users where username='admin' and password='' OR '1'='1' 49 SQL INJECTION VÀ KHẮC PHỤC Thử công SQL Injection • TH 2: khơng biết tên username password Username: ' OR '1'='1 Password: ' OR '1'='1 // Câu truy vấn là: select * from users where username='' OR '1'='1' and password='' OR '1'='1' Hoặc: Username: khongbiet' OR = -Password: khongbiet SELECT * FROM users WHERE username = 'khongbiet' OR = 50 PHÒNG CHỐNG SQL INJECTION TH1: mysql_real_escape_string() • Xóa ký tự đặc biệt liệu đầu vào (dấu nháy đơn) require 'dbcon.php'; $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']); $sql = "SELECT * FROM users WHERE username = '" $username "' AND password = '" $password "'"; $result = mysqli_query($conn, $sql); $row = mysqli_fetch_array($result); if($row) echo "Thành công"; else echo "Thất bại"; mysqli_close($conn); 51 PHÒNG CHỐNG SQL INJECTION TH2: md5() • mã hóa tồn username password require 'dbcon.php'; $username = md5($_POST['username']); $password = md5($_POST['password']); $sql = "SELECT * FROM users WHERE username = '" $username "' AND password = '" $password "'"; $result = mysqli_query($conn, $sql); $row = mysqli_fetch_array($result); if($row) echo "Thành công"; else echo "Thất bại"; mysqli_close($conn); SQL Infection khơng thực => mã hóa chuỗi ký tự => Việc chèn thêm ký tự bị vơ hiệu 52 PHỊNG CHỐNG SQL INJECTION Kiểm tra liệu kiểu chuỗi • Thiết lập độ dài tối đa cần thiết: length require 'dbcon.php'; $tendangnhap = $_POST['tendangnhap']; $matkhau = $_POST[‘matkhau']; $sql = "SELECT * FROM users WHERE username = '" $tendangnhap "' AND password = '" $matkhau "'"; $result = mysqli_query($conn, $sql); $row = mysqli_fetch_array($result); if($row) echo "Thành công"; else echo "Thất bại"; mysqli_close($conn); 63 ... sở liệu trả SQL Injection ❖ Các dạng lỗi thường gặp: Không kiểm tra ký tự truy vấn Xử lý khơng kiểu Lỗi bảo mật bên máy chủ sở liệu Blind SQL Injection Các dạng công SQL injection ... = mysqli_query($conn, $sql) ; $row = mysqli_fetch_array($result); if($row) echo "Thành công"; else echo "Thất bại"; mysqli_close($conn); SQL INJECTION VÀ KHẮC PHỤC Thử cơng SQL Injection. . .SQL Injection Hình thức cơng vào câu lệnh SQL attacker chèn câu lệnh vào SQL chương trình • => khai thác liệu Khai thác lỗi: ứng dụng web với backend: • Khơng sử dụng data object