MỤC LỤC
LỜI CẢM ƠN ...............................................................................................................ii
LỜI CAM ĐOAN ....................................................................................................... iii
DANH MỤC HÌNH VẼ .............................................................................................. iv
CHƢƠNG 1 .................................................................................................................. 1
TỔNG QUAN VỀ ỨNG DỤNG WEB VÀ SQL INJECTION .................................. 1
1.1.
Tổng quan về ứng dụng web .......................................................................... 1
1.2.
Tổng quan về SQL Injection .......................................................................... 6
CHƢƠNG 2 ................................................................................................................ 23
KIỂM TRA CÁC LỖ HỔNG SQL INJECTION ...................................................... 23
2.1.
Giới thiệu ...................................................................................................... 23
2.2.
Tìm kiếm lỗ hổng SQL injection .................................................................. 23
2.3.
Kiểm tra toàn diện ........................................................................................ 37
2.4.
Kiểm tra thủ tục ............................................................................................ 38
2.5.
Đánh giá kết quả ........................................................................................... 39
2.6. Công cụ kiểm tra lỗ hổng website ................................................................... 39
CHƢƠNG 3 ................................................................................................................ 42
MỘT SỐ KỸ THUẬT TẤN CÔNG SQL INJECTION ........................................... 42
3.1
Vƣợt qua kiểm tra lúc đăng nhập ................................................................. 42
3.2
Câu lệnh SELECT ........................................................................................ 43
3.3
Câu lệnh INSERT ......................................................................................... 48
3.4
Stored Procedures ......................................................................................... 49
3.5
Blind SQL Injection ...................................................................................... 50
3.6
Demo tấn công Sql injection ........................................................................ 51
CHƢƠNG 4 ................................................................................................................ 57
MỘT SỐ GIẢI PHÁP PHÒNG CHỐNG SQL INJECTION ................................... 57
4.1 Giải pháp phòng chống SQL injection (nhƣ đã demo tại chƣơng 3 mục 3.6)57
4.2 Phòng chống từ mức xây dựng mã nguồn ứng dụng .................................... 62
4.3 Các biện pháp bảo vệ từ mức nền tảng hệ thống .......................................... 67
4.4 Đề xuất giải pháp công nghệ ......................................................................... 72
i
LỜI CẢM ƠN
Tôi xin chân thành cảm ơn các thầy cơ giáo đã tận tình hƣớng dẫn, giảng dạy trong
suốt quá trình học tập ở trƣờng Đại học Bách khoa Hà Nội.
Xin chân thành cảm ơn thầy giáo hƣớng dẫn TS. Phạm Đăng Hải đã tận tình, chu
đáo hƣớng dẫn tơi thực hiện luận văn này.
Mặc dù đã có nhiều cố gắng để thực hiện luận văn một cách hoàn chỉnh nhất. Song
do kiến thức và kinh nghiệm của tôi cịn hạn chế nên khơng thể tránh khỏi những
thiếu sót nhất định mà bản thân chƣa thấy đƣợc. Tôi rất mong nhận đƣợc sự đóng
góp của q thầy, cơ giáo và và các bạn đồng nghiệp để luận văn đƣợc hồn chỉnh
hơn.
Tơi xin chân thành cảm ơn!
Hà Nội, ngày 20 tháng 11 năm 2016.
Học viên
Vũ Ngọc Tuấn
ii
LỜI CAM ĐOAN
Tôi xin cam đoan số liệu và kết quả nghiên cứu trong luận văn này là trung
thực và chƣa hề đƣợc sử dụng để bảo vệ một học vị nào. Mọi sự giúp đỡ cho việc
thực hiện luận văn này đã đƣợc cảm ơn và các thông tin trích dẫn trong luận văn đã
đƣợc chỉ rõ nguồn gốc rõ ràng và đƣợc phép công bố.
Hà Nội, ngày 20 tháng 11 năm 2016
Học viên
Vũ Ngọc Tuấn
iii
DANH MỤC HÌNH VẼ
Hình 0.1 Thống kê các lỗ hổng nghiêm trọng tấn cơng trên Website ........................vi
Hình 0.2 Danh mục Top 10 lỗ hổng ứng dụng theo xếp hạng OWASP 2013 ...........vi
Hình 1.1 Kiến trúc 3 tầng ............................................................................................. 3
Hình 1.2 Kiến trúc 4 tầng ............................................................................................. 5
Hình 2.2 Luồng thơng tin trong kiến trúc 3 tầng ...................................................... 27
Hình 2.3 Thơng tin về luồng công việc trong một lỗi SQL injection ....................... 28
Hình 3.1 Truy cập thành cơng vào trang Member.aspx……………………………52
Hình 3.2 Trang tìm kiếm thơng tin thành viên Member.aspx ……………………..52
Hình 3.3 Sử dụng các câu lệnh sql để khai thác thông tin trong bảng Member…...53
Hình 3.4 Giao diện cơng cụ Havij………………………………………………….55
Hình 4.1 Sử dụng công cụ Havij tấn công với tỉ lệ thành cơng là 100%................ 61
Hình 4.2 Tấn cơng sau khi áp dụng 4.1.2………………………………………... 62
Hình 4.3 Mơ hình của một hệ thống Tƣờng lửa ứng dụng Web (WAF)………......57
iv
MỞ ĐẦU
Ở nƣớc ta hiện nay, nền công nghệ thông tin đang phát triển và đƣợc ứng
dụng rộng rãi trong hầu hết các lĩnh vực của đời sống xã hội. Một vấn đề đặt ra là
làm thế nào để đáp ứng đƣợc nhu cầu trao đổi thông tin, quảng bá thơng tin trực
tuyến.... từ nhu cầu thực tiễn đó đã dẫn đến sự ra đời của các ứng dụng Web.
Ngày nay, ứng dụng Web đã trở thành phƣơng tiện liên lạc hữu ích cho hàng
triệu tổ chức, cá nhân, doanh nghiệp, đối tác, khách hàng...và dần thay thế các giao
dịch thủ công truyền thống. Chẳng hạn nhƣ, ngày nay chúng ta đã có thể ngồi nhà
mà vẫn có thể thực hiện các dịch vụ nhƣ kiểm tra tài khoản ngân hàng, đặt vé tầu,
vé máy bay, mua sắm trực tuyến…Chính vì vậy Web chính là yếu tố cơ bản giúp
các doanh nghiệp, tổ chức, cá nhân tăng cƣờng hình ảnh trực tuyến của mình trên
thế giới Internet, tạo ra và duy trì nhiều mối quan hệ đem lại lợi nhuận lâu dài với
khách hàng tiềm năng và khách hàng hiện tại và nó cũng là con đƣờng ngắn nhất để
tiếp cận đƣợc với đối tác, khách hàng không chỉ trong nƣớc mà cịn trên tồn thế
giới. Nhƣng song song với sự hữu ích đó, các ứng dụng Web cũng đã tạo ra những
thách thức lớn đối với nhà phát triển, nhà quản trị Web...đó chính là vấn đề làm thế
nào để đảm bảo đƣợc an tồn thơng tin khi sử dụng các ứng dụng Web. Bởi vì hầu
hết các ứng dụng này đều chứa những lỗ hổng bảo mật tiềm ẩn mà kẻ tấn cơng có
thể khai thác và thực hiện các hành vi gây nguy hại đến các ứng dụng Web.
LÝ DO THỰC HIỆN ĐỀ TÀI
Cùng với sự phát triển mạnh mẽ ứng dụng công nghệ thông tin, các cuộc tấn
công, xâm nhập trái phép vào hệ thống mạng vào hệ thống mạng của các cơ quan
nhà nƣớc, các tổ chức, doanh nghiệp và cá nhân để phá hoại hoặc thu thập lấy cắp
thông tin ngày càng gia tăng. Theo Trung tâm ứng cứu khẩn cấp máy tính Việt Nam
(VNCERT), từ tháng 12-2014 đến tháng 12-2015, đã có 31.585 sự cố an ninh thông
tin tại Việt Nam, gồm 5.898 sự cố lừa đảo, 8.850 sự cố tấn công thay đổi giao diện
và 16.837 sự cố cài mã độc. Mới đây nhất ngày 29/7/2016, Hacker đã tấn công vào
hệ thống công nghệ thông tin của Vietnam Airlines tại sân bay quốc tế Nội Bài và
Tân Sơn Nhất, chiếm quyền kiểm sốt trang mạng chính thức của Vietnam Airlines
v
và chuyển sang trang mạng xấu ở nƣớc ngoài. Dữ liệu của trên 400.000 hội viên
khách hàng thƣờng xuyên của Vietnam Airlines đã bị công bố.
Theo các báo cáo về an ninh mạng của Whitehat Security 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. Năm 2015, Whitehat Security đã thống kê về các lỗ hổng
nghiêm trọng tấn công trên Website, kết quả nhƣ sau:
Hình 0.1 - Thống kê các lỗ hổng nghiêm trọng tấn công trên Website [11]
vi
Hình 0.2 – Danh mục Top 10 lỗ hổng ứng dụng theo xếp hạng OWASP 2013
[10].
A1 – Injection: Tiêm nhiễm mã độc
A2 – Broken Authentication and Session Management: Sai lầm trong kiểm
tra định danh và phiên làm việc
A3 – Cross-Site scripting(XSS): Thực thi mã Script xấu
A4 – Insecure Direct Object Reference: Đối tƣợng tham chiếu thiếu an toàn
A5 – Security Misconfiguration : Sai sót cấu hình an ninh
A6 – Sensitive Data Exposure: Lộ dữ liệu nhạy cảm
A7 – Missing Function Level Access Control : Mất kiểm soát mức độ truy
cập chức năng
A8 – Cross Site Request Forgery (CSRF): Giả mạo yêu cầu
A9 – Using Known Vulnerable Components: Tấn công sử dụng các thành
phần với các lỗ hổng đã biết
A10 –Unvalidated Redirects and Forwards: Chuyển hƣớng và chuyển tiếp
khơng an tồn
Nhƣ vậy vấn đề bảo mật Web đang là mối quan tâm hàng đầu khơng những
của các doanh nghiệp mà cịn là mối quan tâm của hầu hết các quốc gia trên thế giới
vì các kỹ thuật tấn cơng vào ứng dụng Web ngày càng trở nên tinh vi, phức tạp. Nó
khơng những ảnh hƣởng đến nền kinh tế quốc gia mà cịn ảnh hƣởng đến tình hình
an ninh chính trị giữa các nƣớc trong khu vực và trên chiến trƣờng quốc tế. Trong
biểu đồ thống kê trên ta thấy SQL Injection cũng đƣợc coi là một lỗ hổng phổ biến
và nghiêm trọng trong an ninh ứng dụng Web và đây cũng vẫn đang là vấn đề nhận
đƣợc rất nhiều quan tâm của các nhà nghiên cứu, các nhà phát triển ứng dụng Web,
các tổ chức doanh nghiệp, cơ quan hành chính...
Bên cạnh những khó khăn do cơ sở hạ tầng mạng cịn yếu kém, sự phát triển
khơng ngừng của các công cụ và phƣơng pháp tấn công khiến cho việc phịng,
chống các hình thức tấn cơng ứng dụng Web trở thành một vấn đề rất nan giải. Một
thực tại hiện này là hầu hết các lập trình viên vẫn chƣa nhận thức đƣợc vấn đề lập
trình ứng dụng Web an tồn, ngồi ra rất nhiều giải pháp đã đƣợc cơng bố và áp
vii
dụng nhƣng vẫn chƣa đủ tốt. Đây cũng chính là lý do mà tác giả chọn đề tài “SQL
Injection – tấn cơng và cách phịng tránh” để nghiên cứu.
MỤC ĐÍCH CỦA ĐỀ TÀI
Luận văn này nhằm mục đích phân loại các kỹ thuật mà kẻ tấn công thƣờng
sử dụng để tấn công SQL Injection lên các ứng dụng Web, từ đó nhà phát triển ứng
dụng có thể dự đốn trƣớc các nguy cơ tấn công để kịp thời đƣa ra các biện pháp
ngăn chặn những hành động gây mất an tồn thơng tin từ bên trong cũng nhƣ bên
ngồi ứng dụng Web đối với từng loại SQL Injection…Đồng thời luận văn cũng
đƣa ra các phƣơng pháp mà nhà phát triển ứng dụng thƣờng sử dụng để phát hiện
các loại lỗ hổng SQL Injection, đƣa ra những cảnh báo và giúp cho những ngƣời
mới lập trình có cái nhìn tổng quan và nhận thức đƣợc tầm quan trọng của việc đảm
bảo an tồn thơng tin cho ứng dụng Web trong xây dựng, phát triển và vận hành
ứng dụng Web. Trên cơ sở đó luận văn cũng nghiên cứu và đề xuất các công cụ cho
việc phát hiện và cảnh báo lỗ hổng SQL Injection
CẤU TRÚC LUẬN VĂN
Nội dung chính của luận văn gồm có 4 chƣơng sau:
CHƢƠNG I: TỔNG QUAN VỀ ỨNG DỤNG WEB VÀ SQL INJECTION
CHƢƠNG II: KIỂM TRA CÁC LỖ HỔNG SQL INJECTION
CHƢƠNG III: CÁC KỸ THUẬT TẤN CÔNG SQL INJECTION
CHƢƠNG IV: MỘT SỐ GIẢI PHÁP PHÒNG CHỐNG SQL INJECTION
viii
CHƢƠNG 1
TỔNG QUAN VỀ ỨNG DỤNG WEB VÀ SQL INJECTION
1.1. Tổng quan về ứng dụng web
Ngày nay ứng dụng Web đã trở thành thứ khơng thể thiếu, nó hiện hữu trong
tất cả mọi thứ của cuộc sống hằng ngày nhƣ một phần không thể thiếu, từ công việc,
mua sắm, giải trí, tin tức…. Một điều mà các ứng dụng web có điểm chung là bất kể
ngơn ngữ mà nó đƣợc viết thì ngƣời dùng tƣơng tác là theo hƣớng cơ sở dữ liệu và
hầu hết các ứng dụng web phổ biến hiện nay đều thiết kế và tƣơng tác theo hƣớng
cơ sở dữ liệu.
Và để một website hoạt động và tƣơng tác với ngƣời sử dụng website đó thì
đằng sau đó là một cơ sở dữ liệu nơi đáp ứng và cung cấp các thông tin cụ thể và
cần thiết từ phía yêu cầu của ngƣời dùng, và yêu cầu này đƣợc thực thi từ phía máy
chủ phụ thuộc vào sự tƣơng tác và yêu cầu khác nhau của ngƣời sử dụng. Một trong
những ứng dụng phổ biến nhất đối với một ứng dụng web hƣớng cơ sở dữ liệu là
một ứng dụng về thƣơng mại điện tử, nơi mà hàng loạt các thông tin đƣợc lƣu trữ
trong một cơ sở dữ liệu, chẳng hạn nhƣ thông tin về sản phẩm, chứng khốn, giá cả,
giao dịch… Có lẽ hầu hết chúng ta đều đã quen thuộc với những ứng dụng này khi
mua hàng hóa và các sản phẩm trực tuyến từ các công ty bán lẻ trực tuyến trên
internet.
Một ứng dụng web hƣớng cơ sở dữ liệu thơng thƣờng có ba tầng: Tầng trình
diễn (trình duyệt web hay các chƣơng trình máy tính), tầng logic (một ngơn ngữ lập
trình nhƣ C#, PHP, JSP, ASP.NET …) và tầng dữ liệu (một cơ sở dữ liệu nhƣ SQL
Server, MySQL, Oracle, …). Các trình duyệt web (trong tầng trình diễn, chẳng hạn
nhƣ Internet Explorer, Safari, Firefox, Chrome, …) gửi yêu cầu đến tầng giữa (tầng
logic) mà các dịch vụ yêu cầu bằng cách truy vấn và những cập nhật ngƣợc lại cơ sở
dữ liệu.
1
Lấy ví dụ, một cửa hàng bán lẻ trực tuyến mà giới thiệu một cách thức tìm
kiếm cho phép chọn lọc và sắp xếp thông qua các sản phẩm đƣợc quan tâm đặc biệt,
và cung cấp một tùy chọn để tiếp tục tinh chỉnh các sản phẩm đƣợc hiện thị cho phù
hợp với túi tiền của khách hàng. Để xem tất cả các sản phẩm có giá thấp hơn 100
USD, ví dụ nhƣ đƣờng link sau đây:
/>Các kịch bản PHP sau đây minh họa cách mà ngƣời dùng truyền biến đầu
vào (val) thông qua một câu lệnh SQL đƣợc tạo ra linh hoạt. Phần tiếp theo của mã
PHP sẽ đƣợc thực thi khi đƣờng link đƣợc yêu cầu.
// Kết nối cơ sở dữ liệu
$conn = mysql_connect("localhost","username","password");
// dynamically build the sql statement with the input
$query = "SELECT * FROM Products WHERE Price < '$_GET["val"]'"
.
"ORDER BY ProductDescription";
// execute the query against the database
$result = mysql_query($query);
// Lặp qua các bản ghi
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
// Hiển thị kết quả trên trình duyệt
echo "Description : {$row['ProductDescription']}
" .
"Product ID : {$row['ProductID']}
" .
"Price : {$row['Price']}
";
}
Nguồn: SQL Injection Attack and Defense, Justin Clarke [1].
Các đoạn mã sau sẽ minh họa rõ ràng hơn câu lệnh SQL mà kịch bản PHP
tạo ra và thực thi. Câu lệnh sẽ trả lại tất cả các sản phẩm có trong cơ sở dữ liệu mà
có giá thấp hơn 100 USD. Những sản phẩm này sau đó sẽ đƣợc hiển thị và trình bày
trên trình duyệt web để khách hàng có thể lựa chọn và quyết định mua sắm dựa vào
2
ngân
sách
của
họ.
Một kiến trúc ứng dụng đơn giản
Nhƣ đã trình bày phía trên thì một ứng dụng web thơng thƣờng kiến trúc có
ba tầng: Tầng trình diễn, logic và dữ liệu.
Hình 1.1 - Kiến trúc 3 tầng [1]
Tầng trình diễn: Là cấp trên cùng của ứng dụng, là lớp tiếp xúc trực tiếp với
ngƣời sử dụng ứng dụng, nó hiển thị thông tin dữ liệu liên quan đến các dịch vụ mà
ứng dụng cung cấp ví dụ nhƣ hàng hóa đã duyệt, hàng hóa đã mua và thơng tin giỏ
hàng, và nó truyền thơng với các tầng khác bằng việc xuất ra các kết quả cho trình
duyệt khách hàng và tất cả các tầng khác trong mạng.
Tầng logic: Là tầng trung gian giữa tầng trình diễn và tầng dữ liệu và có
nhiệm vụ là điều khiển các chức năng của một ứng dụng bằng cách thực hiện xử lý
chi tiết.
Tầng dữ liệu: Là tầng chứa các máy chủ cơ sở dữ liệu. ở đây, thông tin đƣợc
lƣu trữ và lấy ra. Tầng này giữ cho dữ liệu độc lập với các máy chủ ứng dụng hoặc
tầng logic. Làm cho dữ liệu của chính tầng này đƣợc cải thiện khả năng mở rộng và
tăng hiệu suất. Trong hình 1.1, trình duyệt web gửi các yêu cầu đến tầng logic, nơi
3
các dịch vụ của chúng sẽ đƣợc truy vấn và cập nhật ngƣợc trở lại cơ sở dữ liệu. Một
nguyên tắc cơ bản trong kiến trúc ba tầng là tầng trình diễn khơng bao giờ liên lạc
trực tiếp với tầng dữ liệu, trong mơ hình này tất cả các giao tiếp phải đi qua tầng
trung gian (logic).
Trong hình 1.1 thì ngƣời dùng sử dụng trình duyệt web để kết nối với trang
. Các máy chủ web nằm trong tầng logic tải những kịch bản
từ hệ thống tệp tin và chuyển qua engine để phân tích cú pháp và thực thi. Kịch bản
sẽ mở ra một kết nối tới tầng dữ liệu bằng cách sử dụng một kết nối cơ sở dữ liệu và
thực thi một câu lệnh SQL ngƣợc trở lại cơ sở dữ liệu. Cơ sở dữ liệu trả về dữ liệu
cho các kết nối cơ sở dữ liệu, thơng qua các engine trong tầng logic. Sau đó tầng
logic thực hiện ứng dụng bất kỳ hoặc các quy tắc logic trƣớc khi trả lại một trang
web ở dạng HTML trên trình duyệt web của ngƣời dùng ở tầng trình diễn. Trình
duyệt web của ngƣời dùng sẽ trả lại trang HTML và hiện thị cho ngƣời dùng dƣới
dạng một giao diện đồ họa của mã này. Tất cả điều này xảy ra trong vài giây và nó
trong suốt đối với ngƣời dùng.
Một kiến trúc phức tạp hơn
Các giải pháp ba tầng khơng thể mở rộng, vì vậy trong những năm gần đây,
mơ hình kiến trúc ba tầng đã đƣợc đánh giá lại và một khái niệm mới đƣợc xây
dựng trên khả năng có thể mở rộng và bảo trì đã đƣợc tạo ra, đó là mơ hình phát
triển ứng dụng n tầng. Trong giải pháp mơ hình 4 tầng đƣợc đƣa ra có liên quan đến
việc sử dụng một phần trung gian, thƣờng đƣợc gọi là một máy chủ ứng dụng giữa
các máy chủ web và máy chủ cơ sở dữ liệu. Một máy chủ ứng dụng trong một kiến
trúc n tầng là một máy chủ lƣu trữ một giao diện lập trình ứng dụng (API - viết tắt
của Application Programming Interface) để xuất ra các logic nghiệp vụ và các xử lý
nghiệp vụ để sử dụng những ứng dụng. Các máy chủ web bổ sung có thể đƣợc đƣa
ra nhƣ là một yêu cầu cần thiết. Ngoài ra, các máy chủ ứng dụng có thể truyền
thơng đƣợc với nhiều nguồn dữ liệu, bao gồm cả cơ sở dữ liệu, các máy tính lớn,
hoặc các hệ thống kế thừa khác.
4
Hình 1.2 - Kiến trúc 4 tầng [1]
Trong hình 1.2, trình duyệt web (tầng trình diễn) gửi yêu cầu đến tầng logic,
nó sẽ gọi các API tiếp xúc của với các máy chủ ứng dụng nằm trong tầng ứng dụng,
các dịch vụ của chúng làm cho các truy vấn và các cập nhật ngƣợc trở lại cơ sở dữ
liệu. Trong hình 1.2, ngƣời dùng sử dụng trình duyệt web của mình để kết nối đến
. Các máy chủ web nằm trong tầng logic thì tải các kịch bản
từ hệ thống tập tin và chuyển qua engine xử lý các kịch bản của nó để phân tích cú
pháp và thực thi. Kịch bản của một cuộc gọi tiếp xúc API từ máy chủ ứng dụng nằm
trong tầng ứng dụng. Các máy chủ ứng dụng mở một kết nối đến tầng dữ liệu bằng
cách sử dụng một kết nối cơ sở dữ liệu và thực thi một câu lệnh SQL ngƣợc trở lại
cơ sở dữ liệu. Cơ sở dữ liệu sẽ trả về dữ liệu cho các kết nối cơ sở dữ liệu và máy
chủ ứng dụng sau đó thực hiện bất kỳ một ứng dụng hay các quy tắc logic nghiệp vụ
trƣớc khi trả dữ liệu về cho máy chủ web. Sau đó các máy chủ web sẽ thực hiện bất
kỳ một quy tắc logic cuối cùng nào đó trƣớc khi trình diễn dữ liệu dƣới dạng HTML
đến trình duyệt web của ngƣời dùng trong tầng trình diễn. Các trình duyệt web của
ngƣời dùng sẽ trả lại trang HTML và hiển thị cho các ngƣời dùng dƣới dạng một
giao diện đồ họa. Tất cả các quá trình này chỉ diễn ra trong vài giây và đƣợc làm
trong suốt với ngƣời dùng.
Các khái niệm cơ bản của một kiến trúc phân tầng liên quan đến việc phá vỡ
một ứng dụng thành các khối logic, hoặc các lớp, mỗi lớp trong số đó đƣợc phân
5
cơng vai trị chung hay cụ thể. Các tầng có thể đƣợc đặt trên các máy tính khác nhau
hoặc trên cùng một máy hoặc tách biệt nhau. Nếu sử dụng nhiều tầng thì mỗi tầng
sẽ đƣợc cụ thể hóa vai trò. Sự tách biệt trách nhiệm của một ứng dụng vào nhiều
tầng làm cho nó dễ dàng hơn trong việc sắp xếp các ứng dụng cho phép phân tách
tốt hơn các công việc phát triển giữa các nhà giữa các nhà phát triển và làm cho một
ứng dụng dễ đọc hơn và các thành phần của nó dễ tái sử dụng hơn. Cách tiếp cận
cũng có thể làm cho các ứng dụng chạy tốt hơn bằng cách loại bỏ một điểm duy
nhất bị lỗi. Ví dụ, một quyết định thay đổi các nhà cung cấp cơ sở dữ liệu thì nên
yêu cầu gì hơn là một số thay đổi để các phần có thể ứng dụng của tầng ứng dụng;
tầng tình diễn và tầng logic cịn lại khơng thay đổi. Các kiến trúc ba tầng và bốn
tầng hầu là các kiến trúc phổ biến nhất đƣợc triển khai trên mạng internet ngày nay.
Tuy nhiên, mơ hình n tầng thì cực kỳ linh hoạt và nhƣ đã thảo luận trƣớc đó thì khái
niệm đó cho phép nhiều tầng và các lớp đƣợc tách biệt hợp lý và triển khai trong vô
số cách.
1.2. Tổng quan về SQL Injection
Ngày nay, các ứng dụng web đang ngày càng trở lên tinh vi và kỹ thuật càng
phức tạp. Chúng rất linh hoạt từ internet đến các cổng thông tin nội bộ, chẳng hạn
nhƣ các trang web thƣơng mại điện tử… để HTTP giải phóng các ứng dụng doanh
nghiệp nhƣ các hệ thống quản lý tài liệu và những ứng dụng ERP. Tính sẵn có của
các hệ thống này và sự nhạy cảm của dữ liệu mà họ đang lƣu trữ và xử lý đang trở
nên quan trọng đối với hầu hết các doanh nghiệp lớn, không chỉ những ứng dụng
bán hàng trực tuyến. Các ứng dụng web và sự hỗ trợ hạ tầng của chúng và mơi
trƣờng sử dụng cơng nghệ đa dạng và có thể chứa một lƣợng lớn các sửa đổi và các
mã tùy chỉnh. Bản chất của các thiết kế rất giàu tính năng và khả năng của chúng để
đối chiếu, xử lý và phổ biến thông tin trên internet hoặc bên trong của một mạng nội
bộ làm cho chúng trở thành cái đích phổ biến của các cuộc tấn cơng. Ngồi ra, kể từ
khi thì trƣờng cơng nghệ bảo mật mạng đã trƣởng thành và có ít cơ hội để xâm
phạm vào hệ thống thơng tin qua lỗ hổng mạng đó, những tin tặc thì ngày càng gia
tăng sự tập trung vào cái đích đó để cố gắng khai thác các ứng dụng.
6
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 trung vào các vấn đề nhƣ chọn hệ điều hành, hệ quản trị cơ
sở dữ liệu, webserver sẽ chạy ứng dụng, ... mà quên mất rằng ngay cả bản thân ứ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ột trong số các lỗ
hổng này đó là SQL injection. 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ì?
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
trong việc kiểm tra dữ liệu nhập 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 để "chèn vào" (inject) và thi hành các câu lệnh SQL bất
hợp pháp (không đƣợc ngƣời phát triển ứng dụng lƣờng trƣớc). Hậu quả của nó rất
tai hại vì nó cho phép những 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, thậm chí là server mà
ứng dụng đó đang chạy. 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ị cơ sở dữ liệu nhƣ SQL Server, MySQL, Oracle,
DB2, Sysbase.
Để mình họa điều này, chúng ta hãy trở lại ví dụ trƣớc của một cửa hàng bán
lẻ trực tuyến đơn giản để xem tất cả các sản phẩm trong các cửa hàng mà giá thấp
hơn 100 USD, bằng cách sử dụng đƣờng link:
/>Tuy nhiên lúc này ta thử chèn vào 1 câu lệnh SQL bằng cách nối thêm chúng
vào sau tham số đầu vào val bằng cách thêm chuỗi „ OR „1‟=‟1 vào đƣờng link:
OR „1‟=‟1
Lúc này, các câu lệnh SQL mà kịch bản PHP tạo ra và thực thi sẽ trả lại tất
cả các sản phẩm có trong cơ sở dữ liệu bất kể giá của nó là bao nhiêu bởi vì tính
7
hợp lý của truy vấn đã bị thay đổi. Điều này xảy ra vì câu lệnh thêm vào ln trả về
kết quả trong tốn hạng OR của truy vấn ln trả về giá trị true, đó là 1 ln bằng 1.
Đây là câu truy vấn luôn đúng đƣợc tạo ra và thực thi.
SELECT * FROM ProductsTbl WHERE Price < '100.00' OR '1'='1'
ORDER BY ProductDescription;
Có nhiều cách để khai thác các lỗ hổng SQL injection để đạt đƣợc rất nhiều
mục tiêu, sự thành công của một cuộc tấn công thƣờng phụ thuộc nhiều vào cơ sở
dữ liệu cơ bản và hệ thống kết nối với nhau đang bị tấn công. Đôi khi nó có thể cần
nhiều kỹ năng và sự kiên nhẫn để khai thác một lỗ hổng bằng khả năng của mình.
Các ví dụ đơn giản thể hiện cách mà một kẻ tấn cơng có thể thao tác một câu
lệnh SQL đƣợc tạo ra một cách linh hoạt mà đƣợc hình thành từ đầu vào khơng hợp
lệ hoặc chƣa đƣợc mã hóa để thực hiện một hành động mà ngƣời phát triển của một
ứng dụng đó đã khơng lƣờng trƣớc hoặc khơng dự định trƣớc. Tuy nhiên có lẽ
khơng cần minh họa cho tính hiệu quả của một lỗ hổng dễ bị tổn thƣơng mà chúng
ta chỉ sử dụng các vector để xem tất cả các sản phẩm trong cơ sở dữ liệu, và chúng
ta có thể hợp pháp hóa làm điều đó bằng cách sử dụng các chức năng của ứng dụng
nhƣ nó đã đƣợc dự định sử dụng tại thời điểm đầu tiên. Nếu cùng một ứng dụng có
thể đƣợc điều khiển từ xa sử dụng một hệ quản trị nội dung (CMS)? Một hệ quản trị
nội dung là một ứng dụng web đƣợc dùng để dễ dàng trong việc khởi tạo, chỉnh sửa,
quản lý, và xuất bản nội dung lên một trang web, mà không cần phải có một sự hiểu
biết sâu sắc hoặc khả năng viết mã HTML. Ví dụ ta có thể sử dụng đƣờng link sau
đây để truy cập các ứng dụng hệ quản trị nội dung:
/>Các ứng dụng của hệ quản trị nội dung yêu cầu ta phải cung cấp một tên
ngƣời dùng và mật khẩu hợp lệ trƣớc khi có thể truy cập để sử dụng cách chức năng
của nó. Truy cập vào đƣờng link trƣớc sẽ cho kết quả sai “Incorrect username or
password, please try again”. Và sau đây là đoạn mã cho kịch bản login.php:
8
// connect to the database
$conn = mysql_connect("localhost","username","password");
// dynamically build the sql statement with the input
$query
=
"SELECT
userid
FROM
CMSUsers
WHERE
user
=
'$_GET["user"]' " .
"AND password = '$_GET["password"]'";
// execute the query against the database
$result = mysql_query($query);
// check to see how many rows were returned from the database
$rowcount = mysql_num_rows($result);
// if a row is returned then the credentials must be valid, so
// forward the user to the admin pages
if ($rowcount != 0){ header("Location: admin.php");}
// if a row is not returned then the credentials must be
invalid
else
{
die('Incorrect
username
or
password,
please
try
again.')}
Code nguồn: SQL Injection Attack and Defense, Justin Clarke [1].
Các kịch bản login.php tự động tạo ra một câu lệnh SQL sẽ trả về một bản ghi
nếu một tên ngƣời dùng và mật khẩu tƣơng ứng đƣợc nhập vào. Các câu lệnh SQL
mà kịch bản PHP tạo ra và thực thi sẽ đƣợc minh họa rõ ràng hơn trong các đoạn
mã sau đây. Các truy vấn sẽ trả lại userid tƣơng ứng cho ngƣời sử dụng nếu tên
ngƣời dùng và mật khẩu tƣơng ứng nhập vào giống với giá trị lƣu trữ tƣơng ứng
trong bảng CMSUsers.
SELECT userid FROM CMSUsers WHERE user = 'foo' AND password =
'bar';
Vấn đề là với đoạn mã này thì các nhà phát triển ứng dụng luôn tin tƣởng rằng
khi kịch bản đƣợc thực thi thì số bản ghi đƣợc trả lại sẽ ln là khơng hoặc một.
Trong các ví dụ chèn vào trƣớc, chúng ta sử dụng các vector có thể khai thác đƣợc
để thay ý nghĩa của câu truy vấn SQL để nó ln trả về giá trị true. Nếu chúng ta sử
dụng một kỹ thuật tƣơng tự với các ứng dụng hệ quản trị nội dung thì chúng ta có
9
thể làm cho tính hợp lý của ứng dụng bị thay đổi bằng cách thêm chuỗi „OR „1‟=‟1
vào sau đƣờng link, câu lệnh SQL khi đó sẽ đƣợc kịch bản PHP tạo ra và thực thi,
lúc này ứng dụng sẽ trả về tất cả các userid của tất cả ngƣời dùng trong bảng
CMSUsers. Ví dụ đƣờng link nhƣ sau:
/>OR „1‟=‟1
Tất cả các userid đƣợc trả về vì chúng ta đã làm thay đổi tính hợp lệ của câu
truy vấn. Điều này xảy ra vì câu lệnh nối sau đƣờng link ln trả về kết quả của
tốn hạng OR là đúng, 1 luôn bằng 1. Dƣới đây là các truy vấn đã đƣợc tạo ra và
thực thi:
SELECT userid FROM CMSUsers
WHERE user = 'foo' AND password = 'password' OR '1'='1';
Tính hợp lý của ứng dụng có nghĩa là nếu cơ sở dữ liệu trả về nhiều hơn bản ghi
khơng, ta phải có thông tin xác nhận đã nhập đúng và nên đƣợc chuyển hƣớng và
đƣợc truy cập vào cách kịch bản đƣợc bảo vệ nhƣ admin.php. Ta sẽ thƣờng xuyên
đăng nhập nhƣ là một ngƣời dùng đầu tiên trong bản CMSUsers. Một lỗ hổng SQL
injection đã cho phép hợp thực hóa ứng dụng để đƣợc thao tác và phá vỡ.
Một số thống kê chi tiết
Thật khó để thu thập dữ liệu chính xác và đúng đắn về vấn đề có bao nhiêu tổ
chức tồn tại lỗ hổng bảo mật hay bị xâm phạm thông qua các lỗ hổng SQL
injection, nhƣ các công ty trong nhiều quốc gia, không giống nhƣ các đối tác của họ
ở Mỹ, không bắt buộc phải công bố công khai khi họ đã bị xâm phạm nghiêm trọng
về an ninh. Tuy nhiên, những lỗ hổng bảo mật và những cuộc tấn công thành công
đƣợc thực hiện bởi những kẻ tấn công hiện đang là một chủ đề yêu thích của báo chí
trên thế giới. Những lỗ hổng nhỏ nhất trong lịch sử đã không đƣợc chú ý bởi một
cộng đồng mạng rộng lớn và thƣờng có rất nhiều công bố ngày nay.
10
Một số cơng khai nguồn lực sản có thể giúp chúng ta hiểu thế nào là một vấn đề
lớn về SQL injection. Ví dụ, trang web Common Vulnerabilities and Exposures
(CVE) cung cấp một danh sách thông tin các lỗ hổng bảo mật và tiếp xúc nhằm mục
đích cung cấp những tên thông thƣờng cho những vấn đề công khai đƣợc biết đến.
Mục tiêu của CVE là làm cho nó dễ dàng hơn để chia sẻ dữ liệu qua những khả
năng của lỗ hổng riêng biệt (nhƣ các công cụ, các kho chứa và các dịch vụ). Các
trang web thu thập thơng tin trên các lỗ hổng mà nó đƣợc biết một cách cơng khai
và cung cấp các phân tích thống kê về xu hƣớng bảo mật. Trong báo cáo năm 2007
của mình, CVE đã liệt kê một danh sách 1754 lỗ hổng SQL injection trong cơ sở dữ
liệu của hộ và trong số đó có 944 lỗ hổng đã đƣợc thêm vào trong năm 2006. SQL
injection chiếm 13,6 % của tất cả các lỗ hổng mà CVE báo cáo trong năm 2006, chỉ
đứng sau lỗ hổng cross-site-scripting và đứng trƣớc lỗ hổng tràn bộ đệm (buffer
overflow).
Ngoài ra, Dự án bảo mật ứng dụng web mở đã liệt kê các lỗi injection (trong đó
bao gồm cả SQL injection) nhƣ là một lỗ hổng bảo mật thứ hai phổ biến nhất có ảnh
hƣởng đến các ứng dụng web trong danh sách top 10 của năm 2007. Mục đích chính
của dự án này là giáo dục nhận thức cho các nhà phát triển ứng dụng, các nhà thiết
kế, các kiến trúc sƣ và các tổ chức về hậu quả của các lỗ hổng bảo mật ứng dụng
web phổ biến nhất. Danh sách top 10 năm 2007 đƣợc biên soạn từ những dữ liệu đã
đƣợc trích xuất từ các dữ liệu của CVE. Vấn đề là việc sử dụng những con số của
CVE nhƣ là một dấu hiệu của nhiều trang web bị lỗi SQL injection mà dữ liệu của
nó khơng cung cấp cái nhìn sâu sắc về các lỗ hổng trong các trang web đƣợc tạo ra
theo đơn đặt hàng riêng biệt. Những yêu cầu của CVE tiêu biểu cho số lƣợng các lỗ
hổng đƣợc phát hiện trong các ứng dụng thƣơng mại các ứng dụng mã nguồn mở;
chúng không phản ánh đƣợc mức độ nghiêm trọng mà các lỗ hổng đang tồn tại
trong thế giới thực. Trong thực tế, tình trạng đó xảy ra rất nhiều và ngày càng tồi tệ
hơn.
Chúng ta có thể tìm đến các nguồn tài ngun khác để đối chiếu thông tin trên
các trang web bị xâm nhập. Zone-H, chẳng hạn, đó là một trang web phổ biến các
11
hồ sơ về các trang web bị sửa đổi. Trang web này cho thấy một số lƣợng lớn về
thông tin các trang web và các ứng dụng web đã bị đột nhập trong nhiều năm bởi sự
hiện diện của các lỗ hổng SQL injection bị khai thác. Các trang web thuộc tên miền
của Microsoft đã bị sửa đổi hơn 46 lần hoặc hơn nữa nhƣ năm 2001.
Trong lịch sử, những kẻ tấn cơng sẽ tìm cách thỏa hiệp với những trang web
hay những ứng dụng web để ghi điểm với các nhóm tin tặc khác, để truyền bá quan
điểm chính trị và những thông điệp cụ thể của họ, để thể hiện mình hoặc đơn giản
chỉ là để trả đũa về một sự xấu hổ hoặc bất công trong nhận thức hành vi. Ngày nay,
tuy nhiên kẻ tấn công rất có thể sẽ khai thác một ứng dụng web để đạt mục đích về
tài chính và tạo ra lợi nhuận. Một loạt các nhóm khả năng củ kẻ tấn cơng trên mạng
internet ngày nay là tất cả đều có những động cơ khác nhau. Chúng bao gồm từ các
cá nhân từ chỗ tìm kiếm đến thỏa hiệp với hệ thống điều khiển bởi một niềm đam
mê công nghệ và một tinh thần “hacker”, những tổ chức quy tụ những tên tội phạm
mạng vẫn đang tìm kiếm những mục tiêu tiềm tàng cho sự phát triển tài chính và
các hoạt động chính trị thúc đẩy bởi những sự tin tƣởng của cá nhân hoặc các nhóm,
cho những nhân viên bất mãn và những ngƣời quản trị hệ thống lợi dụng quyền ƣu
tiên của họ và những cơ hội cho hàng loạt các mục tiêu của họ. Một lỗ hổng SQL
injection trong một trang web hay trong một ứng dụng web thì đó thƣờng chính là
tất cả những thứ mà một kẻ tấn cơng cần để hồn thành mục tiêu của hắn ta.
Bắt đầu từ đầu năm 2008, hàng trăm ngàn trang web đã bị đột nhập bởi các
phƣơng tiện tấn công SQL injection tự động. Một công cụ đã đƣợc sử dụng để tìm
kiếm các ứng dụng trên internet bị dính lỗi SQL injection, và khi một lỗ hổng đƣợc
tìm thấy thì cơng cụ đó sẽ tự động khai thác chúng. Khi tải trọng khai thác đƣợc
chuyển giao thì nó sẽ thực hiện lặp đi lặp lại các vòng lặp SQL mà mỗi bảng tạo ra
ngƣời dùng trong khi truy cập cơ sở dữ liệu từ xa và sau đó nối các cột trong bảng
với một kịch bản độc hại phía máy khách. Hầu hết các ứng dụng web hƣớng cơ sở
dữ liệu thì đều sử dụng dữ liệu trong cơ sở dữ liệu để tạo ra nội dung cho trang web,
cuối cùng kịch bản đó sẽ đƣợc trình bày cho ngƣời dùng về những trang web hoặc
những ứng dụng bị lỗi. Các nhãn này sẽ hƣớng dẫn bất kỳ một trình duyệt tải một
12
trang web bị lây nhiễm để thực thi một đoạn mã độc mà đƣợc đặt trên một máy chủ
từ xa. Mục đích của việc này là nhằm lây nhiễm mã độc đến nhiều máy chủ khác có
thể. Đó là một cuộc tấn công hiệu quả. Đáng chú ý là các trang web quan trọng nhƣ
các cơ quan của Chính phủ, Liên Hợp Quốc, và các tập đoàn lớn đã bị đột nhập và
lây nhiễm bởi đa số cuộc tấn công này. Rất khó để xác định chính xác có bao nhiêu
máy tính khách và những khách viếng thăm các trang web này đã lần lƣợt bị nhiễm
mã độc hoặc bị tổn hại, nhất là khi tải trọng đƣợc chuyển giao đã đƣợc tùy chỉnh
bởi những kẻ phát động cuộc tấn cơng.
Tìm hiểu các lỗ hổng Sql injection
SQL là ngơn ngữ chuẩn để truy cập vào các máy chủ cơ sở dữ liệu nhƣ
Microsoft SQL Server, Oracle, MySQL, Sybase và Informix, … Hầu hết các ứng
dụng web thì cần tƣơng tác với một cơ sở dữ liệu, và hầu hết các ngơn ngữ lập trình
nhƣ ASP, C#, Java, PHP, … cung cấp các cách thức lập trình kết nối đến cơ sở dữ
liệu và tƣơng tác với nó. Các lỗ hổng SQL injection thƣờng xảy ra khi các nhà phát
triển ứng dụng web không đảm bảo chắc chắn rằng các giá trị nhận đƣợc từ một
form, cookie, tham số đầu vào, … đƣợc xác nhận trƣớc khi chúng đƣợc chạy với
các truy vấn SQL mà sẽ đƣợc thực thi trên một máy chủ cơ sở dữ liệu. Nếu một kẻ
tấn công có thể kiểm sốt đầu vào và gửi đến một truy vấn SQL và thao tác với dữ
liệu nhập vào mà dữ liệu đƣợc hiểu là mã thay vì đƣợc hiểu là dữ liệu, một kẻ tấn
cơng có thể thực thi mã đó trên cơ sở dữ liệu phía sau.
Mỗi ngơn ngữ lập trình thì cung cấp một số cách khác nhau để tạo ra và thực thi
những câu lệnh SQL, và những nhà phát triển thƣờng sử dụng sự kết hợp của những
phƣơng thức này để đặt đƣợc những mục tiêu khác nhau. Có rất nhiều trang web
cung cấp các hƣớng dẫn và các đoạn mã ví dụ để giúp các nhà phát triển ứng dụng
giải quyết các vấn đề mã hóa thơng thƣờng đƣợc dạy những bài thực hành mã hóa
khơng an tồn và những đoạn mã ví dụ của họ thì thƣờng có lỗ hổng. Nếu khơng có
một sự hiểu biết đúng đắn về cơ sở dữ liệu cơ bản mà họ đang tƣơng tác với một sự
hiểu biết toàn diện và nhận thức về các vấn đề bảo mật của đoạn mã mà họ đang
13
phát triển, những nhà phát triển ứng dụng thƣờng có thể tạo ra những ứng dụng vốn
khơng an tồn mà cịn dễ bị dính lỗi SQL injection.
Dynamic String Building
Dynamic string building là một kỹ thuật lập trình cho phép các nhà phát triển
tạo ra các câu lệnh SQL linh hoạt lúc chạy. Những nhà phát triển có thể tạo ra
những mục đích chung, các ứng dụng mềm dẻo bằng cách sử dụng SQL động. Một
câu lệnh SQL động đƣợc tạo ra lúc thực thi mà điều kiện khác nhau sẽ tạo ra những
câu lệnh SQL khác nhau. Nó có thể hữu ích cho các nhà phát triển tạo ra các câu
lệnh tự động khi chúng cần đƣợc quyết định trong thời gian chạy những trƣờng nào
đƣợc trả về, câu lệnh SELECT, các tiêu chí khác nhau cho các truy vấn và có lẽ các
bảng cũng khác nhau để truy vấn dựa trên những điều kiện khác nhau.
Tuy nhiên, các nhà phát triển có thể đạt đƣợc cùng một kết quả một cách an
toàn hơn nhiều nếu họ sử dụng các truy vấn đã đƣợc tham số hóa. Những truy vấn
đƣợc tham số hóa là những truy vấn có một hoặc nhiều tham số đƣợc nhúng trong
câu lệnh SQL. Các tham số có thể đƣợc truyền cho các truy vấn này trong thời gian
chạy; các tham số có chứa các thơng số đầu vào của ngƣời dùng đƣợc nhúng sẽ
không hiểu đƣợc là các lệnh để thực thi, và sẽ không có cơ hội nào cho các mã đƣợc
chèn vào. Phƣơng pháp nhúng các tham số này trong SQL hiệu quả hơn và an toàn
hơn nhiều so với cách tạo và thực thi các câu lệnh SQL một cách động sử dụng kỹ
thuật tạo chuỗi.
Một trong những hậu quả của việc tạo ra các câu lệnh SQL động đó là nếu nhƣ
đoạn mã không đƣợc xác nhận hay không đƣợc mã hóa đầu vào trƣớc khi chuyển
nó đến câu lệnh đƣợc tạo ra động, thì một kẻ tấn cơng có thể nhập vào một câu lệnh
SQL nhƣ là một giá trị đầu vào của ứng dụng và những câu lệnh SQL của hắn ta sẽ
đƣợc chuyển đến cơ sở dữ liệu và đƣợc thực thi. Đây là câu lệnh mà đoạn code đó
tạo ra:
SELECT * FROM TABLE WHERE FIELD = 'input'
14
Xử lý các ký tự dấu nháy đơn khơng chính xác
Cơ sở dữ liệu SQL hiểu những ký tự nháy đơn („) nhƣ một ranh giới giữa đoạn
mã và dữ liệu. Nó hiểu rằng bất cứ những gì sau dấu nháy đơn là đoạn mã thì nó cần
phải chạy và bất cứ cái gì đƣợc đóng trong dấu nháy đơn thì đều là dữ liệu. Vì vậy
ta có thể nhanh chóng biết đƣợc một trang web có bị lỗi SQL injection hay không
bằng cách thêm dấu nháy đơn vào trong url hoặc trong một trƣờng trong một trang
web hoặc một ứng dụng.
Nếu ta nhập vào một ký tự „ làm đầu vào cho ứng dụng, thì ta có thể thấy đƣợc
một trong các lỗi sau đây, kết quả phụ thuộc vào một số yếu tố môi trƣờng, chẳng
hạn nhƣ ngôn ngữ lập trình, cơ sở dữ liệu đang dùng, cũng nhƣ các kỹ thuật bảo vệ
và phòng thủ đƣợc cài đặt.
Warning: mysql_fetch_array(): supplied argument is not a valid
MySQL result resource in
/home/cavallovn/domains/cavallo.vn/public_html/productdetailconten
t.php on line 3
Chúng ta có thể nhận đƣợc lỗi trƣớc hoặc một lỗi sau. Các lỗi dƣới đây cung
cấp những thơng tin hữu ích cho cách các câu lệnh SQL đƣợc trình bày nhƣ thế nào:
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 '\'' at line 1
Lý do của lỗi này là do ký tự „ đã đƣợc hiểu nhƣ là một chuỗi ký tự phân cách.
Một cách cú pháp hóa, câu truy vấn SQL đƣợc thực thi lúc trong thời gian chạy
không đúng (nó có một chuỗi ký tự quá nhiều ký tự phân cách), và do đó cơ sở dữ
liệu đƣa ra một ngoại lệ. Các cơ sở dữ liệu SQL hiểu ký tự „ nhƣ một ký tự đặc biệt
(một chuỗi phân cách). Ký tự dùng trong các cuộc tấn công SQL injection để thoát
khỏi truy vấn của các nhà phát triển mà kẻ tấn cơng có thể tạo ra những truy vấn
cho riêng mình và thực hiện chúng.
15
Xử lý sai kiểu
Đến bây giờ, một số ngƣời có thể nghĩ rằng để tránh bị khai thác lỗi SQL
injection thì chỉ đơn giản là xác nhận đầu vào để loại bỏ những ký tự nháy đơn „ là
đủ. Vâng, đó là một cái bẫy mà nhiều nhà phát triển ứng dụng web đã rơi vào. Nhƣ
đã giải thích trƣớc đó, ký tự nháy đơn đƣợc hiểu nhƣ một xâu phân cách và đƣợc sử
dụng nhƣ một ranh giới giữa đoạn mã và dữ liệu. Khi xử lý dữ liệu kiểu số thì nó
khơng cần thiết phải đóng gói dữ liệu trong những dấu nháy kép; nếu không các dữ
liệu số sẽ đƣợc hiểu nhƣ một chuỗi.
MySQL cung cấp một chức năng gọi là LOAD_FILE mà đọc một tệp tin và trả
về một tệp tin nội dung nhƣ một chuỗi. Để sử dụng chức năng này, tệp tin phải
đƣợc đặt trên các máy chủ lƣu trữ cơ sở dữ liệu và tên các đƣờng dẫn đầy đủ đến
tệp tin phải đƣợc cung cấp làm đầu vào cho hàm. Ngƣời sử dụng muốn gọi hàm thì
phải có quyền trên tệp tin. Câu lệnh dƣới đây, nếu nhập vào theo đầu vào, có thể
cho phép một kẻ tấn cơng có thể đọc nội dung của tệp tin /etc/passwd, trong đó có
các thuộc tính của ngƣời dùng và tên ngƣời dùng trong danh sách những ngƣời
dùng hệ thống:
1 UNION ALL SELECT LOAD_FILE('/etc/passwd')--
Đầu vào mà kẻ tấn công nhập vào sẽ đƣợc hiểu trực tiếp nhƣ cú pháp SQL; vì
thế, khơng cần cho kẻ tấn cơng thốt khỏi truy vấn với ký tự nháy đơn. Đây là một
mô tả rõ ràng hơn về câu lệnh SQL đƣợc tạo ra:
SELECT
*
FROM
TABLE
WHERE
USERID
=
1
UNION
ALL
SELECT
LOAD_FILE('/etc/passwd')--
Các lỗi xử lý khơng chính xác
Các lỗi xử lý khơng chính xác có thể đƣa ra một loạt các vấn đề về bảo mật cho
một trang web. Vấn đề thƣờng xảy ra nhất là khi các thông báo lỗi nội bộ chẳng hạn
nhƣ cơ sở dữ liệu đổ vỡ và các mã lỗi đƣợc hiển thị chi tiết cho ngƣời dùng hoặc kẻ
tấn công. Những thông điệp này đã để lộ những chi tiết của những gì đã cài đặt mà
khơng bao giờ đƣợc để lộ ra ngồi. Những chi tiết nhƣ vậy có thể cung cấp cho một
16
kẻ tấn công những đầu mối quan trọng về khả năng của những lỗ hổng trong trang
web. Những thông điệp báo lỗi của cơ sở dữ liệu một cách rƣờm rà có thể đƣợc sử
dụng để trích xuất thơng tin từ cơ sở dữ liệu để phục vụ cho việc khai thác nhƣ làm
thế nào để sửa đổi hoặc chèn vào để thoát khỏi những truy vấn của những nhà phát
triển hay làm thế nào để vận dụng nó để mang lại thêm nhiều dữ liệu hoặc trong
một số trƣờng hợp có thể lấy ra tồn bộ cơ sở dữ liệu của trang web đó.
Nếu một kẻ tấn cơng thao tác bằng tay những yêu cầu bằng HTTP và thay thế
các giá trị ID dự kiến của mình vào cho câu lệnh SQL, thì hắn ta có thể sử dụng
thơng tin về những thơng điệp lỗi SQL để tìm hiểu giá trị trong cơ sở dữ liệu. Ví dụ,
nếu kẻ tấn công nhập vào các truy vấn sau đây, thực thi các câu lệnh SQL sẽ cho kết
quả trong một thông tin với những thông báo lỗi SQL đƣợc hiển thị có chứa thơng
tin về phiên bản của hệ quản trị cơ sở dữ liệu (RDBMS) mà ứng dụng web đang sử
dụng:
' and 1 in (SELECT @@version) --
Mặc dù đoạn mã này khơng chƣa điều kiện bẫy lỗi, nó cũng không cung cấp tùy
chỉnh và những thông báo lỗi chung chung. Thay vào đó, nó cho phép kẻ tấn cơng
thao tác bằng tay trên các ứng dụng và thông tin những thơng báo lỗi của ứng dụng
đó. Dƣới đây là thơng báo lỗi đƣợc trả về trên trình duyệt của ngƣời sử dụng:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC
converting
the
SQL
nvarchar
Server
Driver][SQL
Server]Syntax
'Microsoft
SQL
value
Server
error
2000
-
8.00.534 (Intel X86) Nov 19 2001 13:23:50 Copyright (c) 1988-2000
Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build
2195: Service Pack 3) ' to a column of data type int.
Xử lý sai nhiều quy trình
Danh sách trắng là một kỹ thuật cho chúng ta biết những ký tự không đƣợc
phép, ngoại trừ những ký tự có trong danh sách trắng. Danh sách trắng gần nhƣ là
để xác nhận giá trị đầu vào để tạo một danh sách tất cả các ký tự có thể sẽ đƣợc
17