Tải bản đầy đủ (.doc) (25 trang)

Tìm hiểu về SQLinjection. Các biện pháp phòng tránh

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 (1.64 MB, 25 trang )

TRƯỜNG ĐẠI HỌC MỎ ĐỊA CHẤT
BỘ MƠN MẠNG MÁY TÍNH
_______________________

TIỂU LUẬN MÔN HỌC

AN NINH MẠNG + BTL - 7080728

Họ và tên:
Mã số sinh viên:
Lớp:
Cán bộ giảng dạy :

Hà Nội - 2021


MỤC LỤC
MỤC LỤC.................................................................................................................... 1
CHƯƠNG 1 TỔNG QUAN VỀ SQL INJECTION.......................................................3
1.1.Giới thiệu 3
1.2.Mục đích 3
CHƯƠNG 2 PHÂN TÍCH SQL INJECTION................................................................4
2.1. Phân loại 4
2.1.1. In-band SQL injection.............................................................................4
2.1.2. Inferential SQL injection.........................................................................4
2.1.4. Out-of-band SQL injection......................................................................5
2.2. Cơ chế hoạt động................................................................................................6
2.2.1. Thông qua “user input”............................................................................6
2.2.2. Thông qua cookies...................................................................................7
2.2.3. Thơng qua biến server..............................................................................7
2.3. Hậu quả



7

2.4. Cách phịng tránh................................................................................................8
2.4.1. Luôn xác thực và kiểm tra cẩn thận dữ liệu người dùng nhập.................8
2.4.2. Tránh tiết lộ những thông tin/chi tiết nhạy cảm trên thông báo lỗi..........8
2.4.3. Sử dựng framework thay vì code thuần...................................................9
2.4.4. Phân quyền truy cập.................................................................................9
2.4.5. Sử dụng SQL Map...................................................................................9
2.4.6. Mã hóa các data quan trọng.....................................................................9
2.4.7. Backup dữ liệu thường xuyên..................................................................9
CHƯƠNG 3 DEMO THỰC HÀNH............................................................................10
3.1. Khai thác lỗ hổng SQL injection thông qua trang web demo
www.hacksplaining.com .........................................................................................10

1


3.2. Khai thác lỗ hổng SQL injection thông qua trang web demo
www.testphp.vulnweb.com......................................................................................13
KẾT LUẬN................................................................................................................. 23
TÀI LIỆU THAM KHẢO...........................................................................................24

2


CHƯƠNG 1 TỔNG QUAN VỀ SQL INJECTION
1.1.

Giới thiệu


SQL injection là một lỗ hổng bảo mật web cho phép kẻ tấn công can thiệp vào
các truy vấn mà ứng dụng thực hiện đối với cơ sở dữ liệu của nó. Nó thường cho phép
kẻ tấn công xem dữ liệu mà chúng thường khơng thể lấy được. Điều này có thể bao
gồm dữ liệu thuộc về người dùng khác hoặc bất kỳ dữ liệu nào khác mà bản thân ứng
dụng có thể truy cập. Trong nhiều trường hợp, kẻ tấn cơng có thể sửa đổi hoặc xóa dữ
liệu này, gây ra những thay đổi liên tục đối với nội dung hoặc hành vi của ứng dụng.
Lỗ hổng này rất nổi tiếng, từ developer đến hacker gần như ai cũng biết. Ngồi
ra, cịn có 1 số tool tấn cơng SQL Injection cho dân “ngoại đạo”, những người khơng
biết gì về lập trình. Rất nhiều ơng lớn từng bị dính như Sony, Microsoft UK. Mọi vụ
lùm xùm liên quan tới “lộ dữ liệu người dùng” ít nhiều đều dính dáng tới SQL
Injection.
SQL rất dễ tấn công, phổ biến, gây ra hậu quả nghiêm trọng, đó là lý dó nó nằm ở
vị trí đầu bảng trong top 10 lỗ hỗng bảo mật của OWASP.
Các phần dễ bị tấn cơng bao gồm:
• Form đăng nhập.
• Form tìm kiếm.
• Các trường lưu hoặc trường đầu vào của dữ liệu.
• Liên kết của website.
1.2.

Mục đích

Một cuộc tấn cơng SQL injection thành cơng có thể dẫn đến việc truy cập trái
phép vào dữ liệu nhạy cảm, chẳng hạn như mật khẩu, chi tiết thẻ tín dụng hoặc thơng
tin người dùng. Nhiều vụ xâm phạm dữ liệu những năm gần đây là kết quả của các
cuộc tấn công SQL injection, dẫn đến thiệt hại về danh tiếng và tiền bạc. Trong một số
trường hợp, kẻ tấn cơng có thể có được một backdoor liên tục vào hệ thống của tổ
chức, dẫn đến các truy cập trái phép có thể khơng được chú ý trong một thời gian dài.


3


CHƯƠNG 2 PHÂN TÍCH SQL INJECTION
2.1. Phân loại
2.1.1. In-band SQL injection
Đây là dạng tấn công phổ biến nhất và cũng dễ để khai thác lỗ hổng SQL
Injection nhất. Xảy ra khi hacker có thể tổ chức tấn cơng và thu thập kết quả trực tiếp
trên cùng một kênh liên lạc. Được chia làm 2 dạng nhỏ hơn là Error-based và Unionbased.
2.1.1.1. Error-based SQL injection
Đây là một kỹ thuật tấn công SQL injection dựa vào thông báo lỗi được trả về từ
Database Server có chứa thơng tin về cấu trúc của cơ sở dữ liệu. Trong một vài trường
hợp, Error-based có thể liệt kê được các thuộc tính của cơ sở dữ liệu. Thơng thường
các website có một trang nhận ID của tin cần hiển thị rồi sẽ truy vấn nội dung có ID
này.
2.1.1.2. Union-based SQL injection
Đây là một kỹ thuật tấn cơng SQL injection dựa vào tốn tử UNION trong ngôn
ngữ SQL cho phép tổng hợp kết quả của 2 hay nhiều câu truy vấn SELECTION trong
cùng một kết quả và được trả về như một phần của HTTP response. Để thực hiện được
việc này thì cần phải biết được tên bảng hợp lệ và xác định số cột, kiểu dữ liệu trong
câu truy vấn đầu tiên. Cách đơn giản nhất để lấy được tên bảng là dốn, vì thơng
thường trong các ứng dụng tên bảng thường được đặt giống nhau để thuận tiện cho
người dùng.
2.1.2. Inferential SQL injection
Cách tấn công Inferential SQL injection tốn nhiều thời gian hơn do khơng có bất
kì dữ liệu nào được thực sự trả về thơng qua web application và hacker thì khơng thể
theo dõi kết quả trực tiếp như kiểu tấn công In-band.Thay vào đó, kẻ tấn cơng sẽ cố
gắng xây dựng lại cấu trúc cơ sở dữ liệu bằng việc gửi đi các payloads, dựa vào kết
quả phản hồi của web application và kết quả hành vi của database server. Cách tấn
công này có 2 dạng chính: Blind-boolean-based Blind-time-based.


4


2.1.2.1. Blind-boolean-based
Đây là kĩ thuật tấn công SQL Injection dựa vào việc gửi các truy vấn tới cơ sở dữ
liệu bắt buộc ứng dụng trả về các kết quả khác nhau phụ thuộc vào câu truy vấn là
True hay False. Tuỳ thuộc kết quả trả về của câu truy vấn mà HTTP reponse có thể
thay đổi, hoặc giữ nguyên. Kiểu tấn công này thường chậm (đặc biệt với cơ sở dữ liệu
có kích thước lớn) do người tấn cơng cần phải liệt kê từng dữ liệu, hoặc mị từng kí tự.
2.1.2.2. Blind-time-based
Blind-time-base là kĩ thuật tấn công dựa vào việc gửi những câu truy vấn tới cơ
sở dữ liệu và buộc cơ sở dữ liệu phải chờ một khoảng thời gian (thường tính bằng
giây) trước khi phản hồi. Thời gian phản hồi (ngay lập tức hay trễ theo khoảng thời
gian được cài đặt) cho phép kẻ tấn cơng suy đốn kết quả truy vấn là TRUE hay
FALSE. Kiểu tấn công này cũng tốn nhiều thời gian tương tự như Blind-boolean-based
và chỉ nên dùng khi khơng cịn cách nào khác để lấy thông tin từ cơ sở dững liệu.
2.1.4. Out-of-band SQL injection
Out-of-band SQL injection không phải dạng tấn công phổ biến, chủ yếu bởi vì nó
phụ thuộc vào các tính năng được bật trên Database Server được sở dụng bởi Web
Application. Kiểu tấn công này xảy ra khi hacker không thể trực tiếp tấn công và thu
thập kết quả trực tiếp trên cùng một kênh ( không thể tấn công kiểu In-band) và việc
phản hồi từ server là không ổn định (không thể tấn công kiểu Inferential). Kiểu tấn
công này phụ thuộc vào khả năng server thực hiện các request DNS hoặc HTTP để
chuyển dữ liệu cho kẻ tấn cơng.
Ví dụ như câu lệnh xp_dirtree trên Microsoft SQL Server có thể sử dụng để thực
hiện DNS request tới một server khác do kẻ tấn cơng kiểm sốt, hoặc Oracle
Database’s UTL HTTP Package có thể sử dụng để gửi HTTP request từ SQL và
PL/SQL tới server do kẻ tấn công làm chủ.


5


2.2. Cơ chế hoạt động

Mỗi dạng tấn công SQL injection có cơ chế hoạt đơng khác nhau nhưng về bản
chất thì vẫn có điểm chung:
1. Hacker tìm lỗ hổng của website.
2. Hacker chèn lệnh SQL vào lỗ hổng
3. Hacker lấy cắp thơng tin mình mong muốn.
4. Hacker có thể giải mã mật khẩu của quản trị viên, từ đó chiếm quyền đăng
nhập, thay đổi nội dung website hoặc đánh cắp thông tin quan trong.
2.2.1. Thông qua “user input”
User input điển hình thường đến từ các form đăng nhập,form nhập liệu, form tìm
kiếm… Những dữ liệu này được web browser gửi đến server thông qua phương thức
HTTP GET hay POST và trở thành các tham số cho ứng dụng web truy cập tới cơ sở
dữ liệu. Ví dụ như trong một form search, khi người dùng điền vào “Sql Injection”,

6


đơn giản ứng dụng web sẽ truy cập cơ sở dữ liệu và tìm ra các bản ghi mà nội dung
của nó chứa từ khóa “Sql Injection” để trả lại kết quả cho người dùng. Tùy vào các câu
truy vấn chúng ta chèn vào mà chúng ta sẽ thu thập được những thông tin mong muốn
hay những hành động phá hoại như xóa bảng trong cơ sở dữ liệu, upload shell lên web
server phục vụ việc khai thác về sau.
2.2.2. Thông qua cookies
Cookies là những tệp tin lưu trữ thông tin trạng thái của người dùng khi truy cập
các ứng dụng web. Những thơng tin này do người lập trình quyết định, được tạo ra ở
server và lưu trữ tại client. Khi người dùng truy cập lại ứng dụng web, cookies được

browser gửi lên server giúp phục hồi lại những trạng thái của người dùng trong lần
truy cập trước đó. Do được lưu trữ ở client nên người dùng có thể chỉnh sửa tùy ý, vì
vậy nếu ứng dụng web sử dụng những thông tin lưu trong cookies để xây dựng các
truy vấn tới cơ sở dữ liệu thì hacker hồn tồn có thể chèn vào cookies những script
sql để thực hiện một cuộc tấn công Sql Injection.
2.2.3. Thông qua biến server
Biến server có thể là một khái niệm tương đối lạ lẫm nhưng nó khơng hề mới.
Một số ví dụ của biến server là Http header, Network header… Không phổ biến lắm
nhưng các giá trị được lưu trong biến server có thể được ứng dụng web sử dụng như
trong việc logging truy cập hay thống kê truy cập theo user agent… Những cơng việc
này đều có sự tương tác với cơ sở dữ liệu nên các hacker hoàn toàn có thể sử dụng các
biến server trong việc khai thác Sql Injection.
Các addon của firefox hỗ trợ rất tốt những việc này, Tamper Data hay Live HTTP
headers (đã được ví dụ ở trên) có thể giúp chúng ta bắt những request gửi từ client lên
web server, từ đó chúng ta có thể dễ dàng thay đổi các biến server (http header…)
trước khi gửi chúng tới server. Việc khai thác thông qua các biến server tương tự như
khai thác thông qua cookie.
2.3. Hậu quả
• Chiếm quyền điều khiển tài khoản cá nhân.


Ăn cắp hoặc sao chép dữ liệu của trang web hoặc hệ thống.



Thay đổi dữ liệu nhạy cảm của hệ thống.

7





Hacker có thể đăng nhập vào ứng dụng với tư cách người dùng khác, ngay cả với

tư cách quản trị viên.
• Có thể bị sửa đổi cấu trúc của cơ sở dữ liệu, thậm chí xóa các bảng trong cơ sở dữ
liệu ứng dụng.
• Bị kiểm sốt máy chủ cơ sở dữ liệu và thực thi lệnh theo ý muốn.


Tống tiền.

2.4. Cách phịng tránh
2.4.1. Ln xác thực và kiểm tra cẩn thận dữ liệu người dùng nhập.
Quy tắc đầu tiên về input mà người dùng nhập là “don’t trust and verify” (khơng
tin tưởng và cần xác minh”), có nghĩa là tất cả những gì người dùng nhập vào phải
được coi là độc hại trừ khi có bằng chứng khác. Nó không chỉ dành cho các form nhập
liệu đơn giản như các vùng văn bản mà còn cho mọi thứ khác - như input ẩn, các chuỗi
tham số truy vấn, cookie và tệp tải lên. Đây được coi là bước căn bản nhưng cũng hiệu
quả nhất để bảo vệ dữ liệu khỏi SQL injection
• Sử dụng parameter thay vì cộng chuỗi. Nếu các câu lệnh SQL injection được
truyền vào vào không hợp pháp, câu lệnh đó sẽ khơng thể được thực thi.
• Khi bạn nhận dữ liệu ID trên URL thì cách tốt nhất là nên ép kiểu, chuyển nó về
kiểu số INT, sau đó chuyển về kiểu STRING (nếu cần thiết).
• Sử dụng hàm sprintf và mysql_real_escape_string để xác định kiểu dữ liệu cho
câu truy vấn. Hàm mysql_real_escape_string sẽ thêm dấu gạch chéo ngược vào các ký
tự đặc biệt. Từ đó tránh việc hacker sử dụng các kí tự này để khai thác lỗ hổng SQL
injection.
• Dùng Regular Expression để loại bỏ đi các ký tự lạ hoặc các ký tự không phải là
số.

2.4.2. Tránh tiết lộ những thông tin/chi tiết nhạy cảm trên thông báo lỗi
Việc hiển thị thông tin chi tiết lỗi, đặc biệt là lỗi liên quan đến SQL ngay trên
trang web của người dùng có thể giúp hacker lợi dụng để khai thác các lỗ hổng SQL
injection.

8


2.4.3. Sử dựng framework thay vì code thuần
Các framework hiện nay thường sẵn có các cơng cụ bảo mật, giúp tăng cường
khả năng bảo vệ trước các cuộc tấn công an ninh mạng. Framework ln có cộng đồng
hoặc các chun gia bảo mật giúp tìm lỗi và update liên tục, từ đó chúng ta có thể giảm
bớt thời gian xử lý các vấn đề phát sinh.
2.4.4. Phân quyền truy cập
Phân quyền truy cập giúp chúng ta đề phòng ngay cả khi bị tấn cơng thì hacker
cũng khơng thể ăn cắp hay truy cập vào những phần data quan trọng. Cách phịng
chống này khơng chỉ dành riêng cho SQL injection mà là phương thức cực kỳ quan
trọng trong việc bảo vệ dữ liệu khỏi các cách tấn công khác.
2.4.5. Sử dụng SQL Map
SQL Map là một công cụ mã nguồn mở, dùng để khai thác những lổ hổng của cơ
sở dữ liệu SQL, được giới bảo mật và giới hacker sử dụng thường xuyên. Với máy tính
cài hệ điều hành Windows thì chúng ta phải cài đặt thêm Python để sử dụng. Cơng cụ
này có nhiều tính năng thích hợp cho việc thâm nhập SQL và để lấy dấu cơ sở dữ liệu,
từ đó xác định các lỗ hổng SQL injection.
2.4.6. Mã hóa các data quan trọng
Các data quan trọng, đặc biệt như mật khẩu, email, số điện thoại, địa chỉ, các
thông tin về ngân hàng hay thông tin cá nhân nhạy cảm đều nên được mã hóa khi lưu
trữ vào cơ sở dữ liệu. Mã hóa dữ liệu là một phần tất yếu trong chiến lược bảo mật
trước bất cứ hình thức tấn cơng mạng nào.
2.4.7. Backup dữ liệu thường xun

Đề phịng trường hợp bị hacker tấn cơng gây mất dữ liệu hoặc tống tiền, chúng ta
có thể đề phịng chuyện đó bằng cách backup dữ liệu thường xuyên. Việc này không
tốn quá nhiều thời gian và công sức nhưng có thể lại là “lá chắn” hữu hiệu khi bị tấn
công.

9


CHƯƠNG 3 DEMO THỰC HÀNH
3.1. Khai thác lỗ hổng SQL injection thông qua trang web demo
www.hacksplaining.com .
Bước 1: Mở trang web

10


Bước 2: Đăng nhập với email là “”, mật khẩu bất kì, ví dụ như
“password”.

Trang web thơng báo đăng nhập không thành công do sai mật khẩu.

11


Bước 3: Khai thác lỗ hổng SQL injection bằng cách đăng nhập với email là
“” , mật khẩu là “1 OR 1=1--”.

Hacker đã có thể đăng nhập vào hệ thống, xem những data cực kỳ quan trọng
cho dù không biết chính xác mật khẩu. Đây là một điều cực kì nguy hiểm.


12


3.2. Khai thác lỗ hổng SQL injection thông qua trang web demo
www.testphp.vulnweb.com
Bước 1: Xác định trang web có dính lỗ hổng SQL injection hay không

13


Truy cập Browse categories:

14


Chọn mục Posters:

Lúc này, đường dẫn trang web đang là
/>Ta thêm một ký tự bất kỳ (ví dụ *) vào đuôi đường dẫn trên để xem trang web xử lý
như thế nào:
/>
15


Qua quan sát, ta có thể hiểu trang web này khơng hề lọc dữ liệu đầu vào mà chỉ
tìm category có ID=1*. Vì khơng có ID=1* nên trang web hiển thị lỗi như trên.
Kết luận: Trang web này có thể bị khai thác lỗi SQL injection.
Bước 2: Tìm số cột có trong bảng
Ta gõ vào trình duyệt với số cột tăng dần, đến bao giờ trang web báo lỗi thì thôi.
/> />…


16


/>Đến số 12 thì ta thấy trang web báo lỗi:

Ta có thể kết luận bảng có 11 cột.
Ta có thể sử dụng toán tử UNION để xem cột nào được hiển thị và có thể bị khai thác:
/>cat=1+union+select+’vuln1’,’vuln2’,’vuln3’,’vuln4’,’vuln5’,’vuln6’,’vuln7’,’vuln8
’,’vuln9’,’vuln10’,’vuln11’

17


Kết quả như trên cho ta biết cột 2, 7 và 9 có thể bị khai thác SQL injection.

18


Bước 3: Khai thác các lỗ hổng SQL injection:
• Để tìm phiên bản hệ quản trị cơ sở dữ liệu, ta nhập đường dẫn cũ, thay cột ‘vuln2’
bằng @@version:
/>cat=1+union+select+vuln1’’,@@version,’vuln3’,’vuln4’,’vuln5’,’vuln6’,’vuln7’,’v
uln8’,’vuln9’,’vuln10’,’’vuln11’

Ta đã biết trang web sử dụng MySQL 8.0.22, hệ điều hành Unbutu 20.04.

19



• Tìm hostname, ta nhập đường dẫn cũ, thay cột ‘vuln2’ bằng @@hostname:
/>@@hostname,’vuln3’,’vuln4’,’vuln5’,’vuln6’,’vuln7’,’vuln8’,’vuln9’,’vuln10’,’’vu
ln11’

Ta đã biết hostname là ip-10-0-0-222.

20


• Để tìm tên database, ta nhập đường dẫn cũ, thay cột ‘vuln2’ bằng database():
/>database(),’vuln3’,’vuln4’,’vuln5’,’vuln6’,’vuln7’,’vuln8’,’vuln9’,’vuln10’,’’vuln1
1’

Ta đã biết tên database này là acuart.

21


• Để tìm tên tất cả các bảng trong database, ta có thể sử dụng đối tượng
information_schema. Đối tượng này giúp cung cấp các thông tin về bảng của cơ sở dữ
liệu. Ta nhập đường dẫn:
/>(table_name),3,4,5,6,7,8,9,10,11+from+information_schema.tables+where+table_s
chema=database()--+

Ta đã biết database này có 8 bảng: artists, carts, categ, featured, guestbooks, pictures,
products, users.

22



KẾT LUẬN
SQL Injection là một khái niệm rất quen thuộc nhưng vẫn luôn được xếp trong
top đầu các lỗ hổng bảo mật web phổ biến theo chuẩn OWASP. Cách tấn công này đã
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.
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 SQL
injection là kiểm sốt và xác nhận input của người dùng, tiếp theo đó cần tự trang bị
những công cụ cần thiết để bảo vệ cho website của mình một khi chúng ghé thăm. Dữ
liệu là một trong những thứ “đáng tiền” nhất trong website của bạn, vì thế việc bảo vệ
dữ liệu từ các cuộc tấn cơng SQL injection nói riêng và các cách tấn cơng an ninh
mạng nói chung là điều cực kỳ quan trọng và đáng để lưu tâm.

23


TÀI LIỆU THAM KHẢO
Các tài liệu tiếng Việt:
[1]. Lê Đắc Nhường. An tồn dữ liệu: Mã hóa bảo mật thơng tin, an ninh cơ sở
dữ liệu và an ninh mạng. NXB Đại học Quốc gia Hà Nội. 2018
[2]. Nguyễn Hữu Hịa. Giáo trình bảo mật hệ thống và an ninh mạng. NXB Đại
học Cần Thơ. 2017
[3]. Bùi Xuân Huy. SQL Injection là gì ? Có bao nhiêu kiểu tấn cơng SQL
Injection?. a/p/sql-injection-la-gi-co-bao-nhieu-kieu-tan-cong-sqlinjection-m68Z0QnMlkG. 2020
[4]. Nhật Minh. Một số điểm cơ bản về cơ chế tấn công SQL injection. https://
quantrimang.com/mot-so-diem-co-ban-ve-co-che-tan-cong-sql-injection-va-ddos84034. 2018
Các tài liệu từ Internet:
[5]. Website Information Security Notebook of QuangTB. https://infosecnote.
com/lo-hong/tim-hieu-ve-sql-injection. 2020

[6] Website Securityforall. 2020
[7]. Website OWASP. />[8]. Website Hacksplaining. />[9]. Website của Microsoft. />sql/sql-server-2008-r2/ms161953(v=sql.105)?redirectedfrom=MSDN. 2012
[10]. Website WebSec. 2013

24


×