ĐẠI HỌC THÁI NGUYÊN TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
ĐÀM QUANG VINH
NGHIÊN CỨU TÌM HIỂU TẤN CÔNG SQL INJECTION
ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC CHUYÊN NGÀNH CÔNG NGHỆ THÔNG TIN
THÁI NGUYÊN, NĂM 2019
1
ĐẠI HỌC THÁI NGUYÊN TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
ĐỒ ÁN
TỐT NGHIỆP ĐẠI HỌC Chuyên ngành Công nghệ thông tin Đề tài:
NGHIÊN CỨU TÌM HIỂU TẤN CÔNG SQL INJECTION Sinh viên thực hiện:
Đàm Quang Vinh
Lớp ĐH-K16D, hệ chính qui Giáo viên hướng dẫn: ThS. VŨ VIỆT DŨNG
2
Thái Nguyên, năm 2019 MỤC LỤC
LỜI CẢM ƠN Em xin gửi lời cảm ơn sâu sắc đến các thầy cô trường Đại học Công Nghệ Thông Tin và Truyền Thông Thái Nguyên đã hết lòng truyền đạt cho em những kiến thức bổ ích trong suốt thời gian qua, cũng như đã tạo điều kiện cho em được phát huy ý tưởng. Đặc biệt, em xin gửi lời cảm ơn chân thành đến thầy Ths.Vũ Việt Dũng đã tận tình hướng dẫn, truyền đạt kiến thức và chỉ bảo cho em trong suốt thơi gian thực hiện đề tài. Mặc dù em đã rất cố gắng, xong chắc chắn báo cáo sẽ còn rất nhiều thiếu sót, em rất mong nhận được sự hướng dẫn thêm của quý Thầy Cô, các Anh Chị và các Bạn
Thái Nguyên, ngày
3
tháng
năm 2019
DANH MỤC HÌNH ẢNH
4
DANH MỤC BẢNG BIỂU
5
DANH MỤC NHỮNG TỪ VIẾT TẮT STT
Chữ viết tắt
Nội dung viết tắt Structured Query Language ( Ngôn ngữ truy vấn có cấu trúc )
01 SQL 02
Structured Query Language injection SQLi
03
Whitehat security Whitehatsec
04
Positive technologies security Ptsecurity
05
Cơ sở dữ liệu Database Database Management System ( Hệ quản trị Cơ sở dữ liệu )
06 DBMS
Web Application Friewall ( Tường lửa cho ứng dụng Web )
07 WAF
6
LỜI MỞ ĐẦU 1. Lý do chọn đề tài Ngày nay với sự phát triển vượt bậc của công nghệ web đã đem lại rất nhiều thuận lợi cho người sử dụng cũng như các nhà phát triển. Nhưng cùng với sự phát triển này thì các ứng dụng web cũng trở thành mục tiêu ưu thích của những kể tấn công. Các hình thức tấn công rất đa dạng như thay đổi nội dung của trang web, tấn công từ chối dịch vụ khiến cho việc truy cập trang web không thể thực hiện hoặc rất khó thực hiện, chiếm quyền điều khiển trang web… Mục tiêu của các hacker cũng rất khác nhau, có thể tấn công xuất phát
từ thiện chí, nhằm tìm ra những điểm yếu và thông báo cho nhà quản trị hệ thống. Nghiêm trọng hơn là tấn công để phục vụ cho các mục đích xấu như tống tiền trang web, lấy cắp những dữ liệu nhạy cảm như thông tin về thẻ tín dụng, mua hàng thông qua tài khoản của người khác… Trong các hình thức tấn công thì tấn công bằng cách chèn mã lệnh (injection) là phổ biến. Tấn công website bằng kỹ thuật SQL injection từ lâu đã là mối quan tâm bảo mật hàng đầu của các nhà phát triển web và chủ sở hữu website. Giờ đây, các cuộc tấn công này ngày càng trở nên khó phát hiện và ngăn chặn hơn. Số lượng các vụ tấn công nhằm vào cơ sở dữ liệu (CSDL) web đã lên tới một con số kỷ lục. Theo các báo cáo về an ninh mạng gần đây, như của Whitehatsec một tổ chức có uy tín trong việc nghiên cứu và hỗ trợ các vấn đề về an ninh mạng, Ptsecurity một tổ chức chuyên nghiên cứu và đưa ra các giải pháp về an ninh hay trên trang Verizon Business, Sans Institute thì đều cho thấy mức độ phát triển nhanh chóng, tính nghiêm trọng của các lỗ hổng bảo mật và sự quan tâm chưa đúng mức của các tổ chức tới vấn đề này. SQL Injection là một vấn đề an ninh trên ứng dụng web được nhấn mạnh trong các báo cáo trên.
7
SQL Injection là kiểu tấn công có mục tiêu rất cụ thể và thường là mục tiêu đơn lẻ cho mỗi một vụ tấn công. Chính vì thế mà những vụ tấn công như thế này thường không gây được sự chú ý rộng rãi như virus hay sâu máy tính. Âm thầm như thế nhưng thiệt hại của những vụ tấn công này lại rất lớn. Nếu như một máy chủ cơ sở dữ liệu bị tin tặc chiếm quyền kiểm soát thì sẽ có một khối lượng rất lớn thông tin cá nhân tài chính của người dùng sẽ rơi vào tay chúng. Và nếu thành công thì có thể nói nguồn thông tin mà tin tặc thu được còn nhiều hơn rất nhiều so với tấn công phishing. Tin tặc không phải mất công giả mạo để lừa người sử dụng cung cấp thông tin cá nhân tài chính. Tỉ lệ thành công của các vụ tấn công SQL Injection thường rất cao. Trên thực tế do sự phát triển mạnh mẽ từng giờ, từng ngày của công nghệ thông tin cho nên các kiểu tấn công của các hacker cũng ngày càng tinh vi, phức tạp và khó ngăn
chặn. Xuất phát từ những lý do trên, em chọn đề tài “ Nghiên cứu tìm hiểu về tấn công SQL Injection ” làm đề tài nghiên cứu. 2. Mục đích nghiên cứu - Giúp chúng ta có thể hiểu hơn về các ứng dụng web, các mối đe dọa về vấn đề an toàn thông tin khi chúng ta làm việc trên ứng dụng web hàng ngày, hiểu rõ hơn về các kỹ thuật tấn công và bảo mật web. - Hiểu rõ khái niệm SQL Injection, phương thức hoạt động của các hacker thông qua lỗ hổng này để xâm nhập vào cơ sở dữ liệu và mối nguy hiểm thường trực về an ninh ứng dụng web của các tổ chức. - Hiểu rõ về lỗi bảo mật SQL Injection trên ứng dụng web, nguyên nhân dẫn đến lỗi, các dạng tấn công, cách thức và phương pháp tấn công từ đó rút ra các biện pháp để phòng chống. 3. Ý nghĩa khoa học và thực tiễn của đề tài Theo các báo cáo về an ninh mạng gần đây, như của Whitehatsec, Ptsecurity đều cho thấy mức độ phổ biến của kiểu tấn công SQL Injection là rất cao và đứng đầu trong danh dách các lỗi bảo mật nghiêm trọng nhất, bởi vì nó cũng khá đơn giản để thực hiện, là một
8
trong những lỗi bảo mật phổ biến nhất, xác suất gặp lỗi bảo mật này khá cao và các tác động của SQL Injection tới hệ thống là rất nguy hiểm. Đây thật sự là một lỗ hổng về bảo mật rất đáng được quan tâm đến. Dựa vào lỗi SQL Injection, hacker có thể làm được những việc sau: - Có thể lấy được rất nhiều thông tin quan trọng trong cơ sở dữ liệu của một hệ thống web như account và password của admin của một web site, hay các thông tin quan trọng về thẻ tín dụng của khách hàng trong một ngân hàng nào đó… - Có thể thêm, xóa, sửa cơ sở dữ liệu của đối tượng bị tấn công theo ý muốn - Có thể tạo một backdoor cho những lần tấn công sau - Có thể đánh sập hoàn toàn một hệ thống
- Có thể dùng như một phương pháp tấn công DoS Các cuộc tấn công SQL Injection thường nhắm đến các cơ sở dữ liệu mang tính thương mại, các website của thành phố thậm chí là các website của chính phủ, hầu hết các website bị tấn công đều thuộc loại đáng tin cậy, hợp pháp và an toàn tuyệt đối trong mắt người dùng. Xuất phát từ thực tế trên việc nghiên cứu đề tài này là hoàn toàn cấp thiết. 4. Đối tượng và phạm vi nghiên cứu Tìm hiểu kỹ thuật tấn công phổ biến nhất hiện nay là SQL Injection và cách bảo mật phòng thủ kiểu tấn công này một cách tổng quan nhất. 5. Phương pháp nghiên cứu - Tiếp cận ứng dụng sử dụng cơ sở dữ liệu, ngôn ngữ truy vấn có cấu trúc SQL và lỗ hổng bảo mật SQL Injection. - Tìm hiểu về các dạng lỗi SQL Injection. - Tìm hiểu về các dạng tấn công SQL Injection phổ biến. - Tìm hiểu các cách thức và phương pháp tấn công. - Từ các kiến thức đã tìm hiểu đưa ra các giải pháp phòng chống tấn công SQL Injection có hiệu quả.
9
6. Cấu trúc đề tài Đề tài gồm 5 chương: - Chương 1: Tổng quan về SQL Injection. - Chương 2: Các dạng lỗi SQL Injection thường gặp. - Chương 3: Các dạng tấn công SQL Injection phổ biến. - Chương 4: Cách thức và phương pháp tấn công. - Chương 5: Cách phòng chống tấn công SQL Injection.
10
CHƯƠNG 1 TỔNG QUAN VỀ SQL INJECTION 1.1. Đặc trưng của ứng dụng sử dụng cơ sở dữ liệu Không khó để nhận ra rằng, hiện nay những ứng dụng phổ biến nhất và chiếm thị phần cũng như doanh thu cao nhất đều là những ứng dụng hổ trợ tính năng quản lý. Dữ liệu là thứ sống còn trong mọi hoạt động nghiệp vụ hiện tại. Chính vì lý do đó, các ứng dụng nghiệp vụ hiện tại đều xây dựng trên những mô hình phát triển gắn liền với cơ sở dữ liệu. An toàn của dữ liệu được đặt nặng lên tính an toàn và bảo mật của ứng dụng web kết nối tới cơ sở dữ liệu. Các mô hình phát triển ứng dụng web hiện tại được sử dụng phổ biến nhất là 3tier, 4-tier, ngoài ra còn có một số bản cải tiến, mở rộng mô hình này nhằm những mục đích riêng.
Hình 1.1. Mô hình ứng dụng 3-tier
11
Hình 1.2. Mô hình ứng dụng 4-tier Các mô hình trên luôn có một số điểm chung, đó là database server chỉ làm nhiệm vụ lưu trữ dữ liệu, database hồi đáp những truy vấn dữ liệu được xây dựng theo chuẩn (ví dụ như SQL). Mọi thao tác xử lý dữ liệu input, output của database server đều được ứng dụng web ở tầng Logic xử lý. Các vấn đề an ninh phát sinh đa phần sẽ nằm ở tầng này. 1.2. Tầm quan trọng của các câu lệnh SQL đối với một hệ thống web Cơ sở dữ liệu (database) được coi như là “trái tim” của hầu hết các website. Nó chứa đựng những dữ liệu cần thiết để website có thể chạy và lưu trữ các thông tin phát sinh trong quá trình chạy. Nó cũng lưu trữ những thông tin cá nhân, thẻ tín dụng, mật khẩu của khách hàng, của user và thậm chí là cả của Administrator. Để lấy các thông tin cần thiết từ cơ sở dữ liệu thì các câu lệnh SQL sẽ đảm đương trách nhiệm thực hiện các yêu cầu truy
vấn được đưa ra từ phía người sử dụng, khi người dùng đăng nhập vào hệ thống, lấy một thông tin nào đó trên web thì đều cần sử dụng các câu lệnh SQL, hay nói cách khác, các câu lệnh SQL đóng một vai trò rất quan trọng đối với một hệ thống web. 1.3. Sql injection và tính nghiêm trọng của vấn đề an ninh cơ sở dữ liệu 1.3.1. Sql Injection là gì? SQL (Structured Query Language) injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất hợp pháp. 12
SQL Injection là một dạng tấn công dễ thực hiện, hầu hết mọi thao tác người tấn công cần được thực hiện với một trình duyệt web, có thể kèm theo một ứng dụng proxy server. Chính vì đơn giản như vậy cho nên bất cứ ai cũng có thể học cách tiến hành một cuộc tấn công. Lỗi bắt nguồn từ mã nguồn của ứng dụng web chứ không phải từ phía database, chính vì thế bất cứ thành phần nào của ứng dụng mà người dùng có thể tương tác được để điều khiển nội dung (ví dụ: các form, tham số URL, cookie, tham số referrer, user-agent, …) đều có thể được sử dụng để tiến hành chèn truy vấn có hại. 1.3.2. Hậu quả của tấn công SQL Injection Hậu quả của SQL Injection rất tai hại, nó có thể cho phép những kẻ tấn công thực hiện các thao tác, delete, insert, update, v.v. toàn quyền trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy. SQL Injection thường được biết đến như là một vật trung gian tấn công trên các ứng dụng web có dữ liệu được quản lý bằng các hệ quản trị cơ sở dữ liệu như SQL Server, MySQL, Oracle, DB2, Sysbase, v.v. 1.3.3. SQL Injection và vấn đề an ninh cơ sở dữ liệu Đây là lỗ hổng trong phát triển ứng dụng web, nó không phải lỗi của database hay của web sever và hầu hết các lập trình viên vẫn chưa nhận thức được vấn đề này. Ngày nay, khi triển khai các ứng dụng web trên internet, nhiều người vẫn nghĩ rằng việc đảm bảo an toàn, bảo mật nhằm giảm thiểu tối đa khả năng bị tấn công từ các tin tặc
chỉ đơn thuần tập chung vào các vấn đề như chọn hệ điều hành, hệ quản trị cơ sở dữ liệu, websever sẽ chạy ứng dụng, v.v. Tuy nhiên, có một nguy cơ tiềm ẩn ít được quan tâm đó là các đoạn mã của ứng dụng chạy trên đó cũng tiềm ẩn một lỗ hổng bảo mật rất lớn mà một trong số đó chính là SQL Injection, dẫn đến ngày nay rất nhiều website ở Việt Nam cũng như trên thế giới bị tấn công SQL Injection, rất nhiều giải pháp được đưa ra trên mạng nhưng vẫn không đủ tốt và chưa giải quyết triệt để được vấn đề này. Sau đây là một thống kê về an ninh cho chúng ta thấy thực trang hiện nay về các cuộc tấn công SQL Injection:
13
Các thống kê về an ninh
Chúng ta xem xét báo cáo an ninh của các ứng dụng web gần đây nhất của Whitehatsec một tổ chức có uy tín trong việc nghiên cứu và hỗ trợ các vấn đề về an ninh mạng và Ptsecurity một tổ chức chuyên nghiên cứu và đưa ra các giải pháp về an ninh. Thống kê các lỗ hổng nghiêm trọng nhất trên ứng dụng web của Whitehatsec:
14
Trích từ nguồn: /> Sơ đồ 1.1. Thống kê các lỗ hổng nghiêm trọng nhất trên ứng dụng web – Whitehatsec
15
Thống kê các lỗi bảo mật nghiêm trọng nhất của Ptsecurity:
Trích từ nguồn: /> Sơ đồ 1.2. Thống kê các lỗi bảo mật nghiêm trọng nhất - Ptsecurity Đánh giá các kết quả thống kê
Dựa vào các thống kê trên có thể rút ra vài nhật xét sau về lỗi SQL Injection: - Là một trong những lỗi bảo mật phổ biến nhất. - Xác xuất gặp phải lỗ hổng bảo mật này trong một trang web là khá cao. - Được sử dụng nhiều, lý do một phần bởi tính đợn giản, không đòi hỏi nhiều công cụ hỗ trợ. - Thời gian khắc phục các điểm yếu này thường khá lâu, do đó hậu quả thường nặng nề hơn. Trên thực tế các cuộc tấn công SQL Injection thường nhằm đến các cơ sở dữ liệu mang tính thương mại, ví dụ các trang web thương mại điện tử. Thông thường, các cuộc tấn công này thường tiến hành đánh cắp hoặc sửa đổi nội dung của database đối tượng và chèn các đoạn mã Script độc hại. Bản chất điểm yếu SQL Injection là xuất hiện từ trong quá trình sử lý dữ liệu input của người dùng bên trong mã nguồn, do chính thời gian bảo 16
trì mã nguồn thường kéo dài nên các lỗi SQL Injection cũng chậm được khắc phục triệt để. Nhận định
Với tính nghiêm trọng của các cuộc tấn công, tính dễ thực hiện một cuộc tấn công đã khiến cho SQL Injection một thời từng là hiểm họa nghiêm trọng đối với các giao dịch thương mại điện tử trên các ứng dụng web được phát triển thiếu an toàn. Hiện nay, việc nghiên cứu SQL Injection đã có hệ thống và toàn diện hơn, mối nguy hiểm này đã giảm đi, nhưng số liệu thống kê vẫn cho thấy vấn đề này vẫn chưa được giải quyết triệt để. Ở nước ta, trong quá trình đào tạo, các lập trình viên ứng dụng web được đào tạo nhiều kiến thức và kỹ năng cần thiết, tuy nhiên các kiến thức về bảo mật hầu như không được chú trọng đúng mức. Điều này vô hình chung dẫn đến hệ quả là các sản phẩm của họ đều có nguy cơ mắc phải những vấn đề bảo mật, điều mà không đáng có nếu họ được
trang bị tốt hiểu biết từ đầu.
17
CHƯƠNG 2 CÁC DẠNG LỖI SQL INJECTION THƯỜNG GẶP 2.1. Không kiểm tra ký tự thoát truy vấn Đây là dạng lỗi SQL Injection xảy ra khi dữ liệu đầu vào của người dùng không được kiểm tra để loại bỏ các ký tự thoát truy vấn và sau đó chính các dữ liệu đó lại được sử dụng để xây dựng câu lệnh SQL. Kết quả là người dùng cuối có thể thực hiện một số truy vấn không mong muốn đối với cơ sở dữ liệu của ứng dụng. Dòng mã sau minh họa lỗi này: statement = "SELECT * FROM users WHERE name = '" + userName + "';"
Câu lệnh này được thiết kế để trả về các thông tin của người dùng có tên được chỉ định từ bản ghi người dùng. Tuy nhiên, nếu biến “userName” được nhập chính xác theo một cách nào đó bởi người dùng ác ý, nó có thể trở thành một câu truy vấn SQL với mục đích khác hẳn so với mong muốn của tác giả đoạn mã trên. Ví dụ, ta nhập vào giá trị của biến “userName” như sau: ' OR '1' = '1
Hoặc sử dụng các comment để bỏ qua các phần còn lại của câu truy vấn (có hai loại chú thích trong SQL).: ' OR '1' = '1'; -' OR '1' = '1'; /*
Khiến câu truy vấn trở thành: SELECT * FROM users WHERE name = '' OR '1' = '1'; SELECT * FROM users WHERE name = '' OR '1' = '1'; -- '; SELECT * FROM users WHERE name = '' OR '1' = '1'; /* ';
18
Nếu đoạn mã trên được sử dụng trong một thủ tục xác thực thì ví dụ trên có thể được sử dụng để bắt buộc lựa chọn tất cả các trường dữ liệu (*) từ tất cả người dùng chứ không phải từ một tên người dùng cụ thể như là người lập trình dự định vì “'1'
OR '1'”
luôn đúng.
Các giá trị của biến “userName” trong câu truy vấn dưới đây sẽ gây ra việc xoá bảng người dùng cũng như xóa tất cả các người dùng trong bảng người dùng và lấy ra tất cả các thông tin của người dùng từ bảng thông tin người dùng (về bản chất là tiết lộ các thông tin của mọi người dùng). Ví dụ này minh họa bằng một API cho phép thực hiện nhiều truy vấn cùng lúc: A'; DROP TABLE users; SELECT * FROM userinfo WHERE '1' = '1
Điều này đưa tới cú pháp cuối cùng của câu truy vấn trên như sau: SELECT * FROM users WHERE name = 'A'; DROP TABLE users; SELECT * FROM userinfo WHERE '1' = '1';
Trong khi hầu hết các SQL server cho phép thực hiện nhiều truy vấn cùng lúc chỉ với một lần gọi, tuy nhiên một số SQL API như “mysql_query()” của PHP lại không cho phép điều đó vì lý do bảo mật. Điều này chỉ ngăn cản tin tặc tấn công bằng cách sử dụng các câu lệnh riêng rẽ mà không ngăn cản tin tặc thay đổi các từ trong cú pháp truy vấn. 2.2. Xử lý không đúng kiểu Lỗi SQL Injection dạng này thường xảy ra do lập trình viên khi định nghĩa đầu vào dữ liệu không rõ ràng hoặc thiếu bước kiểm tra và lọc kiểu dữ liệu đầu vào. Điều này có thể xảy ra khi
một trường số được sử dụng trong truy vấn SQL nhưng lập trình viên lại thiếu bước kiểm tra dữ liệu đầu vào để xác minh kiểu của dữ liệu mà người dùng nhập vào có phải là số hay không. Ví dụ như sau: Statement := "SELECT * FROM userinfo WHERE id = " + a_variable + ";"
Ta có thể nhận thấy một cách rõ ràng ý định của tác giả đoạn mã trên là nhập vào một số tương ứng với trường id - trường số. Tuy nhiên, người dùng cuối, thay vì nhập vào 19
một số, họ có thể nhập vào một chuỗi ký tự, và do vậy có thể trở thành một câu truy vấn SQL hoàn chỉnh mới mà bỏ qua ký tự thoát. Ví dụ, ta thiết lập giá trị của biến “a_variable” là: 1; DROP TABLE users
Khi đó, nó sẽ thực hiện lấy ra thông tin người dùng có id = 1 và thực hiện thao tác xóa bảng người dùng khỏi cơ sở dữ liệu, vì câu truy vấn hoàn chỉnh đã được hiểu là: SELECT * FROM userinfo WHERE id = 1; DROP TABLE users;
2.3. Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu Đôi khi lỗ hổng có thể tồn tại chính trong phần mềm máy chủ cơ sở dữ liệu, ví dụ trường hợp hàm “mysql_real_escape_string()” của các máy chủ MySQL. Điều này sẽ cho phép kẻ tấn công có thể thực hiện một cuộc tấn công SQL Injection thành công dựa trên những ký tự Unicode thông thường ngay cả khi dữ liệu đầu vào đã được kiểm tra thoát truy vấn. 2.4. Blind SQL Injection Lỗi SQL Injection dạng này là dạng lỗi tồn tại ngay trong ứng dụng web nhưng hậu quả của chúng lại không hiển thị trực quan cho những kẻ tấn công. Nó có thể gây ra sự sai khác khi hiển thị nội dung của một trang chứa lỗi bảo mật này, loại tấn công này thường tốn nhiều thời gian. Những kẻ tấn công còn có thể sử dụng một số công cụ để dò tìm lỗi dạng này và tấn
công khi vi trí lỗ hổng với những thông tin mục tiêu đã được thiết lập sẵn, ngoài ra những kẻ tấn công có thể sử dụng một số kỹ thuật để xác định xem ứng dụng web có bị lỗi và thực hiện khai thác. Dưới đây là một số kỹ thuật giúp kẻ tấn công có thể xác định được một ứng dụng web có bị lỗi Blind SQL Injection hay không:
20
2.4.1. Thay đổi giá trị điều kiện truy vấn Dạng lỗi này khiến cho kẻ tấn công có thể thay đổi giá trị điều kiện trong câu truy vấn, làm sai lệch sự hiển thị của một ứng dụng chứa lỗi này. SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1 = 1;
Sẽ hiển thị một trang một cách bình thường, trong khi: SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1 = 2;
Sẽ hiển thị một nội dung khác, hoặc không hiển thị gì nếu ứng dụng web có chứa lỗi SQL Injection dạng này. Lỗ hổng dạng này còn cho phép tin tặc không chỉ gây ảnh hưởng tới bảng hay dữ liệu hiện tại mà còn ảnh hưởng tới những dữ liệu hay bảng khác phụ thuộc vào nội dung của dữ liệu hay bảng hiện tại. 2.4.2. Điều kiện lỗi Lỗi SQL Injection dạng này dẫn tới việc buộc cơ sở dữ liệu chỉ được phép đánh giá khi mà giá trị của câu lệnh “WHERE” là đúng. Ví dụ: SELECT 1/0 FROM users WHERE username = 'Admin';
Phép chia cho 0 chỉ được đánh giá là lỗi khi mà người dùng có tên “ Admin” tồn tại trong cơ sở dữ liệu. 2.4.3. Thời gian trễ Lỗi SQL Injection dạng này tồn tại khi thời gian xử lý của một hay nhiều truy vấn
SQL phụ thuộc vào dữ liệu logic được nhập vào hoặc quá trình xử lý truy vấn của SQL engine cần nhiều thời gian. Tin tặc có thể sử dụng lỗi SQL Injection dạng này để xác định thời gian chính xác mà trang cần tải khi giá trị nhập vào là đúng. Ví dụ: 'waitfor delay '00: 00: 10' -
21
CHƯƠNG 3 CÁC DẠNG TẤN CÔNG SQL INJECTION PHỔ BIẾN Các cuộc tấn công nhắm tới lớp database của ứng dụng web xét theo mục đích được chia làm hai loại chính: - Thứ nhất là nhắm tới dữ liệu chứa trong database, loại này thường là kẻ tấn công nhắm tới các thông tin có giá trị như thông tin cá nhân, thông tin tài chính, như mật khẩu, thẻ tín dụng, v.v. - Thứ hai là nhắm tới chính bản thân database, loại này thì kẻ tấn công có thể sử dụng những thông tin khai thác được để tạo dấu vân tay cho cơ sở dữ liệu, xây dựng biểu đồ cơ sở dữ liệu, truy xuất dữ liệu từ bất kỳ bảng nào trong cơ sở dữ liệu, biết database thành cửa ngõ và tiến hành một cuộc tấn công leo thang, để thâm nhập sâu hơn vào trong mạng lưới của tổ chức sở hữu ứng dụng web đang tấn công. Chúng ta xét một số phương pháp tấn công thông thường nhằm phục vụ hai mục đích trên bao gồm: vượt qua kiểm tra lúc đăng nhập (authorization bypass), sử câu lệnh SELECT, sử dụng câu lệnh INSERT, sử dụng các Stored-Procedures, sử dụng Blind SQL Injection, v.v. 3.1. Dạng tấn công vượt qua kiểm tra đăng nhập (Authorization bypass) Với dạng tấn công này, tin tặc có thể dễ dàng vượt qua các trang đăng nhập nhờ vào lỗi khi dùng các câu lệnh SQL thao tác trên cơ sở dữ liệu của ứng dụng web. Xét một ví dụ điển hình, thông thường để cho phép người dùng truy cập vào các trang web được bảo mật, hệ thống thường xây dựng trang đăng nhập để yêu cầu người dùng
nhập thông tin về tên đăng nhập và mật khẩu. Sau khi người dùng nhập thông tin vào, hệ thống sẽ kiểm tra tên đăng nhập và mật khẩu có hợp lệ hay không để quyết định cho phép hay từ chối thực hiện tiếp. Ví dụ, trong trường hợp sử dụng PHP, người ta có thể dùng 2 trang: 1 trang HTML để hiển thị Form nhập liệu và 1 trang PHP để xử lý thông tin nhập vào từ phía người dùng như sau:
private function User_Login(){ if(isset($_POST['Login'])){ $Username = $_POST['Username']; $Password = $_POST['Password'];
$Password = md5($Password); $sql = "SELECT * FROM `BQ_USERS` WHERE `USER_NAME` = '$Username' AND `USER_PASSWORD` = '$Password'"; $user = array(); $result = mysqli_query($this->conn, $sql); if($result -> num_rows > 0){ $user = mysqli_fetch_assoc($result); echo "You are logged in as " . $user['user_name']); }else{
23
echo "Invalid login!"; } } }
Nhìn qua, đoạn mã trong trang ExecuteLogin.php dường như không chứa bất cứ một lỗ hổng về an toàn nào. Người dùng không thể đăng nhập mà không có tên đăng nhập và mật khẩu hợp lệ. Tuy nhiên, đoạn mã này thực sự không an toàn và là tiền đề cho một lỗi SQL Injection. Đặc biệt, chỗ sơ hở nằm ở chỗ dữ liệu nhập vào từ người dùng được dùng để xây dựng trực tiếp câu lệnh SQL. Chính điều này cho phép những kẻ tấn công có thể điều khiển câu truy vấn sẽ được thực hiện. Ví dụ, nếu người dùng nhập chuỗi sau vào trong cả hai ô nhập liệu Username và Password của trang Login.htm là: 1' OR 1 = 1 # Hoặc 1' OR '1' = '1
Lúc này, câu truy vấn sẽ được gọi thực hiện là:
SELECT * FROM `BQ_USERS` WHERE `USER_NAME` = '1' OR 1=1 # ' AND `USER_PASSWORD` = '1' OR 1=1 #'
Hoặc: SELECT * FROM `BQ_USERS` WHERE `USER_NAME` = ' 1' OR '1' = '1' AND `USER_PASSWORD` = ' 1' OR '1' = '1'
Giá trị “1=1 Hoặc '1' = '1'” Là luôn đúng. Câu truy vấn này là hợp lệ và sẽ trả về tất cả các bản ghi của BQ_USERS và đoạn mã tiếp theo xử lý người dùng đăng nhập bất hợp pháp này như là người dùng đăng nhập hợp lệ.
24
3.2. Dạng tấn công Sử dụng câu lệnh SELECT Dạng tấn công này phức tạp hơn. Để thực hiện được kiểu tấn công này, kẻ tấn công phải có khả năng hiểu và lợi dụng các sơ hở trong các thông báo lỗi từ hệ thống để dò tìm các điểm yếu khởi đầu cho việc tấn công. Xét một ví dụ rất thường gặp trong các website về tin tức. Thông thường, sẽ có một trang nhận ID của tin cần hiển thị rồi sau đó truy vấn nội dung của tin có ID này. Ví dụ: />Mã nguồn cho chức năng này thường được viết khá đơn giản theo dạng: private function Get_News(){ $NewsID = $_GET['ID']; $sql = "SELECT * FROM `BQ_NEWS` WHERE `NEWSID` = $NewsID"; $result = mysqli_query($this->conn, $sql); ... } }
Trong các tình huống thông thường, đoạn mã này hiển thị nội dung của tin có ID
trùng với ID đã chỉ định và hầu như không thấy có lỗi. Tuy nhiên, giống như ví dụ đăng nhập ở trước, đoạn mã này để lộ sơ hở cho một lỗi SQL Injection khác. Kẻ tấn công có thể thay thế một ID hợp lệ bằng cách gán ID cho một giá trị khác, và từ đó, khởi đầu cho một cuộc tấn công bất hợp pháp. Ví dụ: Kẻ tấn công có thể thay thế URL với một giá trị khác như: OR 1=1 Câu truy vấn SQL lúc này sẽ trả về tất cả các article từ bảng dữ liệu vì nó sẽ thực hiện câu lệnh: SELECT * FROM `BQ_NEWS` WHERE `NEWSID` = 0 OR 1=1
Một trường hợp khác, ví dụ như trong các trang tìm kiếm. Các trang này cho phép người dùng nhập vào các thông tin tìm kiếm như Họ, Tên, v.v. Đoạn mã thường gặp là: 25