4. Khái niệm SQL
╸ SQL là viết tắt của Structured
Query Language
╸ Ngôn ngữ truy vấn có cấu
trúc
╸ xác định dữ liệu trong cơ sở
dữ liệu và thao tác dữ liệu
4
5. Thành phần tạo lệnh truy vấn SQL
╸ SELECT
╸ INSERT
╸ UPDATE
╸ DELETE
╸ DROP
╸ UNION -
╸ WHERE
╸ AND/OR
╸ LIMIT
╸ ORDER BY
5
╸ CREATE
╸ ALTER
╸ DROP
Data Definition Language Data Manipulation Language
7. Khái niệm SQL Injection
Kỹ thuật tiêm nhiễm mã độc vào
câu truy vấn SQL và thi hành các
câu lệnh SQL bất hợp pháp trên
cơ sở dữ liệu của máy chủ Web
7
8. 01
02
03
04
05
Tiến hành tiêm nhiễm chuỗi ký tự độc hại
Máy chủ web tiếp nhận chuỗi ký tự độc hại
Truy vấn được thực hiện trong hệ quản
trị CSDL
Kẻ tấn công nhận được thông tin nhạy cảm
Các bước thực hiện của 1 cuộc tấn công SQL Injection
Máy chủ web ghép ký tự đọc hại vào
câu truy vấn
14. Error-based SQLi
SQLi dựa vào thông
báo lỗi được trả về từ
Database Server có
chứa thông tin về cấu
trúc của cơ sở dữ liệu
In-band SQLi
Union-based SQLi
SQLi lợi dụng toán tử
UNION trong ngôn ngữ
SQL lấy tổng hợp kết
quả của 2 hay nhiều câu
truy vấn SELECT trong
cùng 1 kết quả và được
trả về
14
15. Blind-Boolean-Based
SQLi bắt buộc ứng
dụng trả về các kết
quả khác nhau phụ
thuộc vào câu truy
vấn là True hay False
Inferential SQLi
Time-Based-Blind
SQLi buộc cơ sở dữ liệu
phải chờ một khoảng
thời gian trước khi phản
hồi
15
16. Out-of-band SQLi
╸ Phụ thuộc vào các tính năng được bật trên
Database Server
╸ Thực hiện các request DNS hoặc HTTP để
chuyển dữ liệu cho kẻ tấn công
16
18. Vượt đăng nhập
╸ Cho phép người dùng truy cập vào
các trang web được bảo mật yêu
cầu tài khoản và mật khẩu
18
19. Câu truy vấn thông thường ở DB sử dụng MySQL:
SELECT * FROM users WHERE username = ‘a123’ AND password = ‘adc‘
19
Đăng nhập với tài khoản hợp lệ
Nhập username và password Kết quả đăng nhập thành công
20. Hacker đăng nhập
Hacker login với username = `hacker‘or 1=1-- -` và password = `111`
Lúc này câu truy vấn ở Server:
SELECT * FROM users WHERE username='hacker' OR 1=1 -- - ' AND
password='111‘
Hacker đã lợi dụng ký tự ‘-- -’ trong SQL để loại bỏ kiểm tra mật khẩu
20
23. 23
Lợi dụng các sơ hở trong các
thông báo lỗi từ hệ thống để dò
tìm các điểm yếu khởi đầu cho
việc tấn công
24. Khai thác website qua URL bằng Select
╸ Ta thường thấy url: `index.php?id=21`, `index.asp?id=6`, …
╸ Câu truy vấn: SELECT * FROM Products WHERE
Product_ID=`21`
╸ Thêm các kí tự dấu nháy đơn ('), dấu nháy kép ("), phần trăm
27 (%27), 00 phần trăm (00%) vào sau id để kiểm tra nếu nó
hiện ra lỗi hoặc không
24
28. ╸ Ứng dụng web cho phép người dùng đăng kí một tài
khoản để tham gia.
╸ Người dùng đăng nhập, xem và hiệu chỉnh thông tin của
mình. SQL injection có thể được dùng khi hệ thông
không kiểm tra tính hợp lệ của thông tin nhập vào.
28
29. Một câu lệnh INSERT có thể có cú pháp dạng:
INSERT INTO TableName VALUES(‘Value One’, ‘Value Two’, ‘Value
Three’)
Nếu đoạn mã xây dựng câu lệnh SQL có dạng :
<% strSQL = “INSERT INTO TableName VALUES(‘ ” & strValueOne & ”
‘, ‘ ” _ & strValueTwo & ” ‘, ‘ ” & strValueThree & ” ‘) ” Set objRS =
Server.CreateObject(“ADODB.Recordset”) objRS.Open strSQL,
“DSN=…” … Set objRS = Nothing %>
Thì chắc chắn sẽ bị lỗi SQLi, bởi vì nếu ta nhập :
‘ + (SELECT TOP 1 FieldName FROM TableName) + ‘
29
30. Thì chắc chắn sẽ bị lỗi SQLi, bởi vì nếu ta nhập :
‘ + (SELECT TOP 1 FieldName FROM TableName) + ‘
Lúc này câu truy vấn sẽ là :
INSERT INTO TableName VALUES(‘ ‘ + (SELECT TOP 1 FieldName
FROM TableName) + ‘ ‘, ‘abc’, ‘def’)
Khi đó, lúc thực hiện lệnh xem thông tin, xem như bạn đã yêu cầu thực hiện
thêm một lệnh nữa đó là:
SELECT TOP 1 FieldName FROM TableName
30
31. Sử dụng ký tự độc để thực hiện các câu
lệnh Update/Delete
Câu truy vấn tìm kiếm:
SELECT * FROM products WHERE product_name = ‘ & search_name &’
Truy vấn bị chèn mã Delete:
SELECT * FROM products WHERE product_name = ‘iphone12 promax’;
DELETE FROM products; -- ‘
Truy vấn bị chèn mã Update:
SELECT * FROM products WHERE product_name = ‘iphone12 promax’;
UPDATE products SET product_name = ‘1$’ --'
31
33. Stored Procedure là bao gồm các câu lệnh Transact-SQL và được lưu lại trong cơ
sở dữ liệu. Các lập trình viên chỉ cần gọi ra và thực thi thông qua SQL Server
Management Studio hoặc ngay trong ứng dụng
33
34. SQLi đối với Stored Procedure
╸ Stored Procedure splogin gồm hai tham số là username và password, nếu
kẻ tấn công nhập:
`Username: thanhcong Password: ' ; shutdown- -`
Lệnh gọi stored procedure như sau:
EXEC splogin 'thanhcong','';shutdown- -'
Lệnh shutdown thực hiện dừng sql server ngay lập tức
34
35. Với câu lệnh:
EXEC xp_cmdshell 'cmd.exe dir C: '
Lúc này hệ thống sẽ thực hiện lệnh liệt kê thư mục trên ổ đĩa C: cài
đặt server. Việc phá hoại kiểu nào tuỳ thuộc vào câu lệnh đằng sau
cmd.exe.
35
37. Sử dụng ORM
╸ Chúng ta hạn chế viết SQL thuần mà toàn sử dụng ORM
(Object-Relational Mapping) framework
╸ Các framework web này sẽ tự tạo câu lệnh SQL nên hacker
cũng khó tấn công hơn.
37
39. Ta lọc các kí tự đặc
biệt (; ” ‘) hoặc các từ
khoá (SELECT, UNION)
do người dùng nhập
vào
39
40. ╸ Không hiển thị exception, message lỗi: Hacker dựa vào
message lỗi để tìm ra cấu trúc database
╸ Phân quyền rõ ràng trong DB, không dùng account: `root`
hay `sa`
╸ Backup dữ liệu thường xuyên
╸ Sử dụng các module hỗ trợ phòng chống SQLi như:
Modsecurity trong Apache, URLScan của IIS
40