Tải bản đầy đủ (.pdf) (24 trang)

Tan cong SQL Injection

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.53 MB, 24 trang )

LỜI MỞ ĐẦU
Với sự bùng nổ của internet kèm theo đó là sự phát triển của World Wide Web trong
những năm gần đây. Các doanh nghiệp, cá nhân, và các chính phủ đã phát hiện ra rằng các
trang web hay các ứng dụng web có thể cung cấp đầy đủ các giải pháp hiệu quả, đáng tin cậy
và có thể giải quyết các thách thức về giao tiếp và tiến hành thương mại hóa trong thế kỷ XX.
Tuy nhiên, sự an toàn của các trang web hay các ứng dụng web đã trở nên ngày càng quan
trọng trong thập kỷ qua. Ngày nay, các trang web về giáo dục, y tế, tài chính hay các dữ liệu
nhạy cảm đang phải đối mặt với nhiều nguy cơ bị tấn công từ các hacker. Tại Việt Nam trong
năm vừa qua đã có nhiều cuộc tấn công nhắm vào các tổ chức lớn gây thiệt hại rất nhiều cho
doanh nghiệp, tổ chức. Nổi bật nhất là cuộc tấn công vào trang chủ của VietnamAirlines bởi
một nhóm hacker có tên 1937CN từ Trung Quốc gây chú ý rất nhiều trong dư luận.
Nhiều lỗ hổng trang web không được kiểm tra kỹ để điều khiển các ứng dụng trên
trang web là nguyên nhân để các hacker có thể dựa vào đó để tấn công. SQL Injection là một
dạng tấn công phổ biến nhất được sử dụng. Ngoài ra còn có một số dạng tấn công khác như:
Shell Injection, Script language injection, file inclusion, XML injection, XPATH injection....
SQL Injection là một dạng công nghệ tấn công vào cơ sở dữ liệu của một trang web.
Với việc lợi dụng các lỗ hỗng của các câu lệnh truy vấn, các hacker có thể thêm vào một số
câu lệnh truy vấn SQL để có thể lấy được dữ liệu hoặc chiếm quyền truy cập để thay đổi dữ
liệu.

1


MỤC LỤC
LỜI MỞ ĐẦU.............................................................................................................................................1
DANH MỤC HÌNH VẼ..............................................................................................................................3
CHƯƠNG 1: TỔNG QUAN VỀ ĐỀ TÀI...................................................................................................4
1.1

LÝ DO CHỌN ĐỀ TÀI...............................................................................................................4


1.2

PHẠM VI NGHIÊN CỨU...........................................................................................................4

CHƯƠNG 2: TỔNG QUAN VỀ SQL INJECTION....................................................................................5
2.1

TỔNG QUAN VỀ ỨNG DỤNG WEB .......................................................................................5

2.1.1 Tổng quan và quá trình hoạt động của một ứng dụng web.........................................................5
2.1.2 Các vần đề liên quan đến ứng dụng web....................................................................................6
2.1.3 Thực trạng tấn công web bằng sql Injection...............................................................................6
2.2

TỔNG QUAN VỀ SQL INJECTION..........................................................................................7

2.2.1 Khái niệm về SQL Injection.......................................................................................................7
2.2.2 Các mối đe dọa chính từ SQL Injection.....................................................................................9
2.2.3 Các dạng lỗi thường gặp...........................................................................................................10
CHƯƠNG 3: CÁC DẠNG TẤN CÔNG VÀ BIỆN PHÁP NGĂN CHẶN SQL INJECTION.................10
3.1

CÁC DẠNG TẤN CÔNG SQL INJECTION............................................................................10

3.1.1 System Stored Procedure (Hệ thống thủ tục lưu trữ)................................................................10
3.1.2 Illegal/Logically Incorrect Query (Lệnh truy vấn bất hợp pháp hay không đúng logic)...........10
3.1.3 Tautology (Tấn công mệnh đề luôn đúng)...............................................................................11
3.1.4 Union Query.............................................................................................................................12
3.1.5 Blind SQL Injection.................................................................................................................12
3.2 DEMO TẤN CÔNG SQL INJECTION...........................................................................................13

3.2.1 Các công cụ cần thiết................................................................................................................13
3.2.2 Các bước tấn công và kết quả...................................................................................................15
3.3 CÁC BIỆN PHÁP NGĂN CHẶN SQL INJECTION......................................................................19
3.3.1 Đối với website (dành cho lập trình viên).................................................................................19

2


3.3.2 Đối với web server (dành cho quản trị mạng)...........................................................................20
3.3.3 Đối với database server (dành cho quản trị mạng)....................................................................20
3.3.4 Hạn chế bị phát hiện lỗi ..........................................................................................................20
3.3.5 Phòng chống từ bên ngoài........................................................................................................21
3.3.6 Cải thiện dữ liệu nhập vào.......................................................................................................21
3.3.7 Một số công cụ quét và kiểm tra lỗi SQL Injection hiệu quả...................................................22
CHƯƠNG 4 : KẾT LUẬN........................................................................................................................23
TÀI LIỆU THAM KHẢO.........................................................................................................................24

DANH MỤC HÌNH VẼ
Hình 3.1 Cấu trúc một cơ sở dữ liệu đơn giản..................................................................14
Hình 3.2 Giải nén github sqlmap-master..........................................................................15
Hình 3.3 Tìm kiếm mục tiêu tấn công.............................................................................15
Hình 3.4 Trang web là mục tiêu tấn công.........................................................................16
Hình 3.5 Kết quả trả về tên các cơ sở dữ liệu..................................................................16
Hình 3.6 Tên các bảng có trong cơ sở dữ liệu................................................................. 17
Hình 3.7 Kết quả truy vấn bảng "user"..........................................................................18
Hình 3.8 Kết quả truy vấn bảng "administrator "............................................................18

3



CHƯƠNG 1: TỔNG QUAN VỀ ĐỀ TÀI
1.1

LÝ DO CHỌN ĐỀ TÀI
Ngày nay nhiều trang web hay ứng dụng web cho phép người dùng có thể truy cập và

xem được các thông tin từ cơ sở dữ liệu thông qua internet. Các cơ sở dữ liệu này hầu hết
không được bảo vệ thích hợp và dễ bị khai thác trước các cuộc tấn công kiểu SQL Injection.
Câu lệnh SQL là một loại ngôn ngữ truy vấn dung để truy câp và thay đổi các thông tin trong
cơ sở dữ liệu của một website. Một số câu lệnh phổ biến nhất là thêm, chèn, xóa và sửa. Nếu
trang web không được bảo vệ một các thích hợp và chính xác, người dùng truy cập vào trang
web có thể lợi dụng để viết lại một số câu lệnh SQL làm mất dữ liệu hay phá hủy cơ sở dữ
liệu của trang web.
Với mục đích tìm hiểu và nghiên cứu để hiểu rõ hơn cách mà một hacker tấn công vào
một trang web chứa các lỗi bảo mật về cơ sở dữ liệu đồng thời đưa ra các giải pháp để ngăn
chặn các cuộc tấn công này.
1.2

PHẠM VI NGHIÊN CỨU

Trong đề tài này nhóm tập trung nghiên cứu các phần sau:
-

Nghiên cứu tổng quan về môi trường web, tấn công SQL Injection và các lỗ hổng để
khai thác và tấn công bằng SQL Injection.

-

Nghiên cứu quá trình tấn công một trang web bằng kiểu tấn công SQL Injection.


-

Thực hiện tấn công một ttrang web trên thực tế sử dụng github.

-

Nghiên cứu cách ngăn chặn một cuộc tấn công vào cơ sở dữ liệu một trang web.

-

Đưa ra các các giải pháp hiệu quả để đối phó với các cuộc tấn công vào trang web.

4


CHƯƠNG 2: TỔNG QUAN VỀ SQL INJECTION
2.1

TỔNG QUAN VỀ ỨNG DỤNG WEB .

2.1.1 Tổng quan và quá trình hoạt động của một ứng dụng web
Một ứng dụng web là một chương trình phần mềm cho phép người dùng truy cập
thông qua một trình duyệt web. Các ứng dụng web có thể được truy cập chỉ thông qua một
trình duyệt web (IE, Firefox, Chrome,...). Người dùng có thể truy cập các ứng dụng từ bất kỳ
một máy tính nào của một mạng. Thời gian đáp ứng phản hồi phụ thuộc vào tốc độ kết nối.
Bước 1: Người dùng gửi các yêu cầu truy cập thông qua trình duyệt web từ Internet đến các
máy chủ web.
Bước 2: Máy chủ web chấp nhận các yêu cầu và chuyển tiếp các yêu cầu của người dùng và
áp dụng các yêu cầu này cho ứng dụng.
Bước 3: Máy chủ web thực hiện các nhiệm vụ được yêu cầu.

Bước 4: Các ứng dụng web kết nối đến cơ sở dữ liệu có sẵn và trả về kết quả cho web server.
Bước 5: Máy chủ web sẽ trả về kết quả cho người dùng khi quá trình hoàn tất.
Bước 6: Cuối cùng các thông tin mà người dùng yêu cầu sẽ xuất hiện trên màn hình của
người dùng.
Các ứng dụng web được truy cập bằng các hình thức GET hoặc POST từ các URL và
Cookie, thông qua các logic của lập trình viên các thông tin cần lấy sẽ được gửi đến cơ sở dữ
liệu và trả về kết quả theo đúng yêu cầu người dùng. Không may là có một số yêu cầu không
hợp lệ nhưng vấn được trả về kết quả được lấy từ cơ sở dữ liệu từ đó làm cho trang web dễ bị
tấn công bởi dạng SQL Injection.
Những kẻ tấn công sẽ lợi dụng các lỗ hổng này để lấy những thông tin cần thiết trong cơ
sở dữ liệu, lấy những tài liệu nhạy cảm, xóa bỏ hay phá hủy các dữ liệu quan trọng, hay thực
hiện một cuộc tấn công DoS làm giới hạn số người sử dụng.

5


2.1.2 Các vần đề liên quan đến ứng dụng web
Có một số yếu tố làm cho các ứng dụng web không được bảo vệ an toàn. Thứ nhất, nhiều
ứng dụng được viết trong thời điểm mà yếu tố bảo mật chưa được đặt lên hàng đầu. Điều này
làm cho các cuộc tấn công SQL Injection diễn ra dễ dàng. Trong thời điểm này các cuộc thảo
luận về lỗ hổng SQL Injection được diễn ra với tần suất thấp vì thế hầu hết các nhà phát triển
đều không nhận thức được mối nguy hiểm này.
Ngoài ra, hầu hết các ứng dụng web được viết ra có thể tương tác trực tiếp với cơ sở dữ
liệu web mà không cần thông qua các biện pháp mã hóa hay xác thực. Một dự án nghiên cứu
X-Force của IBM gần đây đã phát hiện ra rằng 47% lỗ hổng bảo mật trên website hiện nay
liên quan đến ứng dụng web. Cross-Site Scripting & SQL Injection tiếp tục thống trị các cuộc
tấn công trong số các lựa chọn khác.Vấn đề thực sự lớn hơn rất nhiều, theo Neira Jones,
người đứng đầu của thanh toán an ninh cho ngân hàng Barclays, 97% vi phạm dữ liệu trên
toàn thế giới vẫn còn do một SQL được thêm vào các câu lệnh trong lúc gửi yêu cầu đến máy
chủ.

Một số nguyên nhân dẫn đến sự đa dạng của các lỗ hổng bảo mật web hiện nay:
-

Người lập trình tự phát triển ứng dụng Web (Sử dụng các ngôn ngữ kịch bản để tạo
ứng dụng, phát triển rộng rãi mà ít quan tâm đến quá trình phát triển ứng dụng an
toàn. Thiếu đội ngũ lập trình với kỹ năng nhận biết phát triển ứng dụng tránh các
lỗi bảo mật).

-

Sử dụng ứng dụng Web từ mã nguồn mở (Thường không theo dõi và cập nhật các
bản vá lỗi bảo mật).

-

Phát triển ứng dụng Web từ một ứng dụng mở khác (Trường hợp này thường
không kiểm tra lỗi bảo mật ứng dụng củ trước khi phát triển tiếp, nên vẫn tồn tại
các lỗi bảo mật).

2.1.3 Thực trạng tấn công web bằng sql Injection
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 trong năm 2006 khi mà tin tặc thấy đây chính là "một hũ mật ngọt" các thông tin tài
chính và cá nhân của người dùng.
6


Hãng bảo mật SecureWorks cho biết đã phát hiện tới 8.000 vụ tấn công lên các cơ sở dữ liệu
mỗi ngày. Như vậy, con số này đã tăng thêm trung bình từ 100 đến 200 vụ tấn công một ngày
so với con số của 3 tháng đầu năm 2006.
Một trong những vụ tấn công SQL Injection nổi tiếng nhất chính là vụ tấn công vào

CardSystems Solutions - một hãng chuyên lưu trữ có sở dữ liệu thanh toán thẻ tín dụng. Tin
tặc đã sử dụng giải pháp tấn công SQL Injection để chiếm quyền điều khiển hệ thống cơ sở
dữ liệu của CardSystems và chuyển toàn bộ cơ sở dữ liệu ra ngoài. Đã có khoảng 40 triệu thẻ
tín dụng rơi vào tay chúng gây ra thiệt hại hàng triệu USD.
Rất nhiều ông lớn từng bị dí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.
2.2

TỔNG QUAN VỀ SQL INJECTION

2.2.1 Khái niệm về SQL Injection
SQL 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. SQL injection
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. 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 ...
SQL Injection là một trong những kiểu hack web bằng cách inject các mã SQL query/
command vào input trước khi chuyển cho ứng dụng web xử lí, bạn có thể login mà không
cần username và password, remote execution (thực thi từ xa), dump data và lấy root của
SQL server. Công cụ dùng để tấn công là một trình duyệt web bất kì, chẳng hạn như Internet
Explorer, Netscape, Lynx, ...
2.2.2 Các mối đe dọa chính từ SQL Injection
Các mối đe dọa chính của SQL Injection:
7


-


Snoofing identity (Mạo danh): Những kẻ tấn công sẽ mạo danh một email hoặc một
trang web của một tổ chức để đánh lừa người dùng.

-

Changing prices (Thay đổi giá): Một trong số những vấn đề của SQL Injection là nó
có thể thay đổi dữ liệu. Ở đây, những kẻ tấn công sẽ thay đổi giá cả một trang mua
sắm trực tuyến để có thể mua sản phẩm đó với giá rẻ hơn.

-

Tamper with database records (Xáo trộn các hồ sơ cơ sở dữ liệu): Cơ sở dữ liệu
chính sẽ hoàn toàn bị hư hại; thậm chí còn có khả năng đã bị thay thế hoàn toàn hoặc
thậm chí bị xóa hết dữ liệu.

-

Escalation of privileges (Leo thang đặc quyền): Một khi hệ thống bị tấn công, kẻ
tấn công sẽ tìm kiếm đặc quyền truy cập cao nhất của các thành viên quản trị để có thể
chiếm quyền truy cập vào hệ thống cũng như vào mạng nội bộ.

-

Denial-of-service on the server (Từ chối các dịch vụ từ máy chủ): Từ chối dịch vụ
từ máy chủ là một dạng tấn công mà người dùng không thể truy cập vào hệ thống.
Ngày càng nhiều yêu cầu được gửi đến máy chủ mà không thể sử lý nó. Điều này dẫn
đến tạm ngưng dịch vụ của máy chủ.

-


Complete disclosure of all the data on the system (Lộ tất cả thông tin dữ liệu của
hệ thống): Một khi một hệ thống bị tấn công các dữ liệu quan trọng và bí mật như: số
thẻ tín dụng, chi tiết nhân viên về hồ sơ và tài chính,…v.v sẽ bị tiết lộ.

-

Destruction of data (Phá hủy dữ liệu): Những kẻ tấn công sau khi chiếm hoàn toàn
quyền hệ thống sẽ phá hủy hoàn toàn dữ liệu, kết quả làm tổn thất rất lớn cho công ty.

-

Voiding system's critical transaction (Tránh các giao dịch quan trọng của hệ
thống): Những kẻ tấn công có thể vận hành hệ thống tránh tất cả các giao dịch.

-

Modifying the records (Thay đổi hồ sơ): Kẻ tấn công có thể sửa đổi các dữ liệu
trong cơ sở dữ liệu của công ty, gây ra trở ngại lớn cho hệ thống quản lý cơ sở dữ liệu
công ty

2.2.3 Các dạng lỗi thường gặp
- Không kiểm tra ký tự thoát truy vấn

8


Đây là dạng lỗi SQL injection xảy ra khi thiếu đoạn mã kiểm tra dữ liệu đầu vào trong câu
truy vấn 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 sẽ 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 bản ghi tên người dùng cụ thể từ bảng những 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:
a' or 't'='t
Khiến câu truy vấn có thể được hiểu như sau:
SELECT * FROM users WHERE name = 'a' or 't'='t';
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 một tên người dùng hợp lệ bởi 't'='t' luôn đúng. 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. 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á những người dùng từ bảng người dùng cũng tương tự như
việc xóa tất cả các dữ liệu được từ bảng dữ liệu (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 data WHERE 't' = 't
Đ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
data WHERE 't' = 't';
- 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 hay người dùng đị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:
9



statement:= "SELECT * FROM data 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 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 thao tác xóa người dùng có id tương ứng khỏi cơ sở dữ liệu, vì câu
truy vấn hoàn chỉnh đã được hiểu là:
SELECT * FROM data WHERE id=1;DROP TABLE users;
- 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, như là
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 không thông thường ngay cả khi đầu nhập vào đang được thoát.Chữ đậm

CHƯƠNG 3: CÁC DẠNG TẤN CÔNG VÀ BIỆN PHÁP NGĂN CHẶN SQL
INJECTION
3.1 CÁC DẠNG TẤN CÔNG SQL INJECTION
3.1.1 System Stored Procedure (Hệ thống thủ tục lưu trữ)
Những kẻ tấn công cố gắng khai thác các thủ tục lưu trữ dữ liệu của hệ thống. Sau đó xác
định loại cơ sở dữ liệu và sử dụng kiến thức để xác định các thủ tục lưu trữ tồn tại. Tấn công
vào thủ tục lưu trữ kẻ tấn công có thể tạo ra lỗi tràn bộ đệm, leo thang đặc quyền hoặc chiếm
quyền truy cập vào hệ điều hành.
3.1.2 Illegal/Logically Incorrect Query (Lệnh truy vấn bất hợp pháp hay không đúng
logic)
Trong loại tấn công này, những kẻ tấn công sẽ cố gắng thu thập đầy đủ các thông tin về
cấu trúc back-end của cơ sở dữ liệu một trang web. Những kẻ tấn công sẽ gửi một câu lệnh
truy vấn SQL không hợp lệ hoặc không đúng logic đến cơ sở dữ liệu của trang web, một số
10



máy chủ sẽ trả về những thông báo lỗi mặc định và những kẻ tấn công có thể lợi dụng các
điểm yếu này. Từ việc khai thác các thông báo lỗi mặc định những kẻ tấn công có thể khai
thác được số bảng, số cột,.. của cơ sở dữ liệu.
Có nhiều cách để gửi một lệnh truy vấn không hợp lệ hay bất hợp pháp như: thêm kí tự
(‘) vào cuối câu lệnh truy vấn, sử dụng toán tử AND để thực hiện một câu lệnh sai logic, sử
dụng order by hay mệnh đề having... để máy chủ trả về một thông báo lỗi.
3.1.3 Tautology (Tấn công mệnh đề luôn đúng)
Các cuộc tấn công này hoạt động bằng cách thêm vào mệnh đề WHERE của câu lệnh
truy vấn một tuyên bố luôn đúng. 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.
Xét 1 đoạn code php sau:
$uname=$_POST['uname'];
$passwrd=$_POST['passwrd'];
$query="select

username,pass

from

users

where

username='$uname'


and

password='$passwrd'";
$result=mysql_query($query);
Thử tài khoản đăng nhập và mật khẩu bằng: 'or ''=', thì cầu truy vấn sẽ thành 1 câu như sau:
select username,pass from users where username='' or ''='' and password='' or ''=''
Do mệnh đề luôn đúng nên dễ dàng đăng nhập tài khoản.

11


3.1.4 Union Query
Cuộc tấn công dạng này được thực hiện bằng cách thêm vào một tham số hình thức có dạng:
‘UNION SELECT <câu lệnh truy vấn>’
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.
Những kẻ tấn công có thể xóa toàn bộ cơ sở dữ liệu bằng cách chèn vào các đoạn lệnh
nguy hiểm như DROP TABLE. Ví dụ như :’DROP TABLE_AUTHORS-’
Để biết được ứng dụng web bị lỗi dạng này hãy nhập vào chuỗi (*) như sau:
‘UNION SELECT ALL SELECT OtherField FROM OtherTable WHERE’’=’ (*)
Nếu hệ thống báo lỗi về cú pháp dạng : Invalid object name” OtherTable”; ta có thể biết
chắc là hệ thống đã thực hiện câu SELECT sau từ khóa UNION, vì như vậy mới có thể trả về
lỗi mà ta đã cố tình tạo ra trong câu lệnh SELECT.

Trong SQL Server, có hai đối tượng là sysobjects và syscolumns cho phép liệt kê tất các
tên bảng và cột có trong hệ thống. Để có thể biết được tên của các bảng dữ liệu mà thực hiện
các thao tác phá hoại khi ứng dụng web bị lỗi SQL injection. Ta chỉ cần chỉnh lại câu lệnh
SELECT:
‘UNION SELECT name FROM sysobjects WHERE xtype=’U’ là có thể liệt kê được tất cả

các bảng dữ liệu.
3.1.5 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, hậu quả của sự tấn công SQL
injection dạng này khiến cho lập trình viên hay người dùng phải mất rất nhiều thời gian để
phục hồi chính xác từng bit dữ liệu. 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 với những thông tin đã được thiết lập sẵn.
12


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.
Đ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='Ralph';
Phép chia cho 0 chỉ được đánh giá là lỗi khi mà người dùng có tên "Ralph" tồn tại trong cơ
sở dữ liệu.
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.
3.2 DEMO TẤN CÔNG SQL INJECTION
3.2.1 Các công cụ cần thiết
Giới thiệu cấu trúc cơ sở dữ liệu:

13


Hình 3.1 Cấu trúc một cơ sở dữ liệu đơn giản
-Cơ sở dữ liệu ó cấu trúc hình cây với các thành phần:


Database

: Ví dụ "iot15h", "mysql" chứa các bảng dữ liệu(tables).



Table

: Ví dụ "dht11" , "func", "columns_priv" chứa hàng và cột dữ liệu.



Columns

: Ví dụ "TEMP"," HUM" các cột dữ liệu.

- CSDL có nhiệm vụ lưu trữ và trích xuất dữ liệu phục vụ cho việc truy vấn lên server.

- Tải Github phục vụ cho việc tấn công.

14


3.2.2 Các bước tấn công và kết quả
B1. Sau khi tải github về vài giải nén ta có thư mục:

Hình 3.2 Giải nén github sqlmap-master
B2. Tìm kiếm một số trang web có nguy cơ bị lỗi với từ khóa : php?id=1 vn

Hình 3.3 Tìm kiếm mục tiêu tấn công
B3. Lựa chọn một mục tiêu:
VD: " "
Mục tiêu:

15


Hình 3.4 Trang web là mục tiêu tấn công
B4. Mở cmd lên trong thư mục sqlmap-master/ và thực hiện các lệnh:
python sqlmap.py –u " "
"-u" theo sau là đường dẫn Lệnh này để kiểm tra url trên có dính lỗi sqli không
B5. Sau khi phát hiện trang web dính lỗi ta thực hiện truy vấn tên database với câu lệnh:
python sqlmap.py –u " " --dbs
Kết quả trả về:

16



Hình 3.5 Kết quả trả về tên các cơ sở dữ liệu
Ta nhận được về hai database: " information_schema " và " nhuaphucth_inh "
B6. Sau khi có được tên của các database ta chọn ra một database để thực hiện truy vấn:
trong ví dụ này ta chọn database:" nhuaphucth_inh " thực hiện truy vấn các bảng trong
database bằng câu lệnh:
python sqlmap.py -u " " --tables -D
nhuaphucth_inh
Kết quả trả về:

Hình 3.6 Tên các bảng có trong cơ sở dữ liệu
Trên đây là tên các table chứa dữ liệu trong database:" user ", " doi tac ", " product ", ...
B7. Để xem thông tin trong các bảng ta thực hiện lệnh:
python sqlmap.py -u " " --dump –D
nhuaphucth_inh -T "tên bảng"
17


Kết quả trả về với tên bảng = "user":

Hình 3.7 Kết quả truy vấn bảng "user"

Hình 3.8 Kết quả truy vấn bảng "administrator "
18


3.3 CÁC BIỆN PHÁP NGĂN CHẶN SQL INJECTION
Trong hầu hết trình duyệt, những kí tự nên được mã hóa trên địa chỉ URL trước khi sử dụng.
Việc tấn công theo SQL Injection dựa vào những câu thông báo lỗi do đó việc phòng
chống hay nhất là không cho hiển thị những thông điệp lỗi cho người dùng bằng cách thay
thế những lỗi thông báo bằng một trang do người phát triển thiết kế mỗi khi lỗi xảy ra trên

ứng dụng.
Kiểm tra kĩ dữ liệu nhập vào thay thế những kí tự như :
 Đối với các giá trị numeric, hãy chuyển nó sang Interger trước khi thực hiện câu
truy vấn SQL, hoặc dùng ISNUMERIC để chắc chắn nó là một Interger.
 Dùng thuật toán mã hóa dữ liệu.
 Lọc bỏ các ký tự và từ khóa nguy hiểm như: -- , select , where , drop, shutdown …
 Như vậy, có thể thấy lỗi SQL injection khai thác những bất cẩn của các lập trình
viên phát triển ứng dụng web khi xữ lí các dữ liệu nhập vào để xây dựng câu lệnh
SQL. Tác hại từ lỗi SQL injection tùy thuộc vào môi trường và cách cấu hình hệ
thống. Nếu ứng dụng sử dụng quyền dbo(quyền của người sở hữu cơ sỡ dữ liệu owner) khi thao tác dữ liệu, nó có thể xóa toàn bộ các bảng dữ liệu, tạo các bảng
dữ liệu mới,…Nếu ứng dụng sử dụng quyền sa(quyền quản trị hệ thống), nó có thể
điều khiển toàn bộ hệ quản trị cơ sỡ dữ liệu và với quyền hạn rộng lớn như vậy nó
có thể tạo ra các tài khoản người dùng bất hợp pháp để điều khiển hệ thống của
bạn. Để phòng tránh, ta có thể thực hiện ở hai mức.
3.3.1 Đối với website (dành cho lập trình viên):
Cần kiểm tra tính đúng đắn của tất cả dữ liệu đầu vào. Dữ liệu đầu vào không chỉ là các
tham số, mà bao gồm cả cookie, user agent, referer …
Việc kiểm tra tính đúng đắn của dữ liệu có thể dựa trên các phương pháp sau:
- Kiểm tra dựa vào kiểu dữ liệu (số, ngày tháng …)
- Kiểm tra, giới hạn độ dài đầu vào
- -Loại bỏ các ký tự đặc biệt như: ‘ % ” ? # @ & …

19


- -Loại bỏ các từ đặc biệt: select, drop, delete, information_schemal, insert, union, xp_

3.3.2 Đối với web server (dành cho quản trị mạng):
Hầu hết các máy chủ web (web server) hiện nay đều có các module hỗ trợ việc phòng
chống SQL Injection, ví dụ:

Apache có modsecurity, IIS có URLScan. Bạn chỉ cần bật tính năng này và cấu hình
cho phù hợp. Nếu website của bạn là dạng trang tin tức thì rất phù hợp để triển khai. Trong
một số trường hợp khác, các module này có thể chặn nhầm, dẫn tới website hoạt động không
chính xác.
3.3.3 Đối với database server (dành cho quản trị mạng):
Bạn cần thực hiện việc cấu hình phân quyền chặt chẽ đối với các tài khoản. Khi đó, dù
tồn tại lỗi SQL Injection, thiệt hại cũng sẽ được hạn chế. Ngoài ra, bạn cần loại bỏ các bảng,
thành phần và tài khoản không cần thiết trong hệ thống.
3.3.4 Hạn chế bị phát hiện lỗi.
Attacker dựa vào những lỗi trong lập trình ứng dụng để tấn công và cụ thể attacker dựa
vào các dấu hiệu để phát hiện ứng dụng bị lỗi. Vậy việc làm cho các dấu hiệu đó bị che đi,
trở nên khó hiểu hơn, hoặc biến mất…được hầu hết các chuyên gia bảo mật sử dụng. Lưu ý
là kĩ thuật này chỉ dùng để dấu lỗi, còn lỗi trên ứng dụng vẫn còn đó, chỉ là để chống lại sự
phát hiện quá dễ dàng lỗi để kẻ xấu khai thác.
Nhưng những attacker khôn khéo vẫn có thể nhìn thấu được kiểu phòng chống như thế
này. Nó có thể tránh được những tấn công đơn giản như là thêm dấu ‘(dấu nháy) vào cuối
đường dẫn. Vì phương pháp tìm kiếm ứng dụng bị lỗi của những tấn công như thế dựa vào
những dấu hiệu trả về của ứng dụng hoặc trực tiếp từ database. Ta có thể chỉ đưa ra những
thông báo chung chung hoặc định hướng trở lại trang ban đầu(redirect). Trong trường hợp
này, công việc tìm kiếm lỗi và xác định mục tiêu trở nên cực khó đối với attacker.

20


Tuy nhiên attacker luôn tạo ra những công nghệ tìm kiếm lỗi tinh vi hơn, tốt hơn, để
gián tiếp xác định dấu hiệu trả về. Tấn công kiểu này còn được gọi là “Blind SQL Injection”
3.3.5 Phòng chống từ bên ngoài.
Giải pháp này sẽ dùng tường lửa đặc biệt để bảo vệ bạn khỏi những ứng dụng dùng việc
truy cập database với mục đích xấu. Chúng ta cần lưu ý rằng attacker tương tác với ứng dụng
web thông qua một trình duyệt với kết nối từ xa. Sau đó, ứng dụng gởi yêu cầu đến database.

Như vậy chúng ta có thể ngăn chặn các tấn công giữa attacker với ứng dụng, giữa ứng dụng
với database và ngay cả trên chính bản thân database đó.
Những bộ lọc, bộ quét và những điểu khiển truy cập cơ sở dữ liệu sẽ làm cho ứng dụng
web khó bị tấn công hơn.
3.3.6 Cải thiện dữ liệu nhập vào.
Cách phòng chống thực sự để chống lại SQL Injection là kiểm tra và làm đúng các câu
truy vấn. Như chúng ta đã đề cập, lỗi này là do ứng dụng không kiểm tra dữ liệu nhập vào
của người dùng. Do đó người dùng có thể thay đổi, chỉnh sửa, tham số hoặc thêm cả một
thực thể truy vấn vào câu lệnh. Vì thế mỗi dữ liệu nhập của người dùng cần được theo dõi và
có những ràng buộc nhất định.
Thứ nhất, ứng dụng cần phân loại các kiểu dữ liệu nhập vào. Ví dụ, nếu ứng dụng yêu
cầu dữ liệu nhập vào là kiểu số thì khi ứng dụng nhận dữ liệu nhập vào không nên chấp nhận
các kiểu khác ngoại trừ kiểu số. Một số hàm kiểm tra trong PHP:
is_numeric($str) : kiểm tra $str có phải kiểu số hay không
is_int($str) :kiểm tra kiểu interger
is_float($str) :kiểm tra kiểu số thực

Thứ 2, nếu dữ liệu nhập vào không rõ kiểu gì thì ít nhất cũng phải xác định những kiểu
không được phép có thể được gọi. Trong trường hợp này chúng ta sẽ phải lọc các dấu nháy,
lệnh, các kí tự đặc biệt. Một vài việc lọc dữ liệu có thể thực hiện trên toàn bộ ứng dụng( như

21


không bao giờ lưu dữ liệu có dấu ‘ vào cơ sở dữ liệu) và trên một vài kiểu dữ liệu nhập
vào( như không có dấu “,” trong địa chỉ mail).VD:
Trong khi viết một cơ sở dữ liệu hướng ứng dụng, hay khi triển khai một ứng dụng mã
nguồn mở cần chú ý đến các vấn đề như thế và thiết kế để xác minh đúng đầu vào. Biện pháp
này sẽ giúp bảo vệ bạn từ các tấn công SQL Injection không trở thành mồi ngon cho các
attacker.

Hiểu biết về cách phòng chống này là rất quan trọng nếu bạn đang triển khai một ứng
dụng thương mại. Chỉ cần nhớ rằng các nhà phát triển có khả năng vướng lỗi khi lập trình và
bạn sẽ phải thực hiện các bước để sửa các lỗi đó. Và cần làm điều này ngay cả khi chưa có
những lỗ hổng được công khai cho ứng dụng đó.
3.3.7 Một số công cụ quét và kiểm tra lỗi SQL Injection hiệu quả.
Acunetix Web Vulnerability Scanner:Một phiên bản thương mại của chương trình tìm
kiếm các lỗ hổng bảo mật trên các ứng dụng Web. Acunetix WVS tự động kiểm tra các ứng
dụng Web để tìm kiếm các lỗ hổng bảo mật như SQL Injection, hay Cross-Site Scripting, tìm
kiếm những chính sách đối với mật khẩu đăng nhập cũng như các phương thức xác thực vào
Web Site. Với giao diện đồ họa thân thiện, những Report đầy đủ cho phép bạn kiểm tra
những vấn đề trên máy chủ và ứng dụng Web. Để tìm hiểu rỏ hơn các bạn có thể truy cập
vào: http:// www.acunetix.com/vulnerability-scanner/
N-Stealth: Là một phiên bản thương mại, ứng dụng cho việc tìm kiếm các lỗ hổng bảo
mật trên máy chủ Web. Phần mềm tự động update thường xuyên hơn các phần mềm miễn phí
như Whisker/libwhisker hay Nikto, nhưng nhiều lỗi mới trên Web cũng không phát hiện kịp
thời và nhanh chóng. Phần mềm bao gồm hơn 30.000 lỗ hổng có thể Scan và khai thác trực
tiếp, cùng với hàng tá những cập nhật hàng ngày. Dễ dàng triển khai kết hợp với những Scan
lỗ hổng bảo mật như: SQL Injection, Nessus, ISS Internet Scanner, Retina, SAINT và Sara,
bao gồm các tính năng khác. N-sealth là phiên bản chỉ dành riêng cho Windows và không thể
download Source . Trang chủ: />
22


CHƯƠNG 4: KẾT LUẬN
An ninh mạng và những phương pháp tấn công trên Internet đang phát triển rất nhanh
chóng, ngày càng hoạt động phức tạp và quy mô , làm tổn hại và tạo ra một cái nhìn “không
tích cực” cho các ứng dụng mạnh mẽ của Internet , gây tổn thất nghiêm trọng đối với các
ứng dụng và hoạt động Internet.
Đối với SQL Injection, là phương pháp tấn công phổ biến nhất hiện nay, được các
Hackers sử dụng khá nhiều để tấn công các trang website.

Báo cáo đã nêu được các hình thức tấn công phổ biến của SQL Injection. Đưa ra các
vấn đề thực tế và phương pháp phòng chống được hiệu quả. Tuy nhiên, qua thời gian nghiên
cứu đề tài kết hợp với các kiến thức đã học ở nhà trường đã giúp em tìm hiểu các khía cạnh
của vấn đề. Song do thời gian và trình độ có hạn nên chắc chắn bài báo cáo của nhóm em
không tránh khỏi những thiếu sót. Rất mong nhận được sự quan tâm đóng góp ý kiến và chỉ
bảo của thầy. Xin chân thành cảm ơn !

23


TÀI LIỆU THAM KHẢO
[1]

E.H.a.Countermeasures,CEHv8 Module 14 SQL Injection, Copyright © by

ECC0UnCil.
[2]

/>
[3]

"Detecting SQL Injection Attacks - DB Networks," DB Networks, [Online].

[4]

T. WORLD, "Barclays: 97 percent of data breaches still due to SQL injection,"

[Online].
LINK tham khảo:
- />- />- />-sql-injection-3331283/.

- qlinjectionlapkyluctancongcsdl7203fbclid=IwAR3x4ulw0w9q7rq24
U9vNjahM4mZasAnkxigB5indJLBu6UQVwlwXN5Li7U
- />AHCFH9cVRjFQmdUeZoN5hTJVu-mlJEOQvzxfsICFeffg5LdMR8oHag

24



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

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