Lỗ hổng web: kỹ thuật SQL Injection
**1. Khái niệm ** Sql Injection (SQLi) 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ó ...
**1. Khái niệm **
Sql Injection (SQLi) 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, thêm, sửa, xóa… trên cơ sở dữ liệu của ứng dụng. 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...
2. Hướng khai thác
- Thông qua “user input”
User input điển hình thường đến từ các form nhập liệu, form search hay link… Những dữ liệu này được web browser gửi đến server thông qua phương thức HTTP GET hay POST và trở thành các tham số cho ứng dụng web truy cập tới cơ sở dữ liệu.
Một trường hợp phổ biến trong kỹ thuật tấn công Sql Injection, khi người dùng request một tài liệu mà các tham số của nó được truyền qua url (như ở ảnh minh họa bên dưới, tham số id được truyền qua url theo phương thức HTTP GET). Khi nhận được request, ứng dụng web tìm trong cơ sở dữ liệu và trả về cho người dùng bài viết có id=31.
- Thông qua cookies
Cookies là những tệp tin lưu trữ thông tin trạng thái của người dùng khi truy cập các ứng dụng web. Những thông tin này do người lập trình quyết định, được tạo ra ở server và lưu trữ tại client. Khi người dùng truy cập lại ứng dụng web, cookies được browser gửi lên server giúp phục hồi lại những trạng thái của người dùng trong lần truy cập trước đó. Ở một số ứng dụng web thương mại, cookies còn được lưu trữ những sở thích của người dùng, khi đó ứng dụng web sẽ sử dụng cookies để đưa ra những gợi ý tốt nhất cho người dùng khi mua sản phẩm. Do được lưu trữ ở client nên người dùng có thể chỉnh sửa tùy ý, vì vậy nếu ứng dụng web sử dụng những thông tin lưu trong cookies để xây dựng các truy vấn tới cơ sở dữ liệu thì hacker hoàn toàn có thể chèn vào cookies những script sql để thực hiện một cuộc tấn công Sql Injection.
- Thông qua các biến server
Biến server có thể là một khái niệm tương đối lạ lẫm nhưng nó không hề mới. Một số ví dụ của biến server là Http header, Network header… Không phổ biến lắm nhưng các giá trị được lưu trong biến server có thể được ứng dụng web sử dụng như trong việc logging truy cập hay thống kê truy cập theo user agent… Những công việc này đều có sự tương tác với cơ sở dữ liệu nên các hacker hoàn toàn có thể sử dụng các biến server trong việc khai thác Sql Injection. Các addon của firefox hỗ trợ rất tốt những việc này, Tamper Data hay Live HTTP headers có thể giúp chúng ta bắt những request gửi từ client lên web server, từ đó chúng ta có thể dễ dàng thay đổi các biến server (http header…) trước khi gửi chúng tới server.
Tamper Data
Live HTTP headers
3. Các kỹ thuật khai thác
Boolean based và Time based Blind SQL injection
Boolean based: Cơ sở của kỹ thuật này là việc so sánh đúng sai để tìm ra từng ký tự của những thông tin như tên bảng, tên cột… Do đó, với dải giá trị chữ số, chữ cái (bao gồm cả hoa, thường), và một số ký tự đặc biệt, việc so khớp trở nên rất khó khăn và đòi hỏi nhiều thời gian. Do đó việc khai thác lỗi chủ yếu được tiến hành bằng tools.
id = 1 and ascii(mid((query),position,1)) >? --
Time based: Giống như boolean based attacks chỉ khác nhau về cách suy diễn, nó dựa thời gian xử lý của cơ sở dữ liệu sau đó trả về kết quả để xác định câu truy vấn Sql thực hiện thành công.
id = 1 and ASCII(SUBSTRING((select top 1 name from User),1,1)) > X WAITFOR 5 --
Union query based
Đây là phương pháp phổ biến khi khai thác Sql injection. Cơ sở của nó là sử dụng từ khóa union để gộp các kết quả của các mệnh đề select, qua đó lấy được thông tin từ cơ sở dữ liệu.
Batched query
Đây là phương pháp áp dụng khả năng thực thi cùng lúc nhiều câu lệnh Sql của một số hệ quản trị cơ sở dữ liệu và khả năng hỗ trợ của ngôn ngữ lập trình. Phương pháp này rất mạnh mẽ và gây nguy hiểm ngay với hệ thống. Bằng cách thêm vào một dòng lệnh Update, Insert hay Delete, dữ liệu trong cơ sở dữ liệu của ứng dụng web không còn toàn vẹn nữa.
Chúng ta có thể chèn vào câu lệnh Sql như sau để xóa 1 bảng trong cơ sở dữ liệu:
id = 1; delete tableName; --
Order by clause
Không giống như các phương pháp trên, nội dung inject nằm trong mệnh đề điều kiện where. Trong phương pháp này, chúng ta sẽ cố gắng tiêm mã script vào mệnh đề order.
Chúng ta hãy xem đến một kịch bản sau: Người lập trình muốn liệt kế sản phẩm của công ty bao gồm các thông tin: Mã sản phẩm, Tên sản phầm, Ngày tháng… và có chức năng cho pháp người dùng tủy chỉnh xem họ muốn sắp xếp theo thứ tự ngày tháng, theo tên hay mã của sản phẩm.
Câu truy vấn được xây dựng như sau:
select pId, pTime, pName from Products where [somewhat] order by $varOrder
Trong trường hợp này chúng ta không thể thêm trực tiếp một mệnh đề sub select thông qua từ khóa union như mọi khi được. Một cách khai thác đó là sử dụng BATCHED QUERY hoặc có thể tham khảo cách sau:
select pId, pTime, pName from Products where [somewhat] order by (case when (select ascii(substring(password,1,1)) from Users where username = "hanhnhb") = 48 then pId else pTime end );
Tham khảo
-
http://en.wikipedia.org/wiki/SQL_injection
-
https://www.owasp.org/index.php/SQL_Injection