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 1TRƯỜ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 2Chươ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 3Chươ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 4Thô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 5hiệ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 6dấ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 7INSERT 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 8Phầ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 10Tuy 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 12Mộ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 13Kế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 14Khi 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 15Dự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 16Kế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 17Kẻ 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 18Bả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 19Kết quả:
3 Kết luận
Trang 20SQL 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 21TÀ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