Sql injection

19
SQL Injection Tìm hiểu về khái niệm, phương thức khai thác

Transcript of Sql injection

Page 1: Sql injection

SQL Injection

Tìm hiểu về khái niệm, phương thức khai thác

Page 2: Sql injection

GRAVITYKHÁI NIỆM - SQL INJECTION

SQL Injection là gì?

SQL Injection là một kỹ thuật là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất hợp pháp.

Page 3: Sql injection

GRAVITYMỤC LỤC

Các dạng lỗi

1

Công cụ tìm kiếm và khai thác lỗ hổng

2 3

Cách phòng tránh

Page 4: Sql injection

GRAVITYCÁC DẠNG LỖI

• Không lọc những ký tự “escape” (như ‘<‘,

‘\’,…)

• Không kiểm tra dạng của dữ liệu được nhập

vào

• Blind SQL Injection

Page 5: Sql injection

GRAVITYCÁC DẠNG LỖI - LỖI KHÔNG LỌC KÝ TỰ ESCAPE

• Lỗi 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

• Người dùng 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.

Page 6: Sql injection

GRAVITYVÍ DỤ - LỖI KHÔNG LỌC KÝ TỰ ESCAPE

Username anhmiuhv

statement = "SELECT * FROM users WHERE name = '" + userName + "';"

anhmiuhv Linh 1996

Page 7: Sql injection

GRAVITYCÁC DẠNG LỖI

Username a’; DROP TABLE users;--

statement = "SELECT * FROM users WHERE name = '" + userName + "';"

No table “users” exists

- LỖI KHÔNG LỌC KÝ TỰ ESCAPE

Người phát triển ứng dụng nên không cho phép dấu (‘), (-), (;) ở trong input

Page 8: Sql injection

GRAVITYCÁC DẠNG LỖI - LỖI KHÔNG KIỂM TRA DẠNG DỮ LIỆ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

• Lỗi 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

Page 9: Sql injection

GRAVITYVÍ DỤ - LỖI KHÔNG KIỂM TRA DẠNG DỮ LIỆU

Receipt 1213253412

statement = "SELECT * FROM sale WHERE name = " + receiptID + ";"

1213253412 Alex 123USD

Page 10: Sql injection

GRAVITYCÁC DẠNG LỖI - LỖI KHÔNG KIỂM TRA DẠNG DỮ LIỆU

Receipt 1;DROP TABLE users

statement = "SELECT * FROM sale WHERE name = " + receiptID + ";"

• Ta thấy đoạn code được viết với receiptID là một trường số

• Tuy vậy người viết lại không kiểm tra dữ liệu đầu vào có phải là số hay không

• Người tấn công có thể chèn vào receipt một đoạn script

1213253412 Alex 123USD

Page 11: Sql injection

GRAVITYCÁC DẠNG LỖI - BLIND SQL INJECTION

• Trang web tồn tại lỗi SQL Injection nhưng đoạn dữ liệu nhập vào để khai thác lỗi không làm hiện kết quả cho người tấn công

• Một dạng phổ biến của blind SQL Injection là dùng những câu truy vấn điều kiện để khai thác thông tin (như if .. else)

Page 12: Sql injection

GRAVITYVÍ DỤ - BLIND SQL INJECTION

• Một ứng dụng web dùng MySQL

• Ứng dụng web được dùng để theo dõi tình hình của một trang trại trứng

• Trang web ở dưới đưa ra dữ liệu của những quả trứng chưa nở:

SELECT COUNT(chick_id) FROM chickens WHERE status='Incubating'

Page 13: Sql injection

GRAVITYVÍ DỤ - BLIND SQL INJECTION

• Ta thay đổi lệnh truy vấn thành:SELECT COUNT(chick_id) FROM chickens WHERE status='Incubating' and ‘1’='2'

• Do 1 = 2 là false, trang web thông báo không thể tìm thấy dũ liệu nào

Page 14: Sql injection

GRAVITYVÍ DỤ - BLIND SQL INJECTION

• Giả sử thay lệnh truy vấn thành

SELECT COUNT(chick_id) FROM chickens WHERE status='Incubating' and substring(@@version,1,1)=4

• Nếu như trang web tìm ra được dữ liệu => Version của MySQL là 4

• Nếu như trang web không tìm ra được dữ liệu => Version của MySQL không phải là 4

Page 15: Sql injection

GRAVITYCÔNG CỤ TÌM KIẾM LỖ HỔNG

• Để tìm ra lỗ hổng SQL thường tốn rất nhiều bước và khá phức tạp

• Vì thế, có rất nhiều công cụ để phục vụ kiểm tra và tìm kiếm lỗ hổng SQL

• Ví dụ:• SQLmap• Bobcat• Absinthe• SQLninja

Page 16: Sql injection

GRAVITYCÔNG CỤ TÌM KIẾM LỖ HỔNG - SQLMAP

• SQLmap là công cụ mở để phục vụ tìm kiếm và kiểm tra lỗ hổng SQL

• Công cụ được viết bằng python nên có thể chạy trên nhiều hệ điều hành

• Một ví dụ chạy sqlmap

$ python sqlmap.py -u "http://www.victim.com/get_int.php?id=1" --union-use--passwords -U SYS<snip>[hh:mm:50] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic….[hh:mm:51] [INFO] GET parameter 'id' is unescaped numeric injectable with 0parenthesis….[hh:mm:51] [INFO] the back-end DBMS is Oracleweb server operating system: Linux Ubuntu 8.10 (Intrepid Ibex)web application technology: PHP 5.2.6, Apache 2.2.9back-end DBMS: Oracle

Page 17: Sql injection

GRAVITYCÁCH PHÒNG TRÁNH

• Lấy dữ liệu trực tiếp của người dùng nhập vào qua một tham số cho một hàm để

được kiểm tra và xử lý

$stmt = $dbh->prepare("SELECT * FROM users WHERE USERNAME = ? AND PASSWORD = ?");$stmt->execute(array($username, $pass));

Page 18: Sql injection

GRAVITYCÁCH PHÒNG TRÁNH

• Thay ký tự escape thành ký tự khác

$mysqli = new mySqli('hostname', 'db_username', 'db_password', 'db_name');$query = sprintf("SELECT * FROM `Users` WHERE UserName='%s' AND Password='%s'", $$mysqli->real_escape_string($Username), $$mysqli->real_escape_string($Password));$mysqli->query($query);

Page 19: Sql injection

GRAVITYCÁCH PHÒNG TRÁNH

• Chuyển dữ liệu nhập vào thành dạng khác

• Ví dụ :

• Ký tự được nhập vào là "5' or '1'='1'"

SELECT * FROM users WHERE id = unhex(‘35262333393b206f7220262333393b31262….’)