Tải bản đầy đủ

TTTN đàm quang vinh k16d

ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG

ĐÀM QUANG VINH

NGHIÊN CỨU TÌM HIỂU TẤN
CÔNG SQL INJECTION

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC
CHUYÊN NGÀNH CÔNG NGHỆ THÔNG TIN

THÁI NGUYÊN, NĂM 2019

1


ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG

ĐỒ ÁN


TỐT NGHIỆP ĐẠI HỌC
Chuyên ngành Công nghệ thông tin
Đề tài:

NGHIÊN CỨU TÌM HIỂU TẤN CÔNG
SQL INJECTION
Sinh viên thực hiện:

Đàm Quang Vinh

Lớp ĐH-K16D, hệ chính qui
Giáo viên hướng dẫn: ThS. VŨ VIỆT DŨNG

2


Thái Nguyên, năm 2019
MỤC LỤC

LỜI CẢM ƠN
Em xin gửi lời cảm ơn sâu sắc đến các thầy cô trường Đại học Công Nghệ Thông Tin
và Truyền Thông Thái Nguyên đã hết lòng truyền đạt cho em những kiến thức bổ ích
trong suốt thời gian qua, cũng như đã tạo điều kiện cho em được phát huy ý tưởng.
Đặc biệt, em xin gửi lời cảm ơn chân thành đến thầy Ths.Vũ Việt Dũng đã tận tình
hướng dẫn, truyền đạt kiến thức và chỉ bảo cho em trong suốt thơi gian thực hiện đề tài.
Mặc dù em đã rất cố gắng, xong chắc chắn báo cáo sẽ còn rất nhiều thiếu sót, em rất
mong nhận được sự hướng dẫn thêm của quý Thầy Cô, các Anh Chị và các Bạn

Thái Nguyên, ngày

3

tháng

năm 2019


DANH MỤC HÌNH ẢNH

4


DANH MỤC BẢNG BIỂU

5


DANH MỤC NHỮNG TỪ VIẾT TẮT
STT

Chữ viết tắt

Nội dung viết tắt
Structured Query Language
( Ngôn ngữ truy vấn có cấu trúc )

01
SQL
02

Structured Query Language injection
SQLi

03

Whitehat security
Whitehatsec

04

Positive technologies security
Ptsecurity

05

Cơ sở dữ liệu
Database
Database Management System
( Hệ quản trị Cơ sở dữ liệu )

06
DBMS

Web Application Friewall
( Tường lửa cho ứng dụng Web )

07
WAF

6


LỜI MỞ ĐẦU
1. Lý do chọn đề tài
Ngày nay với sự phát triển vượt bậc của công nghệ web đã đem lại rất nhiều thuận lợi
cho người sử dụng cũng như các nhà phát triển. Nhưng cùng với sự phát triển này thì các
ứng dụng web cũng trở thành mục tiêu ưu thích của những kể tấn công. Các hình thức tấn
công rất đa dạng như thay đổi nội dung của trang web, tấn công từ chối dịch vụ khiến cho
việc truy cập trang web không thể thực hiện hoặc rất khó thực hiện, chiếm quyền điều
khiển trang web… Mục tiêu của các hacker cũng rất khác nhau, có thể tấn công xuất phát
từ thiện chí, nhằm tìm ra những điểm yếu và thông báo cho nhà quản trị hệ thống.
Nghiêm trọng hơn là tấn công để phục vụ cho các mục đích xấu như tống tiền trang web,
lấy cắp những dữ liệu nhạy cảm như thông tin về thẻ tín dụng, mua hàng thông qua tài
khoản của người khác… Trong các hình thức tấn công thì tấn công bằng cách chèn mã
lệnh (injection) là phổ biến. Tấn công website bằng kỹ thuật SQL injection từ lâu đã là
mối quan tâm bảo mật hàng đầu của các nhà phát triển web và chủ sở hữu website. Giờ
đây, các cuộc tấn công này ngày càng trở nên khó phát hiện và ngăn chặn hơn. Số lượng
các vụ tấn công nhằm vào cơ sở dữ liệu (CSDL) web đã lên tới một con số kỷ lục.
Theo các báo cáo về an ninh mạng gần đây, như của Whitehatsec một tổ chức có uy
tín trong việc nghiên cứu và hỗ trợ các vấn đề về an ninh mạng, Ptsecurity một tổ chức
chuyên nghiên cứu và đưa ra các giải pháp về an ninh hay trên trang Verizon Business,
Sans Institute thì đều cho thấy mức độ phát triển nhanh chóng, tính nghiêm trọng của
các lỗ hổng bảo mật và sự quan tâm chưa đúng mức của các tổ chức tới vấn đề này. SQL
Injection là một vấn đề an ninh trên ứng dụng web được nhấn mạnh trong các báo cáo
trên.

7


SQL Injection là kiểu tấn công có mục tiêu rất cụ thể và thường là mục tiêu đơn lẻ
cho mỗi một vụ tấn công. Chính vì thế mà những vụ tấn công như thế này thường không
gây được sự chú ý rộng rãi như virus hay sâu máy tính. Âm thầm như thế nhưng thiệt hại
của những vụ tấn công này lại rất lớn. Nếu như một máy chủ cơ sở dữ liệu bị tin tặc
chiếm quyền kiểm soát thì sẽ có một khối lượng rất lớn thông tin cá nhân tài chính của
người dùng sẽ rơi vào tay chúng. Và nếu thành công thì có thể nói nguồn thông tin mà tin
tặc thu được còn nhiều hơn rất nhiều so với tấn công phishing. Tin tặc không phải mất
công giả mạo để lừa người sử dụng cung cấp thông tin cá nhân tài chính. Tỉ lệ thành công
của các vụ tấn công SQL Injection thường rất cao.
Trên thực tế do sự phát triển mạnh mẽ từng giờ, từng ngày của công nghệ thông tin
cho nên các kiểu tấn công của các hacker cũng ngày càng tinh vi, phức tạp và khó ngăn
chặn. Xuất phát từ những lý do trên, em chọn đề tài “ Nghiên cứu tìm hiểu về tấn công
SQL Injection ” làm đề tài nghiên cứu.
2. Mục đích nghiên cứu
- Giúp chúng ta có thể hiểu hơn về các ứng dụng web, các mối đe dọa về vấn đề an toàn
thông tin khi chúng ta làm việc trên ứng dụng web hàng ngày, hiểu rõ hơn về các kỹ thuật
tấn công và bảo mật web.
- Hiểu rõ khái niệm SQL Injection, phương thức hoạt động của các hacker thông qua lỗ
hổng này để xâm nhập vào cơ sở dữ liệu và mối nguy hiểm thường trực về an ninh ứng
dụng web của các tổ chức.
- Hiểu rõ về lỗi bảo mật SQL Injection trên ứng dụng web, nguyên nhân dẫn đến lỗi,
các dạng tấn công, cách thức và phương pháp tấn công từ đó rút ra các biện pháp để
phòng chống.
3. Ý nghĩa khoa học và thực tiễn của đề tài
Theo các báo cáo về an ninh mạng gần đây, như của Whitehatsec, Ptsecurity đều cho
thấy mức độ phổ biến của kiểu tấn công SQL Injection là rất cao và đứng đầu trong danh
dách các lỗi bảo mật nghiêm trọng nhất, bởi vì nó cũng khá đơn giản để thực hiện, là một

8


trong những lỗi bảo mật phổ biến nhất, xác suất gặp lỗi bảo mật này khá cao và các tác
động của SQL Injection tới hệ thống là rất nguy hiểm. Đây thật sự là một lỗ hổng về bảo
mật rất đáng được quan tâm đến.
Dựa vào lỗi SQL Injection, hacker có thể làm được những việc sau:
- Có thể lấy được rất nhiều thông tin quan trọng trong cơ sở dữ liệu của một hệ thống web
như account và password của admin của một web site, hay các thông tin quan trọng về thẻ
tín dụng của khách hàng trong một ngân hàng nào đó…
- Có thể thêm, xóa, sửa cơ sở dữ liệu của đối tượng bị tấn công theo ý muốn
- Có thể tạo một backdoor cho những lần tấn công sau
- Có thể đánh sập hoàn toàn một hệ thống
- Có thể dùng như một phương pháp tấn công DoS
Các cuộc tấn công SQL Injection thường nhắm đến các cơ sở dữ liệu mang tính
thương mại, các website của thành phố thậm chí là các website của chính phủ, hầu hết các
website bị tấn công đều thuộc loại đáng tin cậy, hợp pháp và an toàn tuyệt đối trong mắt
người dùng.
Xuất phát từ thực tế trên việc nghiên cứu đề tài này là hoàn toàn cấp thiết.
4. Đối tượng và phạm vi nghiên cứu
Tìm hiểu kỹ thuật tấn công phổ biến nhất hiện nay là SQL Injection và cách bảo mật
phòng thủ kiểu tấn công này một cách tổng quan nhất.
5. Phương pháp nghiên cứu
- Tiếp cận ứng dụng sử dụng cơ sở dữ liệu, ngôn ngữ truy vấn có cấu trúc SQL và lỗ hổng
bảo mật SQL Injection.
- Tìm hiểu về các dạng lỗi SQL Injection.
- Tìm hiểu về các dạng tấn công SQL Injection phổ biến.
- Tìm hiểu các cách thức và phương pháp tấn công.
- Từ các kiến thức đã tìm hiểu đưa ra các giải pháp phòng chống tấn công SQL Injection
có hiệu quả.

9


6. Cấu trúc đề tài
Đề tài gồm 5 chương:
- Chương 1: Tổng quan về SQL Injection.
- Chương 2: Các dạng lỗi SQL Injection thường gặp.
- Chương 3: Các dạng tấn công SQL Injection phổ biến.
- Chương 4: Cách thức và phương pháp tấn công.
- Chương 5: Cách phòng chống tấn công SQL Injection.

10


CHƯƠNG 1
TỔNG QUAN VỀ SQL INJECTION
1.1. Đặc trưng của ứng dụng sử dụng cơ sở dữ liệu
Không khó để nhận ra rằng, hiện nay những ứng dụng phổ biến nhất và chiếm thị
phần cũng như doanh thu cao nhất đều là những ứng dụng hổ trợ tính năng quản lý. Dữ
liệu là thứ sống còn trong mọi hoạt động nghiệp vụ hiện tại. Chính vì lý do đó, các ứng
dụng nghiệp vụ hiện tại đều xây dựng trên những mô hình phát triển gắn liền với cơ sở dữ
liệu. An toàn của dữ liệu được đặt nặng lên tính an toàn và bảo mật của ứng dụng web kết
nối tới cơ sở dữ liệu.
Các mô hình phát triển ứng dụng web hiện tại được sử dụng phổ biến nhất là 3tier, 4-tier, ngoài ra còn có một số bản cải tiến, mở rộng mô hình này nhằm những mục
đích riêng.

Hình 1.1. Mô hình ứng dụng 3-tier

11


Hình 1.2. Mô hình ứng dụng 4-tier
Các mô hình trên luôn có một số điểm chung, đó là database server chỉ làm nhiệm vụ
lưu trữ dữ liệu, database hồi đáp những truy vấn dữ liệu được xây dựng theo chuẩn (ví dụ
như SQL). Mọi thao tác xử lý dữ liệu input, output của database server đều được ứng
dụng web ở tầng Logic xử lý. Các vấn đề an ninh phát sinh đa phần sẽ nằm ở tầng này.
1.2. Tầm quan trọng của các câu lệnh SQL đối với một hệ thống web
Cơ sở dữ liệu (database) được coi như là “trái tim” của hầu hết các website. Nó chứa
đựng những dữ liệu cần thiết để website có thể chạy và lưu trữ các thông tin phát sinh
trong quá trình chạy. Nó cũng lưu trữ những thông tin cá nhân, thẻ tín dụng, mật khẩu của
khách hàng, của user và thậm chí là cả của Administrator. Để lấy các thông tin cần thiết từ
cơ sở dữ liệu thì các câu lệnh SQL sẽ đảm đương trách nhiệm thực hiện các yêu cầu truy
vấn được đưa ra từ phía người sử dụng, khi người dùng đăng nhập vào hệ thống, lấy một
thông tin nào đó trên web thì đều cần sử dụng các câu lệnh SQL, hay nói cách khác, các
câu lệnh SQL đóng một vai trò rất quan trọng đối với một hệ thống web.
1.3. Sql injection và tính nghiêm trọng của vấn đề an ninh cơ sở dữ liệu
1.3.1. Sql Injection là gì?
SQL (Structured Query Language) injection là một kỹ thuật cho phép những kẻ tấn
công lợi dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các
thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu
lệnh SQL bất hợp pháp.
12


SQL Injection là một dạng tấn công dễ thực hiện, hầu hết mọi thao tác người tấn
công cần được thực hiện với một trình duyệt web, có thể kèm theo một ứng dụng proxy
server. Chính vì đơn giản như vậy cho nên bất cứ ai cũng có thể học cách tiến hành một
cuộc tấn công. Lỗi bắt nguồn từ mã nguồn của ứng dụng web chứ không phải từ phía
database, chính vì thế bất cứ thành phần nào của ứng dụng mà người dùng có thể tương
tác được để điều khiển nội dung (ví dụ: các form, tham số URL, cookie, tham số
referrer, user-agent, …) đều có thể được sử dụng để tiến hành chèn truy vấn có hại.
1.3.2. Hậu quả của tấn công SQL Injection
Hậu quả của SQL Injection rất tai hại, nó có thể cho phép những kẻ tấn công thực
hiện các thao tác, delete, insert, update, v.v. toàn quyền trên cơ sở dữ liệu của ứng dụng,
thậm chí là server mà ứng dụng đó đang chạy. SQL Injection thường được biết đến như là
một vật trung gian tấn công 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, v.v.
1.3.3. SQL Injection và vấn đề an ninh cơ sở dữ liệu
Đây là lỗ hổng trong phát triển ứng dụng web, nó không phải lỗi của database hay của
web sever và hầu hết các lập trình viên vẫn chưa nhận thức được vấn đề này.
Ngày nay, khi triển khai các ứng dụng web trên internet, nhiều người vẫn nghĩ rằng
việc đảm bảo an toàn, bảo mật nhằm giảm thiểu tối đa khả năng bị tấn công từ các tin tặc
chỉ đơn thuần tập chung vào các vấn đề như chọn hệ điều hành, hệ quản trị cơ sở dữ liệu,
websever sẽ chạy ứng dụng, v.v. Tuy nhiên, có một nguy cơ tiềm ẩn ít được quan tâm đó
là các đoạn mã của ứng dụng chạy trên đó cũng tiềm ẩn một lỗ hổng bảo mật rất lớn mà
một trong số đó chính là SQL Injection, dẫn đến ngày nay rất nhiều website ở Việt Nam
cũng như trên thế giới bị tấn công SQL Injection, rất nhiều giải pháp được đưa ra trên
mạng nhưng vẫn không đủ tốt và chưa giải quyết triệt để được vấn đề này.
Sau đây là một thống kê về an ninh cho chúng ta thấy thực trang hiện nay về các cuộc
tấn công SQL Injection:

13


 Các thống kê về an ninh

Chúng ta xem xét báo cáo an ninh của các ứng dụng web gần đây nhất của
Whitehatsec một tổ chức có uy tín trong việc nghiên cứu và hỗ trợ các vấn đề về an ninh
mạng và Ptsecurity một tổ chức chuyên nghiên cứu và đưa ra các giải pháp về an ninh.
 Thống kê các lỗ hổng nghiêm trọng nhất trên ứng dụng web của Whitehatsec:

14


Trích từ nguồn: https://info.whitehatsec.com/rs/675-YBI674/images/WhiteHatStatsReport2018.pdf

Sơ đồ 1.1. Thống kê các lỗ hổng nghiêm trọng nhất trên ứng dụng web – Whitehatsec

15


 Thống kê các lỗi bảo mật nghiêm trọng nhất của Ptsecurity:

Trích từ nguồn: https://www.ptsecurity.com/ww-en/analytics/web-application-attacks2019/

Sơ đồ 1.2. Thống kê các lỗi bảo mật nghiêm trọng nhất - Ptsecurity
 Đánh giá các kết quả thống kê

Dựa vào các thống kê trên có thể rút ra vài nhật xét sau về lỗi SQL Injection:
- Là một trong những lỗi bảo mật phổ biến nhất.
- Xác xuất gặp phải lỗ hổng bảo mật này trong một trang web là khá cao.
- Được sử dụng nhiều, lý do một phần bởi tính đợn giản, không đòi hỏi nhiều công cụ hỗ trợ.
- Thời gian khắc phục các điểm yếu này thường khá lâu, do đó hậu quả thường nặng nề hơn.
Trên thực tế các cuộc tấn công SQL Injection thường nhằm đến các cơ sở dữ liệu
mang tính thương mại, ví dụ các trang web thương mại điện tử. Thông thường, các cuộc
tấn công này thường tiến hành đánh cắp hoặc sửa đổi nội dung của database đối tượng và
chèn các đoạn mã Script độc hại. Bản chất điểm yếu SQL Injection là xuất hiện từ trong
quá trình sử lý dữ liệu input của người dùng bên trong mã nguồn, do chính thời gian bảo
16


trì mã nguồn thường kéo dài nên các lỗi SQL Injection cũng chậm được khắc phục triệt
để.
 Nhận định

Với tính nghiêm trọng của các cuộc tấn công, tính dễ thực hiện một cuộc tấn công đã
khiến cho SQL Injection một thời từng là hiểm họa nghiêm trọng đối với các giao dịch
thương mại điện tử trên các ứng dụng web được phát triển thiếu an toàn. Hiện nay, việc
nghiên cứu SQL Injection đã có hệ thống và toàn diện hơn, mối nguy hiểm này đã giảm
đi, nhưng số liệu thống kê vẫn cho thấy vấn đề này vẫn chưa được giải quyết triệt để.
Ở nước ta, trong quá trình đào tạo, các lập trình viên ứng dụng web được đào tạo
nhiều kiến thức và kỹ năng cần thiết, tuy nhiên các kiến thức về bảo mật hầu như không
được chú trọng đúng mức. Điều này vô hình chung dẫn đến hệ quả là các sản phẩm của
họ đều có nguy cơ mắc phải những vấn đề bảo mật, điều mà không đáng có nếu họ được
trang bị tốt hiểu biết từ đầu.

17


CHƯƠNG 2
CÁC DẠNG LỖI SQL INJECTION THƯỜNG GẶP
2.1. Không kiểm tra ký tự thoát truy vấn
Đây là dạng lỗi SQL Injection xảy ra khi dữ liệu đầu vào của người dùng không được
kiểm tra để loại bỏ các ký tự thoát truy vấn và sau đó chính các dữ liệu đó lại được sử
dụng để xây dựng câu lệnh SQL. Kết quả là người dùng cuối có thể thực hiện một số truy
vấn không mong muốn đối với cơ sở dữ liệu của ứng dụng.
Dòng mã sau minh họa lỗi này:
statement = "SELECT * FROM users WHERE name = '" + userName + "';"

Câu lệnh này được thiết kế để trả về các thông tin của người dùng có tên được chỉ
định từ bản ghi người dùng. Tuy nhiên, nếu biến “userName” được nhập chính xác theo
một cách nào đó bởi người dùng ác ý, nó có thể trở thành một câu truy vấn SQL với mục
đích khác hẳn so với mong muốn của tác giả đoạn mã trên.
Ví dụ, ta nhập vào giá trị của biến “userName” như sau:
' OR '1' = '1

Hoặc sử dụng các comment để bỏ qua các phần còn lại của câu truy vấn (có hai loại
chú thích trong SQL).:
' OR '1' = '1'; -' OR '1' = '1'; /*

Khiến câu truy vấn trở thành:
SELECT * FROM users WHERE name = '' OR '1' = '1';
SELECT * FROM users WHERE name = '' OR '1' = '1'; -- ';
SELECT * FROM users WHERE name = '' OR '1' = '1'; /* ';

18


Nếu đoạn mã trên được sử dụng trong một thủ tục xác thực thì ví dụ trên có thể được sử
dụng để bắt buộc lựa chọn tất cả các trường dữ liệu (*) từ tất cả người dùng chứ không phải
từ một tên người dùng cụ thể như là người lập trình dự định vì “'1'

OR '1'”

luôn đúng.

Các giá trị của biến “userName” trong câu truy vấn dưới đây sẽ gây ra việc xoá bảng
người dùng cũng như xóa tất cả các người dùng trong bảng người dùng và lấy ra tất cả các
thông tin của người dùng từ bảng thông tin người dùng (về bản chất là tiết lộ các thông tin
của mọi người dùng).
Ví dụ này minh họa bằng một API cho phép thực hiện nhiều truy vấn cùng lúc:
A'; DROP TABLE users; SELECT * FROM userinfo WHERE '1' = '1

Điều này đưa tới cú pháp cuối cùng của câu truy vấn trên như sau:
SELECT * FROM users WHERE name = 'A'; DROP TABLE users; SELECT * FROM userinfo
WHERE '1' = '1';

Trong khi hầu hết các SQL server cho phép thực hiện nhiều truy vấn cùng lúc chỉ với
một lần gọi, tuy nhiên một số SQL API như “mysql_query()” của PHP lại không cho
phép điều đó vì lý do bảo mật. Điều này chỉ ngăn cản tin tặc tấn công bằng cách sử dụng
các câu lệnh riêng rẽ mà không ngăn cản tin tặc thay đổi các từ trong cú pháp truy vấn.
2.2. Xử lý không đúng kiểu
Lỗi SQL Injection dạng này thường xảy ra do lập trình viên khi định nghĩa đầu vào dữ liệu
không rõ ràng hoặc thiếu bước kiểm tra và lọc kiểu dữ liệu đầu vào. Điều này có thể xảy ra khi
một trường số được sử dụng trong truy vấn SQL nhưng lập trình viên lại thiếu bước kiểm tra
dữ liệu đầu vào để xác minh kiểu của dữ liệu mà người dùng nhập vào có phải là số hay không.
Ví dụ như sau:
Statement := "SELECT * FROM userinfo WHERE id = " + a_variable + ";"

Ta có thể nhận thấy một cách rõ ràng ý định của tác giả đoạn mã trên là nhập vào một
số tương ứng với trường id - trường số. Tuy nhiên, người dùng cuối, thay vì nhập vào
19


một số, họ có thể nhập vào một chuỗi ký tự, và do vậy có thể trở thành một câu truy vấn
SQL hoàn chỉnh mới mà bỏ qua ký tự thoát.
Ví dụ, ta thiết lập giá trị của biến “a_variable” là:
1; DROP TABLE users

Khi đó, nó sẽ thực hiện lấy ra thông tin người dùng có id = 1 và thực hiện thao tác
xóa bảng người dùng khỏi cơ sở dữ liệu, vì câu truy vấn hoàn chỉnh đã được hiểu là:
SELECT * FROM userinfo WHERE id = 1; DROP TABLE users;

2.3. Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu
Đôi khi lỗ hổng có thể tồn tại chính trong phần mềm máy chủ cơ sở dữ liệu, ví dụ trường
hợp hàm “mysql_real_escape_string()” của các máy chủ MySQL. Điều này sẽ cho
phép kẻ tấn công có thể thực hiện một cuộc tấn công SQL Injection thành công dựa trên những
ký tự Unicode thông thường ngay cả khi dữ liệu đầu vào đã được kiểm tra thoát truy vấn.
2.4. Blind SQL Injection
Lỗi SQL Injection dạng này là dạng lỗi tồn tại ngay trong ứng dụng web nhưng hậu
quả của chúng lại không hiển thị trực quan cho những kẻ tấn công. Nó có thể gây ra sự sai
khác khi hiển thị nội dung của một trang chứa lỗi bảo mật này, loại tấn công này thường
tốn nhiều thời gian.
Những kẻ tấn công còn có thể sử dụng một số công cụ để dò tìm lỗi dạng này và tấn
công khi vi trí lỗ hổng với những thông tin mục tiêu đã được thiết lập sẵn, ngoài ra những
kẻ tấn công có thể sử dụng một số kỹ thuật để xác định xem ứng dụng web có bị lỗi và
thực hiện khai thác.
Dưới đây là một số kỹ thuật giúp kẻ tấn công có thể xác định được một ứng dụng web
có bị lỗi Blind SQL Injection hay không:

20


2.4.1. Thay đổi giá trị điều kiện truy vấn
Dạng lỗi này khiến cho kẻ tấn công có thể thay đổi giá trị điều kiện trong câu truy
vấn, làm sai lệch sự hiển thị của một ứng dụng chứa lỗi này.
SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1 = 1;

Sẽ hiển thị một trang một cách bình thường, trong khi:
SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1 = 2;

Sẽ hiển thị một nội dung khác, hoặc không hiển thị gì nếu ứng dụng web có chứa lỗi
SQL Injection dạng này. Lỗ hổng dạng này còn cho phép tin tặc không chỉ gây ảnh hưởng
tới bảng hay dữ liệu hiện tại mà còn ảnh hưởng tới những dữ liệu hay bảng khác phụ
thuộc vào nội dung của dữ liệu hay bảng hiện tại.
2.4.2. Điều kiện lỗi
Lỗi SQL Injection dạng này dẫn tới việc buộc cơ sở dữ liệu chỉ được phép đánh giá
khi mà giá trị của câu lệnh “WHERE” là đúng. Ví dụ:
SELECT 1/0 FROM users WHERE username = 'Admin';

Phép chia cho 0 chỉ được đánh giá là lỗi khi mà người dùng có tên “ Admin” tồn tại
trong cơ sở dữ liệu.
2.4.3. Thời gian trễ
Lỗi SQL Injection dạng này tồn tại khi thời gian xử lý của một hay nhiều truy vấn
SQL phụ thuộc vào dữ liệu logic được nhập vào hoặc quá trình xử lý truy vấn của SQL
engine cần nhiều thời gian. Tin tặc có thể sử dụng lỗi SQL Injection dạng này để xác định
thời gian chính xác mà trang cần tải khi giá trị nhập vào là đúng.
Ví dụ:
http://www.site.com/vulnerable.php?id=1 'waitfor delay '00: 00: 10' -

21


CHƯƠNG 3
CÁC DẠNG TẤN CÔNG SQL INJECTION PHỔ BIẾN
Các cuộc tấn công nhắm tới lớp database của ứng dụng web xét theo mục đích được
chia làm hai loại chính:
- Thứ nhất là nhắm tới dữ liệu chứa trong database, loại này thường là kẻ tấn công nhắm
tới các thông tin có giá trị như thông tin cá nhân, thông tin tài chính, như mật khẩu, thẻ tín
dụng, v.v.
- Thứ hai là nhắm tới chính bản thân database, loại này thì kẻ tấn công có thể sử dụng
những thông tin khai thác được để tạo dấu vân tay cho cơ sở dữ liệu, xây dựng biểu đồ cơ
sở dữ liệu, truy xuất dữ liệu từ bất kỳ bảng nào trong cơ sở dữ liệu, biết database thành
cửa ngõ và tiến hành một cuộc tấn công leo thang, để thâm nhập sâu hơn vào trong mạng
lưới của tổ chức sở hữu ứng dụng web đang tấn công.
Chúng ta xét một số phương pháp tấn công thông thường nhằm phục vụ hai mục đích
trên bao gồm: vượt qua kiểm tra lúc đăng nhập (authorization bypass), sử câu lệnh
SELECT, sử dụng câu lệnh INSERT, sử dụng các Stored-Procedures, sử dụng Blind SQL
Injection, v.v.
3.1. Dạng tấn công vượt qua kiểm tra đăng nhập (Authorization bypass)
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.
Xét một ví dụ điển hình, 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.
Ví dụ, trong trường hợp sử dụng PHP, người ta có thể dùng 2 trang: 1 trang HTML để
hiển thị Form nhập liệu và 1 trang PHP để xử lý thông tin nhập vào từ phía người dùng
như sau:

22


- Trang nhập liệu: Login.html


Username:


Password:





- Trang xử lý đăng nhập: ExecuteLogin.php

private function User_Login(){
if(isset($_POST['Login'])){
$Username = $_POST['Username'];
$Password = $_POST['Password'];
$Password = md5($Password);
$sql = "SELECT * FROM `BQ_USERS` WHERE `USER_NAME` =
'$Username' AND `USER_PASSWORD` = '$Password'";
$user = array();
$result = mysqli_query($this->conn, $sql);
if($result -> num_rows > 0){
$user = mysqli_fetch_assoc($result);
echo "You are logged in as " . $user['user_name']);
}else{

23


echo "Invalid login!";
}
}
}

Nhìn qua, đoạn mã trong trang ExecuteLogin.php dường như không chứa bất cứ
một lỗ hổng về an toàn nào. Người dùng không thể đăng nhập mà không có tên đăng nhập
và mật khẩu hợp lệ. Tuy nhiên, đoạn mã này thực sự không an toàn và là tiền đề cho một
lỗi SQL Injection.
Đặc biệt, chỗ sơ hở nằm ở chỗ dữ liệu nhập vào từ người dùng được dùng để xây
dựng trực tiếp câu lệnh SQL. Chính điều này cho phép những kẻ tấn công có thể điều
khiển câu truy vấn sẽ được thực hiện.
Ví dụ, nếu người dùng nhập chuỗi sau vào trong cả hai ô nhập liệu Username và
Password của trang Login.htm là:
1' OR 1 = 1 # Hoặc 1' OR '1' = '1

Lúc này, câu truy vấn sẽ được gọi thực hiện là:
SELECT * FROM `BQ_USERS` WHERE `USER_NAME` = '1' OR 1=1 # ' AND
`USER_PASSWORD` = '1' OR 1=1 #'

Hoặc:
SELECT * FROM `BQ_USERS` WHERE `USER_NAME` = ' 1' OR '1' = '1' AND
`USER_PASSWORD` = ' 1' OR '1' = '1'

Giá trị “1=1 Hoặc '1' = '1'” Là luôn đúng.
Câu truy vấn này là hợp lệ và sẽ trả về tất cả các bản ghi của BQ_USERS và đoạn mã tiếp
theo xử lý người dùng đăng nhập bất hợp pháp này như là người dùng đăng nhập hợp lệ.

24


3.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ô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.
Xét một ví dụ rất thường gặp trong các website về tin tức. Thông thường, sẽ có một
trang nhận ID của tin cần hiển thị rồi sau đó truy vấn nội dung của tin có ID này.
Ví dụ: https://site.com/shownews.php?ID=1024
Mã nguồn cho chức năng này thường được viết khá đơn giản theo dạng:
private function Get_News(){
$NewsID = $_GET['ID'];
$sql = "SELECT * FROM `BQ_NEWS` WHERE `NEWSID` = $NewsID";
$result = mysqli_query($this->conn, $sql);
...
}
}

Trong các tình huống thông thường, đoạn mã này 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ỗi SQL Injection khác. Kẻ tấn công có
thể thay thế một ID hợp lệ bằng cách gán ID cho một giá trị khác, và từ đó, khởi đầu cho
một cuộc tấn công bất hợp pháp.
Ví dụ: Kẻ tấn công có thể thay thế URL với một giá trị khác như:
https://site.com/shownews.php?ID=0 OR 1=1
Câu truy vấn SQL lúc này sẽ trả về tất cả các article từ bảng dữ liệu vì nó sẽ thực hiện
câu lệnh:
SELECT * FROM `BQ_NEWS` WHERE `NEWSID` = 0 OR 1=1

Một trường hợp khác, ví dụ như 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, v.v. Đoạn mã thường gặp là:
25


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×

×