1. Trang chủ
  2. » Công Nghệ Thông Tin

Tấn công CSDL bằng phương pháp SQL injection.

21 6 0

Đ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

Tiêu đề Tấn Công Cơ Sở Dữ Liệu Bằng Phương Pháp SQL Injection
Trường học Trường Đại Học Mỏ - Địa Chất
Chuyên ngành An Ninh Cơ Sở Dữ Liệu
Thể loại Báo cáo
Năm xuất bản 2020
Thành phố Hà Nội
Định dạng
Số trang 21
Dung lượng 2,29 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

SQL Injection đã tồn tại quanh ta trong nhiều thập kỷ và có thể sẽ tiếp tục đứng đầu bảng xếp hạng các lỗ hổng nguy hiểm trong những năm tới. Chỉ mất một vài bước dễ dàng –nhưng sẽ là một sự toan tính rất tốt – để bảo vệ chính bạn và người dùng của bạn khỏi sự tấn công này

Trang 1

TRƯỜNG ĐẠI HỌC MỎ - ĐỊA CHẤT

BÁO CÁO

AN NINH CƠ SỞ DỮ LIỆU

ĐỀ TÀI TẤN CÔNG CSDL BẰNG PHƯƠNG PHÁP

SQL INJECTION

Hà Nội, 9/2020

Trang 2

Chương I LÝ THUYẾT 1

1 Giới Thiệu 1

2 SQL injection là gì? 1

3 Bản chất của cuộc tấn công này 2

4 Các dạng tấn công SQL Injection 3

5 Cách phát hiện lỗ hổng SQL injection 5

6 Hậu quả của SQL Injection 6

7 Cách phòng chống kiểu tấn công này 7

CHƯƠNG II THỰC HÀNH 9

1 Ex1: Tautologies 9

2 Ex2: Truy vấn Union 14

3 Kết luận 18

TÀI LIỆU THAM KHẢO 19

Trang 3

Chương I LÝ THUYẾT

1 Giới Thiệu

Ngày nay, các ứng dụng web phổ biến trên khắp thế giới Gần như mọi công tyhoặc tổ chức lớn đều có web Tối đa các công ty và tổ chức này sử dụng các ứngdụng web để cung cấp các dịch vụ khác nhau cho người dùng Một số ứng dụngweb này sử dụng nội dung hướng cơ sở dữ liệu Cơ sở dữ liệu back-end thườngchứa thông tin bí mật và nhạy cảm như số bảo mật, số thẻ tín dụng, dữ liệu tàichính, dữ liệu y tế Thông thường, người dùng web cung cấp thông tin, chẳng hạnnhư tên người dùng và mật khẩu và các ứng dụng web nhận yêu cầu của ngườidùng và tương tác với cơ sở dữ liệu phía sau và trả lại dữ liệu có liên quan chongười dùng

Trang 4

Thông qua SQL Injection, kẻ tấn công có thể có được quyền truy cập trái phép vào

cơ sở dữ liệu và có thể tạo, đọc, cập nhật, thay đổi hoặc xóa dữ liệu được lưu trữtrong cơ sở dữ liệu phía sau Hiện tại, hầu hết tất cả các cơ sở dữ liệu SQL nhưOracle, MySQL, PostgreSQL, MSSQL Server, MS Access đều có khả năng bị tấncông SQL injection Ở dạng phổ biến nhất, tấn công SQL injection cho phép truycập vào thông tin nhạy cảm như số an sinh xã hội, số thẻ tín dụng hoặc dữ liệu tàichính khác

3 Bản chất của cuộc tấn công này

Như đã đề cập phía trên, bản chất của cuộc tấn công này là hack database với mụcđích độc hại

Để thực hiện Security Testing, ban đầu, bạn cần tìm những lỗ hổng của hệ thống vàsau đó thông qua chúng gửi những mã SQL độc hại đến database Nếu có thể thực

Trang 5

hiện được, thì những mã SQL độc hại này sẽ được gửi và các hành động gây hại sẽ

có thể thực hiện trong database

Mỗi một trường của một website tương tự như một cánh cổng dẫn vào database.Bất kỳ dữ liệu hoặc đầu vào mà chúng ta thường nhập vào bất kỳ trường nào của

hệ thống hoặc trang web đều đi đến database Do đó, thay vì nhập dữ liệu đúng,nếu chũng ta nhập bất kỳ mã code độc hại nào, nó đều có thể thực hiện câu lệnhtruy vấn database và mang lại hậu quả nghiêm trọng

4 Các dạng tấn công SQL Injection

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

4.1 Dạng tấn công vượt qua kiểm tra lúc đăng nhập

Với dạng tấn công này, kẻ tấn công 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ệucủa ứng dụng web Thông thường để cho phép người dùng truy cập vào cáctrang web được bảo mật, hệ thống thường xây dựng trang đăng nhập để yêucầu người dùng nhập thông tin về tên đăng nhập và mật khẩu Sau khi ngườidù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

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

Dạng tấn công này phức tạp hơn Để thực hiện được kiểu tấn côngnà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ácthô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ấncông Chúng ta có tể gặp các website tin tức có các tham số được truyền vàonhư: index.php?id=21 , index.asp?id=6, thì chúng ta chỉ cần thêm các kí tự

Trang 6

dấu nháy đơn ('), dấu nháy kép ("), phần trăm 27 (%27), 00 phần trăm (00%)vào sau id để kiểm tra nếu nó hiện ra lỗi hoặc không hiện ra 1 cái gì (kháchoàn toàn với lúc ban đầu thì 90% có khả năng khai thác được lỗi này) Ví

dụ http://www.ampak.com.tw/product.php?id=22 là một website bị lỗi SQLInjection thì chúng ta sẽ thử với http://www.ampak.com.tw/product.php?id=22'hoặc http://www.ampak.com.tw/product.php?id=22' thì đều trả vềtrang lỗi Trong các tình huống thông thường, URL hiển thị nội dung của tin

có ID trùng với ID đã chỉ định và hầu như không thấy có lỗi Tuy nhiên,giống như ví dụ đăng nhập ở trước, đoạn mã này để lộ sơ hở cho một lỗiSQL injection khác Kẻ tấn công có thể thay thế một ID hợp lệ bằng cáchgán ID cho một giá trị khác, và từ đó bắt đầu cho một cuộc tấn công bất hợppháp, ví dụ như: 0 OR 1=1 (nghĩa làhttp://www.ampak.com.tw/product.php?id=0 or 1=1) Câu truy vấn SQL lúcnày sẽ không trả về trang lỗi mặc dù chúng ta không có sản phẩm nào có ID

= 0, vì nó sẽ thực hiện câu lệnh: SELECT * FROM Products WHEREProduct_ID=0 or 1=1

Tương tự như trên, kẻ tấn công có thể lợi dụng sơ hở trong câu truy vấn SQL

để nhập thêm lệnh tiếp theo: '; DROP TABLE users – Lúc này, chương trình sẽ chạy câu truy vấn thực hiện việc xóa bảng users

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

Thông thường các ứng dụng web cho phép người dùng đăng kí một tàikhoả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 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:

Trang 7

INSERT INTO TableName VALUES('1st Value', '2ndValue', '3rd Value')

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

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

Stored Procedure được sử dụng trong lập trình web với mục đích nhằm giảm

sự phức tạp trong ứng dụng và tránh sự tấn công trong kỹ thuật SQL Injection.Tuy nhiên những kẻ tấn công vẫn có thể lợi dụng những stored procedure để tấncông vào hệ thống Việc tấn công này sẽ gây tác hại rất lớn nếu ứng dụng đượcthực thi với quyền quản trị hệ thống ‘sa’ Ví dụ 1: stored procedure splogingồm hai tham số là username và password, nếu kẻ tấn công nhập: Username:thanhcong Password: ' ; shutdown- - Lệnh gọi stored procedure như sau: EXECsplogin 'thanhcong','';shutdown- -' Lệnh shutdown thực hiệndừng sql server ngay lập tức Lúc này hệ thống sẽ thực hiện lệnh liệt kê thư mụctrê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 đằngsau cmd.exe

5 Cách phát hiện lỗ hổng SQL injection

Trang 8

Phần lớn các lỗ hổng SQL injection có thể được tìm thấy nhanh chóng vàđáng tin cậy bằng cách sử dụng trình quét lỗ hổng web có sẵn trên internet SQL injection có thể được phát hiện thủ công bằng cách sử dụng một bộkiểm tra có hệ thống đối với mọi điểm vào trong ứng dụng Điều này thườngbao gồm:

 Gửi ký tự trích dẫn duy nhất ‘ và tìm kiếm lỗi hoặc bất thường khác

 Đệ trình một số cú pháp dành riêng cho SQL để đánh giá giá trị cơ sở(bản gốc) của điểm nhập và đến một giá trị khác và tìm kiếm sự khácbiệt có hệ thống trong các phản hồi của ứng dụng

 Đệ trình các điều kiện Boolean như OR 1 = 1 và OR 1 = 2 và tìmkiếm sự khác biệt trong phản hồi của ứng dụng

 Gửi tải trọng được thiết kế để kích hoạt độ trễ thời gian khi được thựchiện trong truy vấn SQL và tìm kiếm sự khác biệt về thời gian thựchiện để phản hồi

 Gửi tải trọng OAST được thiết kế để kích hoạt tương tác mạng ngoàibăng khi được thực hiện trong truy vấn SQL và giám sát mọi tươngtác kết quả

6 Hậu quả của SQL Injection

Ngày nay, database được sử dụng cho gần như tất cả các hệ thống và website, vì

dữ liệu nên được lưu trữ ở nhiều nơi

Khi dữ liệu nhạy cảm được lưu trữ trong database, có nhiều rủi ro hơn trong bảomật hệ thống Nếu bất kỳ dữ liệu website hoặc blog cá nhân bị đánh cắp, thì sẽkhông gây thiệt hại nhiều như dữ liệu ngân hàng bị đánh cắp

Mục đích chính của cuộc tấn công này là hack database của hệ thống, do đó hậuquả của nó thật sự nguy hại

Những điều sau đây có thể là kết quả của SQL Injection:

Trang 9

 Hậu quả lớn nhất mà SQL Injection gây ra là: Làm lộ dữ liệu trongdatabase Tuỳ vào tầm quan trọng của dữ liệu mà hậu quả dao động ởmức nhẹ cho đến vô cùng nghiêm trọng

 Lộ dữ liệu khách hàng có thể ảnh hưởng rất nghiêm trọng đến công ty.Hình ảnh công ty có thể bị ảnh hưởng, khách hàng chuyển qua sử dụngdịch vụ khác, dẫn đến phá sản v…v

 Lỗ hỗng này cũng ảnh hưởng lớn đến khách hàng Do họ thường dùngchung một mật khẩu cho nhiều tài khoản, chỉ cần lộ mật khẩu một tàikhoản thì các tài khoản khác cũng lộ theo

 Đây cũng là lý do mình nhắc nhở phải mã hoá mật khẩu, nếu database có

bị tấn công thì người dùng cũng không bị mất mật khẩu (Đây là lý dovietnamwork bị ăn chửi vì không mã hoá mật khẩu)

 Trong nhiều trường hợp, hacker không chỉ đọc được dữ liệu mà còn cóthể chỉnh sửa dữ liệu Lúc này hacker có thể đăng nhập dưới vai tròadmin, lợi dụng hệ thống, hoặc xoá toàn bộ dữ liệu để hệ thống ngừnghoạt động

Những rủi ro đã liệt kê bên trên có thể thực sự nguy hiểm, vì để restore mộtdatabase hoặc dữ liệu của nó mất rất nhiều chi phí Nó có thể làm mất danhtiếng và tiền bạc của công ty bạn để khôi phục dữ liệu và hệ thống bị mất Vìvậy, cần phải quan tâm cao đến việc bảo vệ hệ thống khỏi các cuộc tấn công,

và Security testing là giải pháp tốt cho uy tín sản phẩm và công ty bạn

7 Cách phòng chống kiểu tấn công này

May thay, mặc dù SQL rất nguy hại nhưng cũng dễ phòng chống Gần đây, hầunhư chúng ta ít viết SQL thuần mà toàn sử dụng ORM (Object-RelationalMapping) framework Các framework web này sẽ tự tạo câu lệnh SQL nên hackercũng khó tấn công hơn

Trang 10

Tuy nhiên, có rất nhiều site vẫn sử dụng SQL thuần để truy cập dữ liệu Đây chính

là mồi ngon cho hacker Để bảo vệ bản thân trước SQL Injection, ta có thể thựchiện các biện pháp sau

 Lọc dữ liệu từ người dùng: Cách phòng chống này tương tự như XSS

Ta sử dụng filter để lọc các kí tự đặc biệt (; ” ‘) hoặc các từ khoá(SELECT, UNION) do người dùng nhập vào Nên sử dụng thưviện/function được cung cấp bởi framework Viết lại từ đầu vừa tốnthời gian vừa dễ sơ sót

 Không cộng chuỗi để tạo SQL: Sử dụng parameter thay vì cộng chuỗi.Nếu dữ liệu truyền vào không hợp pháp, SQL Engine sẽ tự động báolỗi, ta không cần dùng code để check

 Không hiển thị exception, message lỗi: Hacker dựa vào message lỗi

để tìm ra cấu trúc database Khi có lỗi, ta chỉ hiện thông báo lỗi chứđừng hiển thị đầy đủ thông tin về lỗi, tránh hacker lợi dụng

 Phân quyền rõ ràng trong DB: Nếu chỉ truy cập dữ liệu từ một sốbảng, hãy tạo một account trong DB, gán quyền truy cập cho account

đó chứ đừng dùng account root hay sa Lúc này, dù hacker có injectđược sql cũng không thể đọc dữ liệu từ các bảng chính, sửa hay xoá

dữ liệu

 Backup dữ liệu thường xuyên: Các cụ có câu “cẩn tắc vô áy náy” Dữliệu phải thường xuyên được backup để nếu có bị hacker xoá thì tavẫn có thể khôi phục được Còn nếu cả dữ liệu backup cũng bị xoáluôn thì … chúc mừng bạn, update CV rồi tìm cách chuyển công tythôi!

Trang 11

Để xem cách nó hoạt động, chúng ta thử nghiệm như dưới đây:

- Cấu trúc của bảng: user_details

- Bản ghi của bảng: user_details

Trang 12

Một form đăng nhập có 2 input username và password như dưới đây:

Nếu sử dụng và mật khẩu khớp với một bản ghi trong cơ sở dữ liệu, thông tin cánhân của người dùng sẽ được hiển thị Nếu không, " ID người dùng hoặc mật khẩu không hợp lệ " sẽ được hiển thị Bây giờ hãy nhập một userrid và mật khẩu hợp lệ vào và kiểm tra kết quả:

Trang 13

Kết quả:

Nhập một userrid hợp lệ và một mật khẩu không hợp lệ vào form.html và kiểm tra kết quả:

Trang 14

Khi người dùng nhập thông tin đăng nhập của họ và nhấn vào nút “log in”, thông tin sẽ được gửi lại cho máy chủ web của bạn, ở đó nó sẽ được kết hợp với một lệnhSQL Ví dụ, trong PHP, mã sẽ giống như sau:

$uid = $_POST['uid'];$pid = $_POST['passid'];$SQL =

"select * from user_details where userid = '$uid' and password = '$pid' "; $result = mySQL_query($SQL);

Lệnh này sau đó sẽ được gửi đến một máy chủ cơ sở dữ liệu và tập dữ liệu kết quả

sẽ xác định xem username và password có tương ứng với một tài khoản người dùng hợp lệ hay không Nhưng điều gì sẽ xảy ra nếu kẻ tấn công cung

cấp abcd dưới dạng userid và bất kỳ thứ gì 'hoặc' x '=' x làm mật khẩu, thì truy

vấn sẽ được xây dựng như:

$ SQL = "select * from user_details where userid = 'abcd' and password = 'anything' or 'x' = 'x'";

Trang 15

Dựa trên ưu tiên toán tử, mệnh đề WHERE đúng cho mọi hàng, do đó truy vấn sẽ trả về tất cả các bản ghi Bằng cách này, kẻ tấn công sẽ có thể xemtất cả thông tin cá nhân của người dùng Xem mẫu đăng nhập sau và kết quả.

'anything' or 'x' = 'x'

Trang 16

Kết quả:

2 Ex2: Truy vấn Union

Kiểu tấn công này có thể được thực hiện bằng cách chèn một truy vấnUNION vào một tham số dễ bị tấn công, nó sẽ trả về một tập dữ liệu là sự kếthợp của kết quả của truy vấn đầu tiên ban đầu và kết quả của truy vấn được đưavào Toán tử SQL UNION kết hợp các kết quả của hai hoặc nhiều truy vấn vàtạo ra một tập kết quả bao gồm các hàng được tìm nạp từ các truy vấn tham giatrong UNION

Theo mặc định, UNION hoạt động giống như UNION [DISTINCT], tức là loại bỏ các hàng trùng lặp; tuy nhiên, việc sử dụng từ khóa ALL với UNION trả

về tất cả các hàng, kể cả các hàng trùng lặp

Trang 17

Kẻ tấn công cố gắng sử dụng phương pháp này phải có kiến thức vững chắc

về lược đồ DB Hãy thử phương pháp trên với hai

bảng user_details , emp_details và biểu mẫu đăng nhập đầu tiên:

Cấu trúc của bảng: user_details

Bản ghi của bảng: user_details

Cấu trúc của bảng: emp_details

Trang 18

Bản ghi của bảng: emp_details

Giả sử kẻ tấn công nhập ' UNION SELECT * FROM emp_details trong trường User ID và abcd trong Mật khẩu được lưu dưới dạng userid và mật

khẩu tạo ra truy vấn sau:

SELECT * FROM user_details WHERE userid ='' UNION

SELECT * FROM EMP_DETAILS ' and password = 'abcd'

Hai dấu gạch ngang (-) nhận xét phần còn lại của truy vấn tức là 'và password =' abcd ' Do đó, truy vấn trở thành sự kết hợp của hai truy vấn SELECT Truy vấn

SELECT đầu tiên trả về một tập hợp rỗng vì không có bản ghi phù hợp trong

bảng user_details Truy vấn thứ hai trả về tất cả dữ liệu từ bảng emp_details

Trang 19

Kết quả:

3 Kết luận

Trang 20

SQL Injection đã tồn tại quanh ta trong nhiều thập kỷ và có thể sẽ tiếp tụcđứng đầu bảng xếp hạng các lỗ hổng nguy hiểm trong những năm tới Chỉ mấtmột vài bước dễ dàng –nhưng sẽ là một sự toan tính rất tốt – để bảo vệ chínhbạn và người dùng của bạn khỏi sự tấn công này, và lỗ hổng này sẽ là mộttrong những ưu tiên hàng đầu khi kiểm tra mã nguồn cho các lỗ hổng bảo mật.Việc đầu tiên cần làm để tránh trở thành nạn nhân của cuộc tấn công tiếp theo

về vi phạm dữ liệu SQL injection là kiểm soát và xác nhận input của ngườidùng, tiếp theo đó cần tự trang bị những công cụ cần thiết để bảo vệ chowebsite của mình một khi chúng ghé thăm

Trang 21

TÀI LIỆU THAM KHẢO

1 https://www.w3resource.com/sql/sqlinjection/sqlinjection.php?

fbclid=IwAR3Yj1dvdfOaJrwIYrfmcVMUmAr6wDaowm4bpHsycMiRMT9aX_P64Q5aTYA

2 dien-hinh.html#Cach_phat_hien_lo_hong_SQL_injection

https://ssl.vn/sql-injection-la-gi-nhung-loai-hinh-tan-cong-sql-injection-3 https://resources.cystack.net/tan-cong-sql-injection/

4 https://toidicode.com/loi-sql-injection-va-cach-phong-chong-117.html

5 https://vi.wikipedia.org/wiki/SQL_injection#T%C3%A0i_li%E1%BB

%87u_v%E1%BB%81_SQL_injection

Ngày đăng: 17/05/2023, 17:23

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

TÀI LIỆU LIÊN QUAN

w