1. Trang chủ
  2. » Luận Văn - Báo Cáo

Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service

69 1,7K 5

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 69
Dung lượng 3,1 MB

Nội dung

1.2.1 Khái niệm SQL Injection SQL injection là kĩ thuật tấn công web lợi dụng lỗ hổng trong việc kiểm tra dữ liệu đầu vào của ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ

Trang 1

KHOA CÔNG NGHỆ THÔNG TIN

Phát hiện và ngăn chặn tấn công bằng SQL

INJECTION vào cơ sở dữ liệu sử dụng Web service

Trang 2

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

Trang 3

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

Trang 4

CHƯƠNG 1 : TỔNG QUAN VỀ SQL INJECTION 8

1.1 Đặt vấn đề 8

1.1.1 Đặc trưng của các ứng dụng sử dụng cơ sở dữ liệu 8

1.1.2 Tính chất nghiêm trọng của các cuộc tấn công. 9

a) Các thống kê lịch sử 9

b) Các thống kê an ninh 10

1.2 SQL Injection. 13

1.2.1 Khái niệm SQL Injection 13

1.2.2 Nguyên nhân gây ra lỗi SQL Injection 14

a) Không kiểm tra dữ liệu đầu vào 14

b) Xử lý không đúng kiểu 14

c) Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu 15

1.2.3 Tác hại từ các cuộc tấn công SQL Injection 16

1.3 Tổng kết chương 16

CHƯƠNG 2 : CÁC HÌNH THỨC TẤN CÔNG SQL INJECTION PHỔ BIẾN 18

2.1 Các hình thức tấn công SQL Injection phổ biến 18

2.1.1 Vượt qua kiểm tra lúc đăng nhập (Bypass Login) 18

2.1.2 Dạng tấn công thu thập thông tin dựa trên các phản hồi từ database. 20

a) Tìm điểm yếu của website 20

b) Tìm kiếm các thông tin về cơ sở dữ liệu 21

c) Tìm kiếm trang quản trị 26

d) Tiến hành phá hoại 26

e) Kết luận 26

2.1.3 Blind SQL Injection 27

2.1.3.1 Thực hiện tấn công Blind SQL Injection dựa trên phản hồi 28

2.1.3.2 Thực hiện tấn công Blind SQL Injection dựa trên độ trễ truy vấn 30

2.1.4 Dạng tấn công sử dụng các stored-procedure. 32

2.1.5 Một số cách qua mặt bộ lọc đầu vào. 33

2.2 Cách phòng tránh SQL Injection 34

Trang 5

CHƯƠNG 3 : DỊCH VỤ WEB (WEB SERVICE) 38

3.1 Tìm hiểu về Web Service. 38

3.2 Đặc điểm của dịch vụ web 41

3.2.1 Đặc điểm 41

3.2.2 Ưu và nhược điểm 42

3.2.3 Kiến trúc của dịch vụ web 43

3.2.4 Các thành phần của dịch vụ web 45

3.2.4.1 XML – eXtensible Markup Language 45

3.2.4.2 WSDL - Web Service Description Language 46

3.2.4.3 Universal Description, Discovery, and Integration (UDDI) 47

3.2.4.4 SOAP - Simple Object Access Protocol 48

3.2.5 An toàn cho dịch vụ Web 50

3.2.6 Xây dựng một dịch vụ Web 52

3.2.7 Tích hợp dịch vụ Web theo chuẩn 53

3.3 Xây dựng một web service đơn giản 55

3.4 Tổng kết chương 59

CHƯƠNG 4 : PHÒNG CHỐNG SQL INJECTION BẰNG WEB SERVICE 60

4.1 Đặt vấn đề 60

4.2 Cơ sở lý thuyết 60

4.3 Nguyên tắc hoạt động 62

4.4 Triển khai thực tế. 63

4.4.1 Dịch vụ killChars 63

4.4.2 Dịch vụ Db_2_XML 64

4.4.3 Dịch vụ XPath_XML_Validation 65

4.4.4 Kiểm tra tính hiệu quả của web service. 66

4.5 Hướng phát triển 67

KẾT LUẬN 68

Trang 6

trọng của các công ty, tập đoàn, các tổ chức cơ quan, chính phủ trong cuộc sống xã hội hiện đại Vấn đề an ninh và bảo mật là chìa khóa tất yếu thành công trong các lĩnh vực kinh tế, chính trị, an ninh quốc phòng và góp phần thúc đẩy sự phát triển toàn cầu nhanh chóng, liên kết khoảng cách địa lý, không gian, thời gian các nơi trên thế giới gần với nhau mà vẫn đảm bảo được

Tại Việt Nam, đã qua thời kì các quản trị website lơ là việc quét virus, cập nhật các bản vá lỗi từ các phần mềm hệ thống, nhưng việc chăm sóc các lỗi của các ứng dụng lại rất ít được quan tâm Đó là lí do tại sao trong thời gian vừa qua, không ít website tại Việt Nam bị tấn công và đa số đều là lỗi SQL injection Vậy SQL injection là gì ? Nguyên nhân ? Hậu quả ? Cách phòng tránh ?

Được sự hướng dẫn nhiệt tình và chu đáo của thầy Ngô Văn Công, trong 3

tháng làm đề tài tốt nghiệp, em đã tìm hiểu và nghiên cứu đề tài : “Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng Web service”

Trang 7

công phổ biến, cách khắc phục … Từ đó, giúp cho các bạn trẻ mới bước vào thế giới lập trình có nền tảng về vấn đề bảo mật, an ninh mạng, xây dựng được những website có độ an toàn cao

Đề tài của em cũng đề cập đến một loại hình đang phát triển thời gian gần đây là Web Service (Dịch vụ mạng), ưu – nhược điểm, các thành phần chủ yếu, cách xây dựng, bảo mật cho web service …

Từ đó, em kết hợp 2 vấn đề trên tạo nên một giải pháp phòng chống SQL Injection mới bằng webservice Đây là phương pháp hứa hẹn có thể giải quyết triệt

để các cuộc tấn công SQL Injection mà các phương pháp trước đây chưa hoàn thiện Trong phạm vi kiên thức của mình, em xin trình bày những hiểu biết của em

về “Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu

sử dụng Web service”.” trong bài đồ án này

Trang 8

CHƯƠNG 1 TỔNG QUAN VỀ SQL INJECTION 1.1 Đặt vấn đề

1.1.1 Đặc trưng của các ứng dụng sử dụng cơ sở dữ liệu

Hiện nay, không khó để nhận ra rằng những ứng dụng phổ biến nhất và chiếm thị phần cũng như doanh thu cao nhất đều là những ứng dụng hỗ trợ tính năng quản lý Dữ liệu là thứ sống còn trong mọi hoạt động nghiệp vụ hiện tại Chính vì lý do đó, các ứng dụng nghiệp vụ hiện tại đều xây dựng trên những mô hình phát triển gắn liền với cơ sở dữ liệu An toàn của dữ liệu phụ thuộc vào độ bảo mật của ứng dụng web kết nối tới cơ sở dữ liệu

Các mô hình phát triển ứng dụng Web hiện tại được sử dụng phổ biến nhất là 3 tầng, ngoài ra còn có một số bản cải tiến, mở rộng mô hình này nhằm những mục đích riêng

Hình 1-1 Mô hình ứng dụng 3 tầng

Trang 9

Hình 1-2 Mô hình ứng dụng 4 tầng Các mô hình trên luôn có một số điểm chung, đó là database server chỉ làm nhiệm vụ lưu trữ dữ liệu, database hồi đáp những truy vấn dữ liệu được xây dựng theo chuẩn (ví dụ như SQL) Mọi thao tác xử lý dữ liệu input, output của database server đều được ứng dụng web ở tầng Logic xử lý Các vấn đề an ninh phát sinh đa phần sẽ nằm ở tầng này

1.1.2 Tính chất nghiêm trọng của các cuộc tấn công

a) Các thống kê lịch sử

- Ngày 01/11/2005, một hacker tuổi vị thành niên đã sử dụng SQL injection để xâm nhập trang chủ của một tạp chí an ninh thông tin Đài Loan từ nhóm Tech Target và ăn cắp thông tin khách hàng

- Ngày 13/01/2006, tội phạm máy tính Nga đã xâp nhập trang web của chính phủ đảo Rhode và ăn cắp dữ liệu thẻ tín dụng từ những cá nhân

đã giao dịch với các cơ quan nhà nước

- Ngày 29/07/2007, một tội phạm máy tính đã bôi nhọ trang web của Microsoft tại Vương quốc Anh bằng SQL injection Trang web The Register của Anh đã dẫn lời phát ngôn viên của Microsoft thừa nhận vấn đề này

Trang 10

- Vào tháng 1 năm 2008, hàng chục ngàn máy tính cá nhân đã bị nhiễm một mã SQL injection tự động Loại mã độc này đã khai thác một lỗ hổng trong đoạn mã chương trình sử dụng Microsoft SQL Server

- Cuộc tấn công website BGD&ĐT www.moet.gov.vn ngày 27.11.2006

- Một trong những vụ tấn công SQL Injection nổi tiếng nhất là vụ tấn công vào CardSystems Solutions

b) Các thống kê an ninh

Theo WhiteHat - một tổ chức có uy tín trong việc nghiên cứu và hỗ trợ các vấn đề an ninh mạng, SQL Injection nằm trong 10 lỗi bảo mật phổ biến nhất hiện nay

 10 lỗi bảo mật phổ biến gần đây nhất :

Hình 1-3 Thống kê 10 lỗi bảo mật phổ biến nhất (3/2008)

Trang 11

Hình 1-4 Thống kê 10 lỗi bảo mật phổ biến nhất (2/2009)

 Thời gian trung bình cần để khắc phục các lỗ hổng bảo mật :

Hình 1-5 Thống kê thời gian trung bình khắc phục các lỗ hổng bảo mật (8/2008)

Trang 12

Hình 1-6 Thống kê thời gian trung bình khắc phục các lỗ hổng bảo mật (2/2009)

 Tỉ lệ lỗ hổng bảo mật thường xuyên bị khai thác :

Hình 1-7 Thống kê tỉ lệ lỗ hổng bảo mật thường xuyên bị khai thác (2/2010)

Trang 13

1.2 SQL Injection

1.2.1 Khái niệm SQL Injection

SQL injection là kĩ thuật tấn công web lợi dụng lỗ hổng trong việc kiểm tra dữ liệu đầu vào của ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ liệu

Nó cho phép kẻ tấn công chèn vào các đoạn mã SQL bất hợp pháp với mục đích khai thác lỗ hổng bảo mật tồn tại trong cơ sở dữ liệu của một ứng dụng Lỗ hổng bảo mật này có thể xuất hiện khi ứng dụng không có sự kiểm tra chuỗi ký tự đầu vào trong câu truy vấn SQL, hoặc do sự định kiểu đầu vào không rõ ràng, hay do lỗi cú pháp SQL của lập trình viên khiến cho một đoạn mã độc hại có thể được xử lý ngoài ý muốn

SQL Injection là một dạng tấn công dễ thực hiện, hầu hết mọi thao tác người tấn công cần được thực hiện với một trình duyệt web, có thể kèm theo một ứng dụng proxy server Chính vì đơn giản như vậy cho nên bất cứ ai cũng có thể học cách tiến hành một cuộc tấn công Lỗi bắt nguồn từ mã nguồn của ứng dụng web chứ không phải từ phía database, chính vì thế bất cứ thành phần nào của ứng dụng mà người dùng có thể tương tác được để điều khiển nội dung (ví dụ : các form, tham số URL, cookie, tham số referrer, user-agent,

…) đều có thể được sử dụng để tiến hành chèn truy vấn có hại

Lỗi này thường xảy ra trên các ứng dụng web có dữ liệu được quản lí bằng các hệ quản trị CSDL như MySQL, SQL Server, Oracle, DB2, Sysbase

Công cụ dùng để tấn công là một trình duyệt web bất kì, chẳng hạn như Internet Explorer, FireFox, Chrome, Netscape, Lynx,

Trang 14

1.2.2 Nguyên nhân gây ra lỗi SQL Injection

a) Không kiểm tra dữ liệu đầu vào

Đây là dạng lỗi SQL Injection 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 Kết quả là người dùng cuối 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 Câu lệnh sau sẽ minh họa lỗi này:

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

Câu lệnh này được thiết kế để trả về các bản ghi tên người dùng cụ thể

từ bảng những người dùng Tuy nhiên, nếu biến userName được nhập theo

một cách có chủ ý, nó có thể trở thành một câu truy vấn SQL với mục đích khác hẳn so với mục đích của đoạn mã trên

Ví dụ, ta nhập vào giá trị của biến userName như sau :

' or '1'='1

Khiến câu truy vấn có thể được hiểu thành :

SELECT * FROM users WHERE name = '' or '1'='1';

Nếu đoạn mã trên được sử dụng trong một thủ tục xác thực thì sẽ bắt buộc phải lựa chọn một tên người dùng hợp lệ bởi điều kiện '1'='1' luôn đúng

b) Xử lý không đúng kiểu

Lỗi SQL injection dạng này thường xảy ra do lập trình viên đị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

Trang 15

đầu vào Điều này có thể 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 Ví

dụ như sau :

statement = "SELECT * FROM data WHERE id = " + id_ + ";"

Ta có thể nhận thấy một cách rõ ràng mục đích của đoạn mã trên là nhập vào một số tương ứng với trường id (kiểu số) Tuy nhiên, người dùng cuối, thay vì nhập vào một số, họ lại nhập vào một chuỗi ký tự, và do vậy có thể trở thành một câu truy vấn SQL hoàn chỉnh mới mà bỏ qua ký tự thoát Ví

dụ, ta nhập vào giá trị của biến id_ là :

1;DROP TABLE users

Câu truy vấn sẽ trở thành :

SELECT * FROM DATA WHERE id=1;DROP TABLE users

Khi đó, nó sẽ thực hiện thao tác xóa toàn bộ bảng users ra khỏi cơ sở

dữ liệu

c) 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, như là trường hợp hàm mysql_real_escape_string()của các máy chủ MySQL Điều này sẽ cho phép kẻ tấn công có thể thực hiện một cuộc tấn công SQL injection thành công dựa trên những ký tự Unicode không thông thường ngay cả khi dữ liệu đầu vào đã được kiểm soát

Trang 16

1.2.3 Tác hại từ các cuộc tấn công SQL Injection

Bằng cách chèn các mã SQL query/command vào input trước khi chuyển cho ứng dụng web xử lí, kẻ tấn công có thể login mà không cần username và password, remote execution, dump data và lấy root của SQL server Cho phép kẻ tấn công có thể thực hiện các thao tác xóa, hiệu chỉnh, …

do có toàn quyền trên cơ sở dữ liệu của ứng dụng

Tác hại từ các cuộc tấn công SQL Injection còn tùy thuộc vào môi trường và cách cấu hình hệ thống Trong SQL Server, nếu ứng dụng sử dụng

quyền dbo (quyền của người sở hữu CSDL - 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ị CSDL 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

1.3 Tổng kết chương

Dựa vào các thống kê trên có thể rút ra vài nhận xét về lỗi SQL Injection :

- Là một trong số những lỗi bảo mật phổ biến nhất

- Xác suất gặp phải lỗ hổng bảo mật loại này trong một website là khá cao

- Được sử dụng nhiều, lý do một phần bởi tính đơn giản, không đòi hỏi nhiều công cụ hỗ trợ

- Thời gian khắc phục các điểm yếu này thường khá lâu, do đó hậu quả thường nặng nề hơn

Trên thực tế, các cuộc tấn công SQL Injection thường nhắm đến các cơ

sở dữ liệu mang tính thương mại, ví dụ các website thương mại điện tử Thông thường, các cuộc tấn công này sẽ tiến hành sửa đổi nội dung của

Trang 17

database đối tượng và chèn các đoạn mã JavaScript độc Bản chất lỗ hỏng SQL Injection là xuất hiện từ trong quá trình xử lý dữ liệu đầu vào của người dùng bên trong mã nguồn, do chính thời gian bảo trì mã nguồn thường kéo dài nên các lỗi SQL Injection cũng chậm được khắc phục triệt để

Với tính nghiêm trọng của các cuộc tấn công, tính dễ thực hiện của một cuộc tấn công đã khiến cho SQL Injection một thời từng là hiểm họa nghiêm trọng đối với các giao dịch thương mại điện tử trên các ứng dụng Web được phát triển thiếu an toàn Hiện nay, việc nghiên cứu SQL Injection đã có hệ thống và toàn diện hơn, mối nguy hiểm này đã giảm đi, nhưng số liệu thống

kê vẫn cho thấy vấn đề này còn chưa được giải quyết triệt để

Ở nước ta, trong quá trình đào tạo, các lập trình viên ứng dụng Web được đào tạo nhiều kiến thức và kỹ năng cần thiết, tuy nhiên các kiến thức về bảo mật hầu như không được chú trọng đúng mức Điều này vô hình chung dẫn đến hệ quả là các sản phẩm của họ đều có nguy cơ mắc phải những vấn

đề về bảo mật, điều mà không đáng có nếu họ được trang bị tốt hiểu biết từ đầu

Trang 18

CHƯƠNG 2 CÁC HÌNH THỨC TẤN CÔNG SQL INJECTION PHỔ BIẾN 2.1 Các hình thức tấn công SQL Injection phổ biến

2.1.1 Vượt qua kiểm tra lúc đăng nhập (Bypass Login)

Với dạng tấn công này, tin tặc có thể dễ dàng vượt qua các trang đăng nhập nhờ vào lỗi khi dùng các câu lệnh SQL thao tác trên cơ sở dữ liệu của ứng dụng web Thông thường để cho phép người dùng truy cập vào các website được bảo mật, hệ thống thường xây dựng trang đăng nhập để yêu cầu người dùng nhập thông tin về tên đăng nhập và mật khẩu Sau khi người dùng nhập thông tin vào, hệ thống sẽ kiểm tra tên đăng nhập và mật khẩu có hợp lệ hay không để quyết định cho phép hay từ chối thực hiện tiếp Ví dụ, trong trường hợp sử dụng PHP, người ta có thể dùng 2 trang : 1 trang để hiển thị form nhập liệu và 1 trang khác để xử lý thông tin nhập vào từ phía người dùng như sau :

- Trang nhập dữ liệu : login.php :

<form method="post" action="authentication.php">

Username<input type="text" name="user_name"

Password<input type="password" name="password"

<input type="submit" value="Login" />

</form>

Trang 19

'OR'1'='1

Lúc này, câu truy vấn sẽ được gọi thực hiện là :

SELECT * FROM USER WHERE USER_NAME =''OR'1'='1' AND

PASSWORD= ''OR'1'='1'

Câu truy vấn này là hợp lệ và sẽ trả về tất cả các bản ghi của bảng USER và đoạn mã tiếp theo xử lí người dùng đăng nhập bất hợp pháp này như là người dùng đăng nhập hợp lệ

Trang 20

2.1.2 Dạng tấn công thu thập thông tin dựa trên các phản hồi từ

database

Thông thường, các database đều có tính năng thông báo lỗi xảy ra trong quá trình truy vấn dữ liệu Mục đích của tính năng này là giúp người quản trị có thể dễ dàng nhận biết và sửa lỗi dễ dàng hơn Tuy nhiên, nó lại là một điểm yếu bị lợi dụng trong các cuộc tấn công SQL Injection

Để thực hiện được kiểu tấn công này, kẻ tấn công phải có khả năng

sử dụng các câu lệnh SQL thông thường, biết cách lợi dụng 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

a) Tìm điểm yếu của website

Xét một liên kết bình thường sau :

http://www.xyz.com.vn/?a=news&id=46

Hình 2-1 Trạng thái bình thường của website Tuy nhiên, khi thay đổi liên kết trên bằng cách thêm ký tự vào liên kết : http://www.xyz.com.vn/?a=news&id=46’

Trang 21

Ta được một truy vấn không hợp lệ, database gửi thông báo lỗi cho trình duyệt :

You have an error in your SQL syntax; check the manual that corresponds

to your MySQL server version for the right syntax to use near '\' order

by id desc limit 10' at line 1

Hình 2-2 Trang web bị lỗi SQL Injection Điều này giúp kẻ tấn công nhận biết được website này bị lỗi SQL Injection Chúng sẽ tiến hành khai thác thông tin từ điểm yếu này

b) Tìm kiếm các thông tin về cơ sở dữ liệu

Sau khi đã tìm ra điểm lỗi của website, kẻ tấn công sẽ tiếp tục đào sâu tìm kiếm thông tin hữu ích về cơ sở dữ liệu Thứ tự các thông tin tìm kiếm trước để phục vụ cho thông tin tìm kiếm sau

 Tìm kiếm số cột :

Kẻ tấn công sẽ sử dụng câu lệnh ORDER BY để xác định số lượng cột trong bảng Mệnh đề ORDER BY được sử dụng để sắp xếp kết quả trả về bởi truy vấn theo cột được chỉ định Nếu cột đó không tồn tại, một thông báo lỗi trả được trả về

http://www.xyz.com.vn/?a=news&id=46 order by

1 Website vẫn hiển thị bình thường, vậy bảng hiện tại có ít nhất 1 cột,

ta tiếp tục tăng số cột dự đoán lên

http://www.xyz.com.vn/?a=news&id=46 order by 2 {bình thường}

Trang 22

… http://www.xyz.com.vn/?a=news&id=46 order by 9 {bình thường}

http://www.xyz.com.vn/?a=news&id=46 order by 10 {báo lỗi}

Unknown column '10' in 'order clause'

Hình 2-3 Lỗi không tìm thấy cột

 Kết luận, số lượng cột trong bảng là 9

 Tìm kiếm cột bị lỗi :

Kẻ tấn công sẽ sử dụng số lượng cột trong bảng tìm được ở trên là 9

để thực hiện bước tấn công tiếp theo Mục đích của công việc này đó là tìm cột có nội dung được hiển thị trên phản hồi, khi đó “nhúng” thông tin khai thác được vào đó Sử dụng các nội dung mang tính “chỉ điểm” cột có thể khai thác được như sau :

http://www.xyz.com.vn/?a=news&id=-46 union select

1,2,3,4,5,6,7,8,9 Database trả về kết quả câu truy vấn trên :

Hình 2-4 Các cột bị lỗi

 Thu được 2 con số là “3” và”5” là các cột bị lỗi

Trang 23

 Tìm kiếm phiên bản của hệ cơ sở dữ liệu đang sử dụng :

Mục đích của việc tìm kiếm phiên bản này là để kẻ tấn công xác định các bước tấn công kế tiếp Đối với mysql các phiên bản từ 5 trở lên, kẻ tấn công có thể sử dụng câu lệnh trực tiếp để lấy thông tin về cơ sở dữ liệu, đối với các phiên bản thấp hơn thì kẻ tấn công phải dùng phương pháp đoán tên bảng và tên cột

Kẻ tấn công sẽ thay vị trí số “3” trong câu truy vấn thành @@version

là câu lệnh để xác định phiên bản của hệ cơ sở dữ liệu đang sử dụng :

http://www.xyz.com.vn/?a=news&id=-46 union select

1,2,@@version,4,5,6,7,8,9 Hình 2-5 Phiên bản của hệ quản trị cơ sở dữ liệu đang dùng

 Kết quả trả về : 5.1.56

Vậy phiên bản mysql đang sử dụng là 5.1.56, điều này là hết sức có ích cho kẻ tấn công vì chúng có thể khai thác thông tin một cách dễ dàng hơn rất nhiều

 Tìm kiếm tên bảng :

Kẻ tấn công sẽ sử dụng hàm group_concat(table_name) kết hợp truy vấn trong bảng information_schema.tables (là bảng chứa thông tin về tất cả các bảng trong cơ sở dữ liệu) để tìm kiếm các bảng trong cơ sở dữ liệu :

http://www.xyz.com.vn/?a=news&id=-46 union select

1,2,group_concat(table_name),4,5,6,7,8,9 from information_schema.tables

where

Trang 24

table_schema=database() Kết quả trả về :

banner,dichvu,dmbn,entintuc,gioithieu,hoidap,khachhang,lienhe,loaisp,loai sp1,online,quantri3,sanpham,shoppingcart,tailieu,tintuc,useronline

Hình 2-6 Các bảng trong cơ sở dữ liệu Đây là các bảng có trong cơ sử dữ liệu của website Kẻ tấn công nhận thấy trong số này có bảng “quantri3” có khả năng là bảng chứa các thông tin

về người điều hành

 Tìm kiếm tên cột :

Sau khi chọn bảng dữ liệu nghi vấn, kẻ tấn công sẽ thực hiện tìm kiếm tên các cột có trong bảng Để thực hiện điều này, kẻ tấn công sẽ sử dụng hàm group_concat(column_name) và kết hợp truy vấn trong bảng

information_schema.columns (là bảng chứa thông tin về tất cả các cột trong bảng) Đồng thời, kẻ tấn công cũng chuyển tên bảng “quantri3” tìm được ở trên về dạng mã hex, tương ứng là “7175616e74726933” và thêm 0x vào trước, trở thành “0x7175616e74726933” để phục vụ cho quá trình tấn công

Truy vấn :

http://www.xyz.vn/?a=news&id=-46 union select

1,2,group_concat(column_name),4,5,6,7,8,9 from

information_schema.columns where

table_name=0x7175616e74726933 Kết quả thu được :

id,ten,matma,mail

Trang 25

Hình 2-7 Các cột có trong bảng

 Đây chính là 4 cột trong bảng “quantri3

 Lấy thông tin :

Sau khi đã tìm được tên các cột trong bảng dữ liệu nghi vấn, kẻ tấn công sẽ thực hiện việc lấy thông tin từ bảng này Để thực hiện việc này, kẻ tấn công sẽ sử dụng hàm group_concat(tên cột) và truy vấn ở bảng cần tìm Ở đây, để kết hợp việc lấy đồng thời cột “ten” và “matma”, kẻ tấn công sẽ sử dụng group_concat(ten,0x7c,matma) - 0x7c là kí tự | trong hệ hex, dùng để phân biệt cột “ten” và “matma”, không có nhiều ý nghĩa

Truy vấn :

http://www.xyz.com.vn/?a=news&id=-46 union select

1,2,group_concat(ten,0x7c,matma),4,5,6,7,8,9 from quantri3

Kết quả thu được :

admin|270799tuananh

Hình 2-8 Thông tin tài khoản người quản trị

 Đây chính là kết quả cuối cùng mà kẻ tấn công cần tìm - tài khoản của người quản trị mạng website http://www.xyz.com.vn

Trang 26

c) Tìm kiếm trang quản trị

Trong một website, những người quản trị sẽ có trang riêng để quản lý website, muốn vào được trang quản lý này thì người quản trị phải nhập đúng tài khoản của mình Với cách tấn công ở trên, kẻ tấn công đã thu được thông tin về tài khoản người quản trị Việc cuối cùng của kẻ tấn công bây giờ là tìm liên kết để vào trang quản trị

Ở bước này, kẻ tấn công sẽ dùng phép thử để tìm kiếm trang quản trị Phép thử ở đây chính là liên kết mà được dùng phổ biến nhất, ví dụ :

Đối với website trên, trang quản lý chính là :

Trang 27

tấn công một phần chứ không thể ngăn chặn chúng tấn công Còn rất nhiều cách khác áp dụng cho từng trường hợp

Như ta đã thấy, với kiểu tấn công này, ngay cả những kẻ tấn công không chuyên cũng có thể thực hiện được Chỉ cần một vài thao tác và câu lệnh đơn giản là mọi thông tin quan trọng của website đã rơi vào tay của kẻ xấu Điều này càng cho thấy mức độ nguy hiểm của SQL Injection

2.1.3 Blind SQL Injection

Để đề phòng SQL Injection, một số website đã tắt chức năng thông báo lỗi từ database Tuy nhiên, việc này chỉ có thể làm khó những kẻ tấn công không chuyên Đối với những kẻ có trình độ cao, họ sẽ sử dụng một phương pháp tấn công được gọi là Blind SQL Injection

Blind SQL Injection là một phương pháp thực hiện SQL Injection trong điều kiện các thông tin khai thác được không được trình bày trực tiếp trên nội dung phản hồi từ database Blind SQL Injection dựa vào việc sử dụng các mệnh đề điều kiện để thực hiện suy luận thông tin cần khai thác Cụ thể, Blind SQL Injection sử dụng chính các thông tin cần khai thác làm mệnh đề điều kiện (mệnh đề suy luận), và sử dụng các phương pháp khác nhau để

“đánh dấu” trường hợp đúng/sai của mệnh đề đó

Căn cứ vào phương pháp “đánh dấu” trường hợp đúng/sai của mệnh

đề quan hệ, ta chia ra hai cách chính thực hiện blind SQL Injection:

- Dựa vào nội dung phản hồi (response-based)

- Dựa vào độ trễ của thời gian phản hồi (time-based)

Các phương pháp thực hiện Blind SQL Injection có thể áp dụng cho các mô hình khác mà không gặp trở ngại nào, tuy nhiên chi phí thực hiện sẽ luôn cao hơn về mặt thời gian và số truy vấn cần thiết

Trang 28

2.1.3.1 Thực hiện tấn công Blind SQL Injection dựa trên phản hồi

Xét liên kết : http://www.xyz.com.vn/?a=news&id=46

Sau khi bị tấn công, người quản trị website trên đã thực hiện việc bảo mật bằng cách tắt các thông báo lỗi trả về từ database, với suy nghĩ rằng không có thông báo lỗi thì kẻ tấn công sẽ không biết dựa vào đâu để tấn công được

Tấn công bằng cách thông thường : Việc truy vấn bằng cách thêm ’ vào sau liên kết, hay sử dụng các hàm truy vấn đều không đem lại kết quả Trang web vẫn hiển thị một cách bình thường Lúc này kẻ tấn công sẽ sử dụng các phép thử đúng/sai để tấn công

Kẻ tấn công sẽ thử truy vấn bằng liên kết :

http://www.xyz.com.vn/?a=news&id=46 and 1=1

Hình 2-9 Trang web bình thường

Trang 29

Website vẫn hiển thị bình thường Thay truy vấn bằng :

http://www.xyz.com.vn/?a=news&id=46 and 1=2

Hình 2-10 Trang web bị lỗi Blind SQL Injection

Kết quả trả về một trang trắng, không có nội dung hiển thị

Lý do website hiển thị không đúng với vốn có của nó là bởi vì, mệnh

đề trước AND là một câu truy vấn cho kết quả đúng (http://www.xyz.com.vn/?a=news&id=46) , mệnh đề sau AND là một kết quả sai (1=2)

true AND true = true true AND false = false

Đó là nguyên nhân của việc website hiển thị không đúng

 Điều này cho thấy website trên vẫn chưa thực hiện một biện pháp phòng chống SQL Injection cụ thể nào Đây chính là cơ sở để kẻ tấn công tiếp tục cuộc tấn công của mình

Thực hiện các truy vấn tương tự, kẻ tấn công có thể dò được thông tin

về phiên bản, tên database, tên bảng, tên cột, thông tin người dùng

http://www.xyz.com.vn/?a=news&id=46 and substring(@@version,1,1)=4

Hình 2-11 Tìm kiếm phiên bản cơ sở dữ liệu bằng Blind SQL Injection

Trang 30

Website hiển thị một trang trắng, chứng tỏ điều kiện phiên bản là 4

sai => phiên bản của hệ quản trị cơ sở dữ liệu đang dùng lớn hơn 4

Tiếp tục phép thử :

http://www.tne.com.vn/?a=news&id=46 and substring(@@version,1,1)=5

Website hiển thị bình thường

 Kết luận : phiên bản đang sử dụng lớn hơn 5

2.1.3.2 Thực hiện tấn công Blind SQL Injection dựa trên độ trễ truy vấn

Tấn công Blind SQL Injection dựa vào thời gian phản hồi là cách tiến hành khai thác các lỗi Blind SQL Injection mạnh nhất Trong nhiều trường hợp tuy truy vấn có chứa điểm yếu, nhưng kết quả của truy vấn “sạch” với truy vấn “độc hại” không có sự khác biệt đáng kể, do đó rất khó để sử dụng Blind SQL Injection dựa trên phản hồi

Bản chất của phương thức tấn công này là thay vì sử dụng nội dung kết quả truy vấn để phân biệt trường hợp true/false của mệnh đề suy luận được chèn thì nó sử dụng sự chênh lệch về thời gian phản hồi của ứng dụng

để phân biệt Nếu điều kiện đúng thì sẽ thực hiện mệnh đề true (với thời gian t), sai thực hiện theo mệnh đề false ( với thời gian 5t,10t hay 15t tùy theo kẻ tấn công quy định) Sau đó kẻ tấn công chỉ cần so sánh thời gian thực hiện truy vấn để có thể kết luận được phép thử của mình là đúng hay sai Từ đó, kẻ tấn công có thể dò ra được nhiều thông tin về cơ sở dữ liệu website

Có hai phương pháp để sinh độ trễ trong truy vấn:

- Gọi các hàm trì hoãn thực thi được các hệ quản trị cơ sở dữ liệu hỗ trợ

- Sử dụng các truy vấn “lớn”

Trang 31

 Gọi các hàm trì hoãn thực thi :

Trên các hệ quản trị cơ sở dữ liệu thường có một số hàm có thể lợi dụng để sinh độ trễ về thời gian thực thi truy vấn Ví dụ:

- Trong MySQL ta có BENCHMARK(N, expression) hoặc ở phiên bản 5.0.12 trở đi có thêm SLEEP(seconds)

- Trong SQL Server có WAITFOR DELAY ‘hh:mm:ss’

- Trong Oracle có DBMS_LOCK.SLEEP(seconds)

Trong MySQL chúng ta sử dụng các cấu trúc điều kiện sau ứng với trường hợp tham số kiểu xâu ký tự hoặc số :

- Trường hợp tham số có kiểu xâu ký tự ta có thể dùng cấu trúc sau :

‘ union select if(expression, true_exp, false_exp)

- Trong đó expression là mệnh đề suy luận

- True_exp: câu lệnh/giá trị ứng với trường hợp mệnh đề suy luận nhận giá trị true

- False_exp: câu lệnh/giá trị ứng với trường hợp mệnh đề suy luận nhận giá trị false

- Trường hợp tham số kiểu số ta có thể sử dụng cấu trúc sau :

If(expression, true_exp, false_exp)

- Trong đó expression là mệnh đề suy luận

- True_exp: câu lệnh/giá trị ứng với trường hợp mệnh đề suy luận nhận giá trị true

- False_exp: câu lệnh/giá trị ứng với trường hợp mệnh đề suy luận nhận giá trị false

Trang 32

 Sử dụng các truy vấn lớn

Các truy vấn lớn ở đây được hiểu là các truy vấn trên những tập dữ liệu rất lớn, ví dụ dữ liệu metadata của database Khi thực hiện những truy vấn này bộ xử lý phải làm việc nhiều, và truy vấn sẽ bị trì hoãn một cách rất

“tự nhiên”

Truy vấn lớn hay dùng nhất là nối chéo các bảng dữ liệu (tích Cartesian) làm tập số lượng kết quả đã tăng lên rất lớn …

Mục tiêu thường được sử dụng nhất là bảng

information_schema.tables hay information_schema.columns với số lượng

thông tin rất lớn Nếu nối chéo các bảng này với nhau sẽ cho ta một số lượng

dữ liệu khổng lồ, có thể nhận thấy độ trễ bất thường khi thực hiện truy vấn

2.1.4 Dạng tấn công sử dụng các stored-procedure

Trong các hệ quản trị cơ sở dữ liệu, các lập trình viên đã tạo sẵn cho người dùng một số hàm có sẵn, phục vụ mục đích truy vấn cơ sở dữ liệu dễ dàng hơn Các stored-procedure này đều bắt đầu bằng “xp_”, ví dụ xp_cmdshell, xp_startmail, xp_sendmail, xp_makewebtask … với các mục đích sử dụng khác nhau

Để sử dụng các stored-procedure này thì ứng dụng phải được cấp

quyền Trong SQL Server, một số quyền mặc định bao gồm dbo (quyền của

người sở hữu cơ sở dữ liệu) - 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); sa (quyền quản trị hệ thống) - 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

Đây là một trong những lỗ hỏng chết người mà những kẻ tấn công có

thể khai thác Nếu ứng dụng lỗi SQL Injection có quyền dbo hay sa thì việc

sử dụng các stored-procedure sẽ rất dễ dàng

Trang 33

Đầu tiên, kẻ tấn công sẽ tìm kiếm trang bị lỗi SQL Injection một cách thông thường Sau đó, họ sẽ chèn vào các câu lệnh điều khiển các stored-procedure với mục đích tìm kiếm thông tin về server, các website nằm cùng server, xóa dữ liệu server …

Ví dụ, nếu kẻ tấn công chèn vào một form login, một liên kết, hay trang tìm kiếm của website bị lỗi SQL Injection đoạn mã sau :

' ; 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

Hoặc :

' ; EXEC xp_cmdshell ‘cmd.exe format C: '

Tương đương với việc xóa sạch toàn bộ dữ liệu ở ổ đĩa C của server

2.1.5 Một số cách qua mặt bộ lọc đầu vào

Để phòng chống các cuộc tấn công SQL Injection, hầu hết các website đều sử dụng các bộ lọc để lọc dữ liệu đầu vào Các bộ lọc này làm việc theo nguyên tắc lọc các kí tự đặc biệt trong dữ liệu nhập từ người dùng

Ví dụ :

Truy vấn từ người dùng :

http://www.xyz.com.vn/?a=news&id=-46 union select

1,2,group_concat(ten,0x7c,matma),4,5,6,7,8,9 from

Trang 34

quantri3 Sau khi qua bộ lọc sẽ trở thành :

http://www.xyz.com.vn/?a=news&id=-46

1,2,group_concat(ten,0x7c,matma),4,5,6,7,8,9 from

quantri3 Bộ lọc đã lọc đi các từ đặc biệt như union, select, order by … vô hiệu hoá các câu truy vấn của kẻ tấn công

Cách này tương đối hiệu quả, tuy nhiên vẫn bị một số kẻ tấn công trình độ cao qua mặt Kẻ tấn công có thể thay thế các lệnh SQL thông thường bằng cách thay đổi kí tự hoa thường của chúng Ví dụ :

“UNION” thay thế cho “union”

“SELeCt” thay thế cho “select”

“OrdeR BY” thay thế cho “order by”

Hoặc, kẻ tấn công cũng có thể mã hóa các lệnh trên về hệ hex Từ đó

có thể qua mặt các bộ lọc

2.2 Cách phòng tránh SQL Injection

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 Để phòng tránh, ta có thể thực hiện ở hai mức :

2.2.1 Về phía người quản trị website

 Kiểm soát chặt chẽ dữ liệu đầu vào

Để phòng tránh các nguy cơ có thể xảy ra, hãy bảo vệ các câu lệnh SQL là bằng cách kiểm soát chặt chẽ tất cả các dữ liệu nhập nhận được từ người dùng Ví dụ, có thể giới hạn chiều dài của chuỗi nhập liệu, hoặc xây

dựng hàm EscapeQuotes để thay thế các dấu nháy đơn bằng 2 dấu nháy đơn

như sau :

<%

Function EscapeQuotes(sInput) sInput = replace(sInput, " ' ", " ' ' ") EscapeQuotes = sInput

Ngày đăng: 31/08/2014, 08:02

HÌNH ẢNH LIÊN QUAN

Hình 1-1. Mô hình ứng dụng 3 tầng - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 1 1. Mô hình ứng dụng 3 tầng (Trang 8)
Hình 1-2. Mô hình ứng dụng 4 tầng - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 1 2. Mô hình ứng dụng 4 tầng (Trang 9)
Hình 1-3. Thống kê 10 lỗi bảo mật phổ biến nhất (3/2008) - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 1 3. Thống kê 10 lỗi bảo mật phổ biến nhất (3/2008) (Trang 10)
Hình 1-4. Thống kê 10 lỗi bảo mật phổ biến nhất (2/2009) - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 1 4. Thống kê 10 lỗi bảo mật phổ biến nhất (2/2009) (Trang 11)
Hình 1-5. Thống kê thời gian trung bình khắc phục các lỗ hổng bảo mật (8/2008) - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 1 5. Thống kê thời gian trung bình khắc phục các lỗ hổng bảo mật (8/2008) (Trang 11)
Hình 1-7. Thống kê tỉ lệ lỗ hổng bảo mật thường xuyên bị khai thác (2/2010) - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 1 7. Thống kê tỉ lệ lỗ hổng bảo mật thường xuyên bị khai thác (2/2010) (Trang 12)
Hình 2-1. Trạng thái bình thường của website - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 2 1. Trạng thái bình thường của website (Trang 20)
Hình 2-3. Lỗi không tìm thấy cột - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 2 3. Lỗi không tìm thấy cột (Trang 22)
Hình 2-4. Các cột bị lỗi - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 2 4. Các cột bị lỗi (Trang 22)
Hình 2-5. Phiên bản của hệ quản trị cơ sở dữ liệu đang dùng - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 2 5. Phiên bản của hệ quản trị cơ sở dữ liệu đang dùng (Trang 23)
Hình 2-6. Các bảng trong cơ sở dữ liệu - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 2 6. Các bảng trong cơ sở dữ liệu (Trang 24)
Hình 2-8. Thông tin tài khoản người quản trị - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 2 8. Thông tin tài khoản người quản trị (Trang 25)
Hình 2-7. Các cột có trong bảng - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 2 7. Các cột có trong bảng (Trang 25)
Hình 2-9. Trang web bình thường - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 2 9. Trang web bình thường (Trang 28)
Hình 2-10. Trang web bị lỗi Blind SQL Injection  Kết quả trả về một trang trắng, không có nội dung hiển thị - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 2 10. Trang web bị lỗi Blind SQL Injection Kết quả trả về một trang trắng, không có nội dung hiển thị (Trang 29)
Hình 2-11. Tìm kiếm phiên bản cơ sở dữ liệu bằng Blind SQL Injection - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 2 11. Tìm kiếm phiên bản cơ sở dữ liệu bằng Blind SQL Injection (Trang 29)
Hình 3-1. Mô hình DCOM - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 3 1. Mô hình DCOM (Trang 38)
Hình 3-2. Mô hình Web Service - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 3 2. Mô hình Web Service (Trang 39)
Hình 3-3. Phối hợp hoạt động giữa các ứng dụng - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 3 3. Phối hợp hoạt động giữa các ứng dụng (Trang 40)
Hình 3-4. XML là định dạng dữ liệu chuẩn để trao đổi giữa các Web Services - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 3 4. XML là định dạng dữ liệu chuẩn để trao đổi giữa các Web Services (Trang 40)
Hình 3-5. Chồng giao thức của dịch vụ Web - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 3 5. Chồng giao thức của dịch vụ Web (Trang 43)
Hình 3-6. Kiến trúc Web Service - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 3 6. Kiến trúc Web Service (Trang 45)
Hình 4-1. Mô hình phương pháp phát hiện và phòng chống SQL bằng Webservice          Kỹ  thuật  được đề  xuất  này  bao  gồm  mô  hình  lọc  2  tầng  để  ngăn  chặn  các cuộc tấn công SQL Injection : - Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service
Hình 4 1. Mô hình phương pháp phát hiện và phòng chống SQL bằng Webservice Kỹ thuật được đề xuất này bao gồm mô hình lọc 2 tầng để ngăn chặn các cuộc tấn công SQL Injection : (Trang 61)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w