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ữ
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
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
Trang 2………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Trang 3………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Trang 4CHƯƠ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
Trang 5CHƯƠ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
Trang 6trọ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
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”
Trang 7cô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
Trang 8CHƯƠ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
Trang 9Hì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
Trang 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)
Trang 11Hì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)
Trang 12Hì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)
Trang 131.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,
Trang 141.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
Trang 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
Trang 161.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
Trang 17database đố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
Trang 18CHƯƠ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>
Trang 19'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ệ
Trang 202.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 :
http://www.xyz.com.vn/?a=news&id=46
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 : http://www.xyz.com.vn/?a=news&id=46’
Trang 21Ta đượ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ề
http://www.xyz.com.vn/?a=news&id=46 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
http://www.xyz.com.vn/?a=news&id=46 order by 2 {bình thường}
Trang 22… http://www.xyz.com.vn/?a=news&id=46 order by 9 {bình thường}
http://www.xyz.com.vn/?a=news&id=46 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 :
http://www.xyz.com.vn/?a=news&id=-46 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
Trang 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 :
http://www.xyz.com.vn/?a=news&id=-46 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 :
http://www.xyz.com.vn/?a=news&id=-46 union select
1,2,group_concat(table_name),4,5,6,7,8,9 from information_schema.tables
where
Trang 24table_schema=database() 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 :
http://www.xyz.vn/?a=news&id=-46 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
Trang 25Hì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 :
http://www.xyz.com.vn/?a=news&id=-46 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 http://www.xyz.com.vn
Trang 26c) Tìm kiếm trang quản trị
Trong một website, những người quản trị sẽ có trang riêng để quản lý website, muốn vào được trang quản lý này thì người quản trị phải nhập đúng tài khoản của mình Với cách tấn công ở trên, kẻ tấn công đã thu được thông tin về tài khoản người quản trị Việc cuối cùng của kẻ tấn công bây giờ là tìm liên kết để vào trang quản trị
Ở bước này, kẻ tấn công sẽ dùng phép thử để tìm kiếm trang quản trị Phép thử ở đây chính là liên kết mà được dùng phổ biến nhất, ví dụ :
Đối với website trên, trang quản lý chính là :
Trang 27tấn công một phần chứ không thể ngăn chặn chúng tấn công Còn rất nhiều cách khác áp dụng cho từng trường hợp
Như ta đã thấy, với kiểu tấn công này, ngay cả những kẻ tấn công không chuyên cũng có thể thực hiện được Chỉ cần một vài thao tác và câu lệnh đơn giản là mọi thông tin quan trọng của website đã rơi vào tay của kẻ xấu Điều này càng cho thấy mức độ nguy hiểm của SQL Injection
2.1.3 Blind SQL Injection
Để đề phòng SQL Injection, một số website đã tắt chức năng thông báo lỗi từ database Tuy nhiên, việc này chỉ có thể làm khó những kẻ tấn công không chuyên Đối với những kẻ có trình độ cao, họ sẽ sử dụng một phương pháp tấn công được gọi là Blind SQL Injection
Blind SQL Injection là một phương pháp thực hiện SQL Injection trong điều kiện các thông tin khai thác được không được trình bày trực tiếp trên nội dung phản hồi từ database Blind SQL Injection dựa vào việc sử dụng các mệnh đề điều kiện để thực hiện suy luận thông tin cần khai thác Cụ thể, Blind SQL Injection sử dụng chính các thông tin cần khai thác làm mệnh đề điều kiện (mệnh đề suy luận), và sử dụng các phương pháp khác nhau để
“đánh dấu” trường hợp đúng/sai của mệnh đề đó
Căn cứ vào phương pháp “đánh dấu” trường hợp đúng/sai của mệnh
đề quan hệ, ta chia ra hai cách chính thực hiện blind SQL Injection:
- Dựa vào nội dung phản hồi (response-based)
- Dựa vào độ trễ của thời gian phản hồi (time-based)
Các phương pháp thực hiện Blind SQL Injection có thể áp dụng cho các mô hình khác mà không gặp trở ngại nào, tuy nhiên chi phí thực hiện sẽ luôn cao hơn về mặt thời gian và số truy vấn cần thiết
Trang 282.1.3.1 Thực hiện tấn công Blind SQL Injection dựa trên phản hồi
Xét liên kết : http://www.xyz.com.vn/?a=news&id=46
Sau khi bị tấn công, người quản trị website trên đã thực hiện việc bảo mật bằng cách tắt các thông báo lỗi trả về từ database, với suy nghĩ rằng không có thông báo lỗi thì kẻ tấn công sẽ không biết dựa vào đâu để tấn công được
Tấn công bằng cách thông thường : Việc truy vấn bằng cách thêm ’ vào sau liên kết, hay sử dụng các hàm truy vấn đều không đem lại kết quả Trang web vẫn hiển thị một cách bình thường Lúc này kẻ tấn công sẽ sử dụng các phép thử đúng/sai để tấn công
Kẻ tấn công sẽ thử truy vấn bằng liên kết :
http://www.xyz.com.vn/?a=news&id=46 and 1=1
Hình 2-9 Trang web bình thường
Trang 29Website vẫn hiển thị bình thường Thay truy vấn bằng :
http://www.xyz.com.vn/?a=news&id=46 and 1=2
Hình 2-10 Trang web bị lỗi Blind SQL Injection
Kết quả trả về một trang trắng, không có nội dung hiển thị
Lý do website hiển thị không đúng với vốn có của nó là bởi vì, mệnh
đề trước AND là một câu truy vấn cho kết quả đúng (http://www.xyz.com.vn/?a=news&id=46) , mệnh đề sau AND là một kết quả sai (1=2)
true AND true = true true AND false = false
Đó là nguyên nhân của việc website hiển thị không đúng
Điều này cho thấy website trên vẫn chưa thực hiện một biện pháp phòng chống SQL Injection cụ thể nào Đây chính là cơ sở để kẻ tấn công tiếp tục cuộc tấn công của mình
Thực hiện các truy vấn tương tự, kẻ tấn công có thể dò được thông tin
về phiên bản, tên database, tên bảng, tên cột, thông tin người dùng
http://www.xyz.com.vn/?a=news&id=46 and substring(@@version,1,1)=4
Hình 2-11 Tìm kiếm phiên bản cơ sở dữ liệu bằng Blind SQL Injection
Trang 30Website hiển thị một trang trắng, chứng tỏ điều kiện phiên bản là 4
sai => phiên bản của hệ quản trị cơ sở dữ liệu đang dùng lớn hơn 4
Tiếp tục phép thử :
http://www.tne.com.vn/?a=news&id=46 and substring(@@version,1,1)=5
Website hiển thị bình thường
Kết luận : phiên bản đang sử dụng lớn hơn 5
2.1.3.2 Thực hiện tấn công Blind SQL Injection dựa trên độ trễ truy vấn
Tấn công Blind SQL Injection dựa vào thời gian phản hồi là cách tiến hành khai thác các lỗi Blind SQL Injection mạnh nhất Trong nhiều trường hợp tuy truy vấn có chứa điểm yếu, nhưng kết quả của truy vấn “sạch” với truy vấn “độc hại” không có sự khác biệt đáng kể, do đó rất khó để sử dụng Blind SQL Injection dựa trên phản hồi
Bản chất của phương thức tấn công này là thay vì sử dụng nội dung kết quả truy vấn để phân biệt trường hợp true/false của mệnh đề suy luận được chèn thì nó sử dụng sự chênh lệch về thời gian phản hồi của ứng dụng
để phân biệt Nếu điều kiện đúng thì sẽ thực hiện mệnh đề true (với thời gian t), sai thực hiện theo mệnh đề false ( với thời gian 5t,10t hay 15t tùy theo kẻ tấn công quy định) Sau đó kẻ tấn công chỉ cần so sánh thời gian thực hiện truy vấn để có thể kết luận được phép thử của mình là đúng hay sai Từ đó, kẻ tấn công có thể dò ra được nhiều thông tin về cơ sở dữ liệu website
Có hai phương pháp để sinh độ trễ trong truy vấn:
- Gọi các hàm trì hoãn thực thi được các hệ quản trị cơ sở dữ liệu hỗ trợ
- Sử dụng các truy vấn “lớn”
Trang 31 Gọi các hàm trì hoãn thực thi :
Trên các hệ quản trị cơ sở dữ liệu thường có một số hàm có thể lợi dụng để sinh độ trễ về thời gian thực thi truy vấn Ví dụ:
- Trong MySQL ta có BENCHMARK(N, expression) hoặc ở phiên bản 5.0.12 trở đi có thêm SLEEP(seconds)
- Trong SQL Server có WAITFOR DELAY ‘hh:mm:ss’
- Trong Oracle có DBMS_LOCK.SLEEP(seconds)
Trong MySQL chúng ta sử dụng các cấu trúc điều kiện sau ứng với trường hợp tham số kiểu xâu ký tự hoặc số :
- Trường hợp tham số có kiểu xâu ký tự ta có thể dùng cấu trúc sau :
‘ union select if(expression, true_exp, false_exp)
- Trong đó expression là mệnh đề suy luận
- True_exp: câu lệnh/giá trị ứng với trường hợp mệnh đề suy luận nhận giá trị true
- False_exp: câu lệnh/giá trị ứng với trường hợp mệnh đề suy luận nhận giá trị false
- Trường hợp tham số kiểu số ta có thể sử dụng cấu trúc sau :
If(expression, true_exp, false_exp)
- Trong đó expression là mệnh đề suy luận
- True_exp: câu lệnh/giá trị ứng với trường hợp mệnh đề suy luận nhận giá trị true
- False_exp: câu lệnh/giá trị ứng với trường hợp mệnh đề suy luận nhận giá trị false
Trang 32 Sử dụng các truy vấn lớn
Các truy vấn lớn ở đây được hiểu là các truy vấn trên những tập dữ liệu rất lớn, ví dụ dữ liệu metadata của database Khi thực hiện những truy vấn này bộ xử lý phải làm việc nhiều, và truy vấn sẽ bị trì hoãn một cách rất
“tự nhiên”
Truy vấn lớn hay dùng nhất là nối chéo các bảng dữ liệu (tích Cartesian) làm tập số lượng kết quả đã tăng lên rất lớn …
Mục tiêu thường được sử dụng nhất là bảng
information_schema.tables hay information_schema.columns với số lượng
thông tin rất lớn Nếu nối chéo các bảng này với nhau sẽ cho ta một số lượng
dữ liệu khổng lồ, có thể nhận thấy độ trễ bất thường khi thực hiện truy vấn
2.1.4 Dạng tấn công sử dụng các stored-procedure
Trong các hệ quản trị cơ sở dữ liệu, các lập trình viên đã tạo sẵn cho người dùng một số hàm có sẵn, phục vụ mục đích truy vấn cơ sở dữ liệu dễ dàng hơn Các stored-procedure này đều bắt đầu bằng “xp_”, ví dụ xp_cmdshell, xp_startmail, xp_sendmail, xp_makewebtask … với các mục đích sử dụng khác nhau
Để sử dụng các stored-procedure này thì ứng dụng phải được cấp
quyền Trong SQL Server, một số quyền mặc định bao gồm dbo (quyền của
người sở hữu cơ sở dữ liệu) - 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); sa (quyền quản trị hệ thống) - 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
Đây là một trong những lỗ hỏng chết người mà những kẻ tấn công có
thể khai thác Nếu ứng dụng lỗi SQL Injection có quyền dbo hay sa thì việc
sử dụng các stored-procedure sẽ rất dễ dàng
Trang 33Đầu tiên, kẻ tấn công sẽ tìm kiếm trang bị lỗi SQL Injection một cách thông thường Sau đó, họ sẽ chèn vào các câu lệnh điều khiển các stored-procedure với mục đích tìm kiếm thông tin về server, các website nằm cùng server, xóa dữ liệu server …
Ví dụ, nếu kẻ tấn công chèn vào một form login, một liên kết, hay trang tìm kiếm của website bị lỗi SQL Injection đoạn mã sau :
' ; EXEC xp_cmdshell ‘cmd.exe dir C: '
Lúc này hệ thống sẽ thực hiện lệnh liệt kê thư mục trên ổ đĩa C:\ cài đặt server Việc phá hoại kiểu nào tuỳ thuộc vào câu lệnh đằng sau cmd.exe
Hoặc :
' ; EXEC xp_cmdshell ‘cmd.exe format C: '
Tương đương với việc xóa sạch toàn bộ dữ liệu ở ổ đĩa C của server
2.1.5 Một số cách qua mặt bộ lọc đầu vào
Để phòng chống các cuộc tấn công SQL Injection, hầu hết các website đều sử dụng các bộ lọc để lọc dữ liệu đầu vào Các bộ lọc này làm việc theo nguyên tắc lọc các kí tự đặc biệt trong dữ liệu nhập từ người dùng
Ví dụ :
Truy vấn từ người dùng :
http://www.xyz.com.vn/?a=news&id=-46 union select
1,2,group_concat(ten,0x7c,matma),4,5,6,7,8,9 from
Trang 34quantri3 Sau khi qua bộ lọc sẽ trở thành :
http://www.xyz.com.vn/?a=news&id=-46
1,2,group_concat(ten,0x7c,matma),4,5,6,7,8,9 from
quantri3 Bộ lọc đã lọc đi các từ đặc biệt như union, select, order by … vô hiệu hoá các câu truy vấn của kẻ tấn công
Cách này tương đối hiệu quả, tuy nhiên vẫn bị một số kẻ tấn công trình độ cao qua mặt Kẻ tấn công có thể thay thế các lệnh SQL thông thường bằng cách thay đổi kí tự hoa thường của chúng Ví dụ :
“UNION” thay thế cho “union”
“SELeCt” thay thế cho “select”
“OrdeR BY” thay thế cho “order by”
Hoặc, kẻ tấn công cũng có thể mã hóa các lệnh trên về hệ hex Từ đó
có thể qua mặt các bộ lọc
2.2 Cách phòng tránh SQL Injection
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 Để phòng tránh, ta có thể thực hiện ở hai mức :
2.2.1 Về phía người quản trị website
Kiểm soát chặt chẽ dữ liệu đầu vào
Để phòng tránh các nguy cơ có thể xảy ra, hãy bảo vệ các câu lệnh SQL là bằng cách kiểm soát chặt chẽ tất cả các dữ liệu nhập nhận được từ người dùng Ví dụ, có thể giới hạn chiều dài của chuỗi nhập liệu, hoặc xây
dựng hàm EscapeQuotes để thay thế các dấu nháy đơn bằng 2 dấu nháy đơn
như sau :
<%
Function EscapeQuotes(sInput) sInput = replace(sInput, " ' ", " ' ' ") EscapeQuotes = sInput