Tìm hiểu về Security Testing (Phần 2)
Bài đăng này đã không được cập nhật trong 4 năm
Qua phần 1 của series bài viết, chắc hẳn mọi người đã có cái nhìn tổng quan về kiểm thử bảo mật và tầm quan trọng của nó. Tiếp theo chúng mình cùng đi vào phân tích từng lỗ hổng để hiểu rõ hơn cách tấn công, cách nhận biết và phòng tránh qua "lăng kính" của tester.
Trong tất cả các cuộc tấn công nhằm vào website, tấn công SQL Injection là một trong những loại nguy hiểm và phổ biến nhất, nó đã gây ra những thiệt hại đáng kể cho nhiều doanh nghiệp và tổ chức trong những năm qua.
1. 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 của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất hợp pháp. SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác, delete, insert, update, v.v. trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy. SQL injection thường được biết đến như là một vật trung gian tấn công trên các ứng dụng web có dữ liệu được quản lý bằng các hệ quản trị cơ sở dữ liệu như SQL Server, MySQL, Oracle, DB2, Sysbase...
2. Nguyên nhân
a. Không kiểm tra dữ liệu đầu vào
Vì một lý do nào đó mà dev không validate kỹ dữ liệu đầu vào trên các form (đăng nhập, biểu mẫu,...):
- Kiểu dữ liệu (int, string, boolean, ...)
- Các ký tự chặn nhập (-- ; ' ' ...)
- Maxlength
- ...
Điều này tạo cơ hội cho kẻ tấn công chèn các đoạn dữ liệu làm sai lệch câu lệnh truy vấn của hệ thống.
Ví dụ:
Ta có câu truy vấn sau:
sql = "SELECT * FROM users WHERE id = '$userId'";
Mục đích của câu truy vấn này là tìm trong bảng users những bản ghi mà trường id có giá trị bằng với tham số userId đã truyền vào.
Giả sử người dùng không nhập vào một số mà nhập vào chuỗi ký tự: 1;DROP TABLE users
. Câu truy vấn hoàn chỉnh sẽ là:
SELECT * FROM users WHERE id = 1;DROP TABLE users;
Do không có hàm kiểm tra dữ liệu phải là kiểu số nên hệ thống sẽ thực thi câu lệnh xóa bảng users trong CSDL.
b. Không mã hóa ký tự đầu vào
Không mã hóa các ký tự đặc biệt được nhập vào từ các textbox, địa chỉ url:
- Ký tự mở đầu và kết thúc chuỗi ( ' ' )
- Comment ( -- )
- Ký tự kết thúc câu truy vấn ( ; )
- ...
Ví dụ:
Ta có câu truy vấn sau:
sql = "SELECT * FROM users WHERE name = '$userName'";
Mục đích của câu truy vấn này là tìm trong bảng users những bản ghi mà trường name có giá trị bằng với tham số userName đã truyền vào.
Giả sử người dùng truyền vào tham số userName có giá trị: somename' or '1'='1
. Câu truy vấn hoàn chỉnh sẽ là:
SELECT * FROM users WHERE name = 'somename' or '1'='1';
Như vậy, thay vì trả về kết quả của một bản ghi mong muốn, câu truy vấn này trả về kết quả là toàn bộ dữ liệu của bảng users, dữ liệu của hệ thống đã bị lộ.
3. Cách nhận biết
Cách kiểm tra SQL Injection tương đối đơn giản. Nhập các ký tự / chuỗi ký tự bất thường vào các ô textbox hoặc địa chỉ url:
- Dấu nháy đơn, nháy kép
' or 1=1--
' or 'a'='a
') or ('a'='a
- ...
Nếu trả về bất kỳ thông báo bất thường nào thì khả năng tồn tại lỗ hổng sql injection là rất cao như Internal Server Error, trả về một trang trống, không trả về thông báo thành công/lỗi hoặc thông báo thành công với mã độc hại.
Các phần thường bị tấn công SQL Injection nhiều nhất trong hệ thống là login, search, comment, link,...
4. Cách phòng tránh
Hiện nay hầu hết các hệ thống đều sử dụng framework thay vì SQL thuần, các framework này đã được test rất kỹ để hạn chế bị tấn công SQL Injection. Tuy nhiên, để bảo vệ hệ thống, chúng ta vẫn cần thực hiện các biện pháp sau:
- Validate dữ liệu đầu vào, escape (mã hóa)
- Phân quyền rõ ràng trong database
- Tránh thông báo lỗi có chứa chi tiết thông tin, vị trí xảy ra lỗi
- Backup dữ liệu thường xuyên
- Hạn chế sử dụng select (*), chỉ lấy ra các trường cần sử dụng
5. Tool SQLMap
a. Giới thiệu
SQLMAP là công cụ khai thác những lổ hỏng của cơ sở dữ liệu SQL. Công cụ này được xem là công cụ khai thác SQL tốt nhất hiện nay. Được giới bảo mật và giới hacker sử dụng thường xuyên. Với người dùng Kali hoặc Back Track 5 thì SQLMap đã được tích hợp sẵn vào hệ điều hành. Riêng Windows thì chúng ta phải cài đặt thêm Python và SQLMap để sử dụng.
b. Download và cài đặt
- Link tải python: https://www.python.org/downloads/
- Link tải SQLMap: http://sqlmap.org/
- Tiến hành cài đặt Python
- Mở thư mục SQLmap mới download và giải nén, đổi tên thành sqlmap rồi copy vào thư mục C:\Python
c. Cách sử dụng
Bước 1: Kiểm tra URL
Truy cập vào ứng dụng web cần test (Ví dụ: http://testphp.vulnweb.com/listproducts.php?cat=1) và kiểm tra các lỗi xem có khả năng tấn công dựa vào nó được không. Với các tham số được truyền vào như index.php?id=21 , index.asp?id=6,.. thì chúng ta chỉ cần thêm các kí tự dấu nháy đơn ('), dấu nháy kép ("), phần trăm 27 (%27), 00 phần trăm (00%) ...vào sau id để kiểm tra, nếu nó hiện ra lỗi khác hoàn toàn với lúc ban đầu thì có khả năng khai thác được lỗi này.
Ví dụ:
Bước 2: Lấy thông tin về database
Mở command lên và gõ lệnh: sqlmap.py -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs
Mục đích là để chúng ta có thể biết được các thông tin liên quan đến database.
Bước 3: Khai thác các table
Gõ tiếp lệnh sau: sqlmap.py -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables
Trong đó:
-
-D : chọn database để thao tác
-
--tables : Liệt kê các tables có trong database được chọn.
Sau khi chạy lệnh ta thu được thông tin database như hình sau:
Bước 4: Lấy danh sách các columns trong các tables của database
Ví dụ trường hợp này chúng ta sẽ check các cột trong bảng users. Chạy lệnh sau:
sqlmap.py -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T users --columns
Trong đó:
-
-T : Chọn table để thao tác
-
--columns : Liệt kê columns có trong table được chọn.
Kết quả trả về, chúng ta biết được thông tin các column trong bảng users.
Bước 5: Cách dump dữ liệu đã lấy được ra mặc định thành file CSV để tiện sử dụng
Ví dụ chúng ta cần lấy các trường là email, name, uname, pass thì dùng lệnh sau:
sqlmap.py -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T users -C email,name,uname,pass --dump
File dữ liệu ngay lập tức sẽ được xuất ra dưới dạng CSV , SQLmap sau khi chạy xong sẽ in ra màn hình đường link tới file CSV này.
d. Ưu và nhược điểm của tool
Ưu điểm:
- Chạy trên nhiều nền tảng
- Dễ dàng khai thác lỗ hỏng SQL injection trên ứng dụng web
- Hỗ trợ hầu hết các hệ CSDL phổ biến : MySQL, ORacle, SQL server, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB, HSQLDB và Informix...
- Hỗ trợ việc liệt kê người dùng, mật khẩu (pass hash), cơ sở dữ liệu, bảng và cột
- Hỗ trợ tìm kiếm tên csdl cụ thể, bảng cụ thể. Nó tự động phân tích câu truy vấn, xác định kỹ thuật nào phù hợp nhất
- Cung cấp Full quyền điều khiển cơ sở dữ liệu khi xâm nhập thành công.
- Cho phép kết nối trực tiếp tới cơ sở dữ liệu mà không cần truyền qua SQL injection.
Nhược điểm:
- Giao diện người dùng không có nên việc tìm hiểu và sử dụng sẽ hơi khó cho người mới.
Tài liệu tham khảo:
https://vi.wikipedia.org/wiki/SQL_injection
https://whitehat.vn/threads/tim-hieu-ve-sql-injection-va-cach-phong-chong.11591/
All rights reserved