3.CSDL từng bị tấn công: Sony, Microsoft UK, Vietnamwork, Visa International và MasterCard International hiện cũng đang phải soạn thảo lại các nguyên tắc bảo mật trong việc chấp nhận th
Trang 1TRƯỜNG ĐẠI HỌC NGÂN HÀNG THÀNH PHỐ HỒ CHÍ MINH
KHOA HỆ THỐNG THÔNG TIN QUẢN LÝ
ĐỀ TÀI:
SQL INJECTION – CHÈN MÃ SQL Môn: An toàn bảo mật thông tin
GVHD: THẦY NGUYỄN PHƯƠNG NAM
Lớp:
Nhóm 11: Nguyễn Đức Anh 030630140454
Lư Ngọc Hồng 03063014 Nguyễn Nhật Duy 03063014
TP Hồ Chí Minh, ngày 26 tháng 6 năm 2017
Trang 2NỘI DUNG
PHẦN 1: LÝ THUYẾT VỀ SQL INJECTION 2
1 Khái niệm 2
2 Tính chất 2
3 CSDL từng bị tấn công: 2
4 Hậu quả của SQL Injection 2
5 Cơ chế tấn công SQL Injection 2
6 Tấn công bằng mệnh đề luôn đúng 3
PHẦN 2: MỘT SỐ LOẠI CHÈN MÃ SQL 3
1 Plain SQL Injection 3
2 Blind SQL 4
PHẦN 3: CÁCH PHÒNG CHỐNG TẤN CÔNG SQL INJECTION 4
1 Dữ liệu là kiểu chuỗi 5
2 Viết lại đường dẫn 5
3 Data Validation 6
PHẦN 4: DEMO TRỰC TIẾP TRÊN HỆ THỐNG 7
Trang 4PHẦN 1: LÝ THUYẾT VỀ SQL INJECTION
1 Khái niệm
SQL Injection là một kỹ thuật lợi dụng những lỗ hổng về câu truy vấn lấy dữ liệu của những website không an toàn trên web, đây là một kỹ thuật tấn công rất phổ biến và sự thành công của
nó cũng tương đối cao
2.Tính chất
Cực kỳ nguy hiểm – Có thể gây ra những thiệt hại khổng
lồ Với SQL Injection, hacker có thể truy cập một phần hoặc toàn bộ dữ liệu trong hệ thống
Rất phổ biến và dễ thực hiện – Lỗ hổng này rất nổi tiếng, từ developer đến hacker gần như ai cũng biết Ngoài ra, còn có 1 số tool tấn công SQL Injection cho dân “ngoại đạo”, những người không biết gì về lập trình
3.CSDL từng bị tấn công:
Sony, Microsoft UK, Vietnamwork, Visa International và MasterCard International hiện cũng đang phải soạn thảo lại các nguyên tắc bảo mật trong việc chấp nhận thanh toán bằng thẻ tín dụng nhằm chống lại các vụ tấn công SQL Injection
Dễ tấn công, phổ biến, gây ra hậu quả nghiêm trọng, đó là lý dó Inject (Không chỉ SQL mà OS và LDAP) nằm chễm chệ ở vị trí đầu bảng trong top 10 lỗ hỗng bảo mật của OWASP
4.Hậu quả của SQL Injection
Làm lộ dữ liệu trong database: Tuỳ vào tầm quan trọng của
dữ liệu mà hậu quả dao động ở mức nhẹ cho đến vô cùng nghiêm trọng
VD: Nếu lộ dữ liệu credit card, hacker có thể dùng credit card
để “mua sắm hộ” hoặc trộm tiền của người dùng Hàng triệu Credit Card “chùa” tồn tại trên mạng, do hacker chôm từ các trang bán hàng thông qua SQL Injection
Ảnh hưởng rất nghiêm trọng đến công ty: Hình ảnh công ty
có thể 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
Trang 5 Ảnh hưởng lớn đến khách hàng: Do họ thường dùng chung một mật khẩu cho nhiều tài khoản, chỉ cần lộ mật khẩu một tài khoản thì các tài khoản khác cũng lộ theo
(Vd: Vụ bị lộ thông tin các tài khoản của Vietnamwork)
Ảnh hưởng tới toàn bộ hệ thống : Trong nhiều trường hợp, hacker không chỉ đọc được dữ liệu mà còn có thể chỉnh sửa
dữ liệu Lúc này hacker có thể đăng nhập dưới vai trò admin, lợi dụng hệ thống, hoặc xoá toàn bộ dữ liệu để hệ thống ngừng hoạt động
5.Cơ chế tấn công SQL Injection
a Quy trình tấn công:
Hacker chèn lệnh SQL vào lỗ hổng
Hacker lấy được thông tin mình mong muốn, ví dụ thông tin bài đăng hoặc thông tin của một User, hoặc thông tin đăng nhập của SQL
Hacker giải mã password của admin, hoặc thay thế mật khẩu của mình vào rồi đăng nhập bằng tài khoản Admin
Hacker làm những gì hắn muốn
6.Tấn công bằng mệnh đề luôn đúng
Cơ chế này vô cùng đơn giản Ta thường sử dụng câu lệnh SQL
để truy cập dữ liệu Giả sử, muốn tìm đăng nhập user, ta thường viết code như sau:
var username = request.username; // abcdef
var password = request.password; // 123456
var sql = “SELECT * FROM Users WHERE Username = “ + username + ” AND Password = “ + password + ”;
// SELECT * FROM Users WHERE Username=’abcdef’ AND Password=’123456’
Đoạn code trên đọc thông tin nhập vào từ user và cộng chuỗi để thành câu lệnh SQL Để thực hiện tấn công, Hacker có thể thay đổi thông tin nhập vào, từ đó thay đổi câu lệnh SQL
var username = request.username; // abcdef
var password = request.password; // ‘OR “=”
Trang 6var sql = “SELECT * FROM Users WHERE Username = “ + username + ” AND Password = “ + password + ”;
// SELECT * FROM Users WHERE Username=’abcdef’ AND Password= “OR”=”
// Câu sql này luôn cho kết quả TRUE và chắc chắn thực hiện được
Hacker có thể thông qua SQL Injection để dò tìm cấu trúc dữ liệu (Gồm những table nào, có những column gì), sau đó bắt đầu khai thác dữ liệu bằng cách sử dụng các câu lệnh như UNION, SELECT TOP 1…
Tấn công phá hoại dữ liệu
Giả sử câu lệnh cũng như trên, nhưng không nhập phần password nữa mà thêm như sau:
SELECT * FROM Users WHERE Username= ‘abcdef’; DROP TABLE accounts; ‘’
Dấu ( ; ) dùng để phân tách câu lệnh trong SQL, điều này đồng nghĩa với việc hacker có thể hành động thêm bất kì lệnh gì vào trong câu lệnh trên
PHẦN 2: MỘT SỐ LOẠI CHÈN MÃ SQL
1.Plain SQL Injection
UNION SQL injection: sử dụng toán tử UNION để join 2 truy vấn với nhau Error Based SQL injection: khai thác các lỗi cú pháp để trích xuất một số thông tin
2.Blind SQL
a Định nghĩa
Lỗi 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
Trang 7b Tối ưu hóa tấn công BLIND SQL INJECTION
Trong các dạng tấn công SQL injection, Blind SQL injection là dạng rất phổ biến Xuất phát từ việc tối ưu khai thác lỗ hổng Blind SQL injection trong truy vấn sử dụng mệnh đề ORDER BY, bài viết này trình bày về các phương pháp khai thác, tối ưu Blind SQL injection nói chung và lỗ hổng Blind SQL trong truy vấn sử dụng mệnh đề ORDER BY nói riêng đồng thời đưa ra một góc nhìn, phương pháp tiếp cận mới trong việc tối ưu hóa tấn công này
PHẦN 3: CÁCH PHÒNG CHỐNG TẤN CÔNG
SQL INJECTION
Ngay từ khái niệm, chúng ta đã có thể biết được cách phòng chống hiệu quả Sql injection chính là việc kiểm tra kỹ càng tham số đầu vào Những tham số mà từ đó người lập trình website sử dụng để xây dựng lên câu truy vấn tới cơ sở dữ liệu Công việc kiểm tra tham số đầu vào (áp dụng phòng tránh lỗi Sql injection) nên được tiến hành theo nhiều tầng:
Client: javascript (có thể bypass bằng các phần mềm tamper)
Server: PHP
Nếu dữ liệu kiểu INT
Khi bạn nhận dữ liệu ID trên URL thì cách tốt nhất bạn nên ép kiểu, chuyển nó về kiểu số INT, sau đó chuyển về kiểu STRING (nếu cần thiết)
Ví dụ: tôi có url như sau:
webtopviet.net/login.php?id=59
$id = isset($_GET['id']) ? (string)(int)$_GET['id'] : false;
Như vậy thì cho dù ta nhập vào kỳ tự gì đi nữa đều sẽ bị clear ra khỏi hết Hoặc ta có thể dùng cách dước bằng cách dùng hàm preg_replace trong PHP để xóa đi những ký tự không phải là chữ số
$id = isset($_GET['id']) ? $_GET['id'] : false;
$id = str_replace('/[^0-9]/', '', $id);
Hoặc dùng hàm:
Trang 8is_numeric($var), is_int($var), is_integer($var)
1.Dữ liệu là kiểu chuỗi
Thiết lập độ dài tối đa cần thiết: length <= MAX_LENGTH
Lọc bỏ ký tự nguy hiểm (bao gồm các meta characters trong DBMS), lọc bỏ các từ khóa như union, select, order, information_schema, insert, drop, load_file… (sử dụng các hàm như mysql_real_escape_string(), preg_replace()…)
$id = preg_replace("/[^0-9]/","", $_GET['id']);
$query = mysql_query("SELECT * FROM table where id = "' $id '");
Sử dụng hàm sprintf và mysql_real_escape_string để xác định kiểu dữ liệu cho câu truy vấn
Như bạn biết hàm sprintf gồm có hai tham số trở lên, tham số thứ nhất là chuỗi và trong đó có chứa một đoạn Regex để thay thế, tham số thứ 2 trở đi là các giá trị sẽ được thay thế tương ứng Giá trị ráp vào sẽ được convert phù hợp rồi mới rap vào
Ví dụ:
$webname = 'webtopviet.com';
$title = 'Học lập trình PHP';
echo sprintf('Website %s laf website %s', $webname, $title); Kết quả in ra là: Website webtopviet.com là website Học lập
Nếu bạn chưa biết về hàm sprintf thì vào link này đọc nhé
Như bạn biết hàm mysql_real_escape_string có nhiệm vụ sẽ chuyển một chuỗi thành chuỗi query an toàn, nên ta sẽ kết hợp
nó để gán vào câu truy vấn
Trang 9Ví dụ:
$sql = "SELECT * FROM member WHERE username = '%s' AND password = '%s'";
echo sprintf($sql, mysql_real_escape_string("phongma"), mysql_real_escape_string("matkhau"));
Kết quả là: SELECT * FROM member WHERE username =
‘phongma’ AND password = ‘matkhau’
2.Viết lại đường dẫn
Vấn đề này có vẻ hơi lạ nhưng bản thân mình thấy rất đúng Khi bạn viết lại đường dẫn dù trên hệ thống route của FW hay dù trên file .htaccess thì hãy fix chính xác đoạn mã Regular Expresition
Ví dụ: Tôi có đường dẫn sau khi rewirte là như sau:
webtopviet.com/hoc-lap-trinh-mien-phi.html thì đoạn Regex tôi
sẽ viết là:
/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)\.html/ Thay vì như vậy thì tôi
sẽ viết chính xác /([a-zA-Z0-9-]+)/([0-9])\.html/ thì sẽ tốt hơn Và đừng quên là cũng ẩn đi đường link gốc của nó nhé
Tác hại của dạng tấn công SQL Injection tùy thuộc vào môi trường và cách cấu hình hệ thống Nếu ứng dụng sử dụng quyền dbo (quyền của người sở hữu CSDL) khi thao tác dữ liệu, nó có thể xóa toàn bộ các bảng dữ liệu, tạo các bảng dữ liệu mới… Nếu ứng dụng sử dụng quyền sa (quyền quản trị hệ thống), nó
có thể điều khiển toàn bộ hệ CSDL và thậm chí có thể tạo ra các tài khoản người dùng bất hợp pháp để điều khiển hệ thống của bạn
Để phòng tránh các nguy cơ có thể xảy ra, hãy bảo vệ các câu truy vấn SQL bằng cách kiểm soát chặt chẽ tất cả các dữ liệu nhập nhận được từ đối tượng Request (Request, Request QueryString, Request.Form, Request Cookies, và Request.Server Variables)
Trong trường hợp dữ liệu nhập vào là chuỗi, như trong ví dụ 1, lỗi xuất phát từ việc có dấu nháy đơn trong dữ liệu Để tránh điều này, thay thế các dấu nháy đơn bằng hàm Replace để thay thế bằng 2 dấu nháy đơn:
p_strUsername = Replace(Request.Form(“txtUsername”), “‘“,
“‘’”)
p_strPassword = Replace(Request.Form(“txtPassword”), “‘“,
“‘’”)
Trang 10Trong trường hợp dữ liệu nhập vào là số, như trong ví dụ 2, lỗi xuất phát từ việc thay thế một giá trị được tiên đoán là dữ liệu
số bằng chuỗi chứa câu lệnh SQL bất hợp pháp Để tránh điều này, đơn giản hãy kiểm tra dữ liệu có đúng kiểu hay không:
p_lngID = CLng(Request(“ID”))
Như vậy, nếu người dùng truyền vào một chuỗi, hàm này sẽ trả
về lỗi ngay lập tức
Ngoài ra để tránh các nguy cơ từ tấn công SQL Injection, nên chú ý loại bỏ bất kì thông tin kĩ thuật nào chứa trong thông điệp chuyển tới cho người dùng khi ứng dụng có lỗi Các thông báo lỗi thông thường tiết lộ các chi tiết kĩ thuật có thể cho phép kẻ tấn công biết được điểm yếu của hệ thống
Bạn có thể tham khảo thêm thông tin về cách thức tạo ra các trang báo lỗi tùy ý trong “Tạo ra các trang báo lỗi ASP được tùy biến”
Cuối cùng, để hạn chế thiệt hại do tấn công SQL Injection, nên kiểm soát chặt chẽ và giới hạn quyền xử lí dữ liệu của tài khoản người dùng mà ứng dụng web đang sử dụng Các ứng dụng thông thường nên tránh dùng các quyền như dbo hay sa Quyền càng hạn chế, thiệt hại càng ít
3.Data Validation
Validation là quá trình để đảm bảo dữ liệu người dùng gửi lên là hợp lệ Ví dụ ở trong PHP, bạn có thể dùng hàm mysql_real_escape_string() để loại bỏ những kí tự có thể gây ảnh hưởng đến câu lệnh SQL
Đoạn code đầu tiên sẽ sửa thành như này:
$con=mysqli_connect("localhost","user","password","db");
$username = mysqli_real_escape_string($con,
$_POST['username']);
$password = mysqli_real_escape_string($con,
$_POST['password']);
$sql_command = "select * from users where username = '"
$username; $sql_command .= "' AND password = '"
$password "'";
Edit một chút đã giúp bảo vệ code của chúng ta trước tấn công SQLi bằng cách thêm vào kí tự (\) trước các dấu nháy đơn mà người dùng có ý thêm vào
Trang 11Một số lưu ý về tính toán: Nếu bạn đã thêm việc validate dữ liệu
ở client side thì người dùng có thể pass qua những validation phía client side bằng các sửa các mã HTML họ nhận được hay tắt các javascript ở phía client đi
Trong một số ngôn ngữ lập trình, chẳng hạn như ASP.NET, bao gồm các tính năng tự động xem xét các dữ liệu đầu vào và sử dụng các bộ lọc để loại bỏ nó Nhưng điều này vẫn có thể bị tin tặc lách qua nếu đủ tinh tế Dù sao thì việc kiểm tra dữ liệu đầu vào cũng chẳng bao giờ là điều quá thận trọng cả
PHẦN 4: DEMO TRỰC TIẾP TRÊN HỆ
THỐNG