Khái niệm SQL injection

Download Report

Transcript Khái niệm SQL injection

SQL injection
Nội dung
• Khái niệm
• Các dạng lỗi thường gặp
• Cách khắc phục
Khái niệm
• SQL injection là một kỹ thuật chèn vào
những đoạn mã SQL bất hợp pháp cho
phép khai thác một lỗ hổng bảo mật tồn tại
trong cơ sở dữ liệu của một ứng dụng. Từ
đó toàn quyền trên cơ sở dữ liệu của ứng
dụng, thậm chí là server mà ứng dụng đó
đang chạy.
Các dạng lỗi thường gặp
• Không kiểm tra ký tự thoát truy vấn
statement ="SELECT * FROM users WHERE name =
'"+ userName +"';"
a' or 't'=‘t
SELECT*FROM users WHERE name ='a'OR't'='t';
Các dạng lỗi thường gặp
• Xử lý không đúng kiểu
statement :="SELECT * FROM data WHERE id =
"+ a_variable +";"
1;DROP TABLE users
SELECT*FROMDATAWHERE id=1;DROP TABLE
users;
Các dạng lỗi thường gặp
• Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu
– Đôi khi lỗ hổng có thể tồn tại chính trong
phần mềm máy chủ cơ sở dữ liệu.
– Ví dụ: hàm mysql_real_escape_string() của
các máy chủ MySQL.
Các dạng lỗi thường gặp
• Blind SQL injection
– 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.
• Thay đổi giá trị điều kiện truy vấn
– Dạng lỗi này khiến cho kẻ tấn công có thể
thay đổi giá trị điều kiện trong câu truy vấn,
làm sai lệch sự hiển thị của một ứng dụng
chứa lỗi này.
Một số dạng tấn công thường gặp với
các ứng dụng web
• Vượt qua kiểm tra lúc đăng nhập
strSQL ="SELECT * FROM T_USERS "& _"WHERE
USR_NAME='
"& vUsrName
Đăng
nhập & _ " ' and
USR_PASSWORD=' "& vPassword &" ' "
Thành
'OR=
Công
SELECT*FROM T_USERS WHERE USR_NAME
=''OR''=''AND USR_PASSWORD=''OR''=‘’
Một số dạng tấn công thường gặp với
các ứng dụng web
• Sử dụng câu lệnh SELECT
strSQL = "SELECT * FROM T_AUTHORS WHERE
AUTHOR_NAME =' " & _ vAuthorName & " ' "
' UNION SELECT ALL SELECT OtherField FROM
OtherTable WHERE ' '=' (*)
' DROP TABLE T_AUTHORS --
Một số dạng tấn công thường gặp với
các ứng dụng web
• Sử dụng câu lệnh INSERT
strSQL = "INSERT INTO TableName VALUES(' " &
strValueOne & " ', ' " _ & strValueTwo & " ', ' " &
strValueThree & " ') “
INSERT INTO TableName VALUES(' ' + (SELECT TOP 1
FieldName FROM TableName) + ' ', 'abc', 'def')
SELECT TOP 1 FieldName FROM TableName
Một số dạng tấn công thường gặp với
các ứng dụng web
• Sử dụng stored-procedures
– Tấn công bằng stored-procedures sẽ gây tác
hại rất lớn nếu ứng dụng được thực thi với
quyền quản trị hệ thống 'sa'.
' ; EXEC xp_cmdshell ‘cmd.exe dir C: '
– Lúc này hệ thống sẽ 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.
Cách khắc phục SQL Injection
• Đối với lập trình viên:
– Cần kiểm tra tính đúng đắn của tất cả dữ
liệu đầu vào. Dữ liệu đầu vào không chỉ là
các tham số, mà bao gồm cả cookie, user
agent, referer …
• Đối với web server
– Hầu hết các web server hiện nay đều có các
module hỗ trợ việc phòng chống SQL
Injection, ví dụ, Apache có modsecurity, IIS
có URLScan.
Cách khắc phục SQL Injection
• Đối với database server
– Cần có cơ chế kiểm soát chặt chẽ và giới
hạn quyền xử lí dữ liệu đến tài khoản người
dùng.
– Loại bỏ các thông tin kỹ thuật chứa trong
thông báo lỗi gửi đến cho người dùng.
HIDDEN FIELD
Nội dung
• Khái niệm
• Các vấn đề gặp phải
• Cách khắc phục
Khái niệm
• Khi thiết kế ứng dụng web để giữ kết nối giữa
Client và Server sử dụng 1 số cách cookie,
encode URL và HTTP
• Việc sử dụng form hidden field thường được
sử dụng vì có thể chứa nhiều dữ liệu, nhưng
đây là một phương thức không an toàn nếu
chứa các dữ liệu nhạy cảm.
Ví dụ
<Form action=http://congty.com/shop.php Method=POST>
...
<input type=hidden name=price value="99.99">
…
</Form>
Các vấn đề gặp phải
• Request lúc gửi lên Server:
POST /shop.php HTTP/1.0
....
price=99.99
• Request đã bị chỉnh sửa:
POST /shop.php HTTP/1.0
....
price=0.99
Các cách thức khắc phục
• Không dùng hidden field để lưu các giá trị cho
chuỗi truy vấn.
• Kiểm tra tính hợp lệ của dữ liệu được truyền
lên từ client.
• Sử dụng hash để bảo đảm giữ liệu không bị
giả mạo.
• Sử dụng SSL.
• Mã hóa tên cũng như giá trị của các trường
hidden field với key được tạo ra từ máy chủ.