Loading
April 23, 2023By Harry Ha

Lỗ hổng SQL Injection

Lỗ hổng SQL Injection là gì?

Lỗ hổng SQL Injection là một kỹ thuật tấn công phổ biến trên các ứng dụng web, trong đó kẻ tấn công chèn các câu lệnh SQL độc hại vào các trường nhập liệu của ứng dụng, để có thể thực thi các lệnh SQL không mong muốn hoặc lấy thông tin từ cơ sở dữ liệu.

Kẻ tấn công thường sử dụng các chuỗi ký tự đặc biệt và câu lệnh SQL để lừa ứng dụng Web và hệ thống quản trị cơ sở dữ liệu (DBMS) của nó. Khi được chấp nhận, các chuỗi này có thể gây ra các tác động xấu, bao gồm:

  • Thực thi các lệnh SQL bất hợp pháp, như chèn thêm, cập nhật hoặc xóa dữ liệu trong cơ sở dữ liệu.
  • Truy cập và đánh cắp dữ liệu nhạy cảm từ cơ sở dữ liệu, như thông tin tài khoản người dùng hoặc thông tin thẻ tín dụng.
  • Thực thi lệnh hệ thống để tạo ra mã độc, Web Shell nhằm kiểm soát hệ thống.

Tại sao lại xuất hiện lỗ hổng SQL Injection

Trên tờ tạp chí của Hacker Zine Phrack số 54 phát hành đêm giáng sinh năm 1998, Hacker Jeff Forristal đã chia sẻ cho thế giới về một lỗ hổng mới có tên gọi “SQL Injection” . Thời điểm đó có rất nhiều ứng dụng Web của các tổ chức lớn trên thế giới sử dụng Microsoft SQL Server để lưu trữ và quản lý thông tin.

Mức độ nghiêm trọngRất nghiêm trọng
Tỷ lệ phát hiệnThường xuyên
Phạm viTất cả ứng dụng Desktop, Website, Mobile có sử dụng Cơ sở dữ liệu
Mức độ ảnh hưởngLàm rò rỉ thông tin trong cơ sở dữ liệu (Tính bí mật – Confidenttiality)

Thay đổi dữ liệu (Tính toàn vẹn – Integrity)

Từ chối dịch vụ (Tính sẵn sàng – Availability)
Hậu quả xấu nhấtChiếm quyền toàn bộ máy chủ
Khắc phục nhanhValidate dữ liệu nhập vào, sử dụng Prepared Statements hoặc Parameterized Queries trong lập trình

Trong quá trình lướt Web, Jeff vô tình phát hiện nếu tham số username mà anh ta nhập vào có chứa một dấu nháy đơn ở phía cuối tài khoản “admin'” thay vì tên đăng nhập là “admin” như bình thường thì màn hình sẽ xuất hiện thông báo lỗi Syntax Error.

Sau khi thực nghiệm nhiều lần, Jeff phát hiện đoạn mã làm nhiệm vụ truy vấn đăng nhập nối chuỗi username mà người dùng nhập vào với đoạn SQL được viết từ trước đó để tạo thành một câu truy vấn hoàn chỉnh. Tuy nhiên sau khi nối, câu truy vấn SQL đó lại không hợp lệ do bị thừa một dấu nháy đơn nên phía server-side không thể thực thi.

SELECT * FROM users WHERE username='admin'' AND password='cookie'

Khi lập trình SQL, người ta thường sử dụng dấu nháy đơn hoặc nháy kép để định nghĩa một chuỗi ký tự, ví dụ như: “Cookie Hân Hoan”, ‘Cookie Arena’, “Cookie’s Han Hoan”, ‘Cookie “Han Hoan”‘ hoặc ‘Cookie “Han Hoan’

Từ đây chúng ta có thể hiểu lỗ hổng SQL Injection một cách đơn giản là Inject (tiêm) vào một đoạn mã SQL chứ không phải một thứ ngôn ngữ nào khác. Để thông báo lỗi Syntax không còn xuất hiện, thì cái đoạn mã được thêm vào nó phải “ăn khớp” với câu lệnh phía trước cũng như phía sau để tạo thành một câu truy vấn SQL hoàn chỉnh thì backend mới có thể thực thi được. Còn thực thi những gì thì phụ thuộc rất nhiều vào mục đích của Hacker.

Ở ngoài thực tế, mọi thứ không bày sẵn ra trước mặt để bạn quan sát. Nên việc tấn công lúc này khó khăn hơn nhiều, vì chúng ta phải đoán (Fuzzing) xem câu lệnh phía trước và phía sau các lập trình viên họ viết gì. Để từ đó đưa các mã khai thác (Payload) sao cho hợp lý.

Việc phải đoán các câu truy vấn được gọi là phương pháp tấn công Blackbox. Còn có mã nguồn trong tay để phân tích được gọi là Whitebox.

Sức mạnh của Comment trong SQL Injection

Để nói về các cuộc tấn công SQL Injection, thì trên thế giới tồn tại hai kiểu người. Một là đoán ra bằng được câu truy vấn trước và sau đó viết gì để viết tiếp “cuộc đời” của lập trình viên. Người còn lại sẽ sử dụng lệnh Comment để vô hiệu hóa tất cả những câu lệnh phía sau.

Việc vô hiệu hóa các câu lệnh phía sau tưởng chừng đơn giản hơn rất nhiều, nhưng ở một số trường hợp đặc biệt thì nó lại gây ra tác hại vô cùng nghiêm trọng. Hãy tưởng tượng lỗ hổng nằm ở tham số password trong chức năng UPDATE mật khẩu.

UPDATE users SET password='Cooki3H@nHoan' WHERE username='admin'

Nếu chúng ta sử dụng payload ‘ — để khai thác với câu truy vấn trên thì toàn bộ tài khoản trong cơ sở dữ liệu sẽ bị đổi thành Cooki3H@nHoan.

UPDATE users SET password='Cooki3H@nHoan'-- ' WHERE username='admin'

Thao tác này vô tình làm ảnh hưởng tới toàn bộ dữ liệu của khách hàng, đối tác của chúng ta. Đây là một hành động gây hậu quả nghiêm trọng, và có thể đối mặt với các hình thức kỷ luật.

Chỉ sử dụng Comment trong SQL Injection khi bạn thực sự hiểu được ý nghĩa của câu truy vấn

Xem xét trường hợp dưới đây khi chúng ta sử dụng mã khai thác (Payload) là ‘ OR 1=1’– . Nó sẽ tìm kiếm trong bảng UsersUSERNAME NÀO RỖNG KHÔNG? Nếu không có thì KIỂM TRA MỘT CÓ BẰNG MỘT KHÔNG? Tất nhiên điều kiện này luôn đúng và dấu Comment phía sau sẽ loại bỏ luôn điều kiện VÀ MẬT KHẨU PHẢI LÀ COOKIE

Sử dụng câu lệnh LIMIT để giới hạn dữ liệu trả về

Sau khi thực thi, kết quả trả về sẽ là toàn bộ danh sách username và mật khẩu trong bảng Users. Nếu bạn chỉ muốn lấy một giá trị Hazy trả về thì sử dụng toán tử LIMIT. Payload lúc này sẽ là ‘ OR 1=1 LIMIT 1,1–

Miêu tả liệu được lấy ra và tinh gọn như thế nào thông qua các câu lệnh SQL

SQL Injection là một kiểu tấn công của Hacker nhắm vào các trang Web, phần mềm, ứng dụng di động có sử dụng cơ sở dữ liệu. Nhằm mục đích làm rò rỉ thông tin, đánh cắp, xóa hoặc chiếm quyền quản trị ứng dụng.

Quay trở lại bài viết của Jeff, đó như một món quà chất lượng cho giới bảo mật. Ngay sau đó chúng ta chứng kiến rất nhiều các cuộc tấn công vào các trang Web thông qua lỗ hổng SQL Injection để đánh cắp thẻ tín dụng, tài khoản ngân hàng, thông tin cá nhân (Personally Identifiable Information – PII). Thậm chí, nhiều cuộc tấn công đã lợi dụng SQL Injection để tạo ra các mã độc, chiếm quyền điều khiển máy chủ hoặc lợi dụng các câu truy vấn SQL Heavy Query để tấn công từ chối dịch vụ.

Đã 25 năm trôi qua, tổ chức OWASP và các sàn săn lỗi lấy tiền thưởng (Bug Bounty) như Hacker One, Synack, BugCrowd,.. vẫn đánh giá SQL Injection là một trong Top 10 lỗ hổng phổ biến nhất trên thế giới.

Để trở thành một Hacker tập sự hãy vượt qua hệ thống mô phỏng mà chúng mình đã chuẩn bị cho bạn. Tìm cách đăng nhập với tài khoản admin, lấy và submit FLAG (Một thông điệp bí mật của tổ chức) để thăng hạng nhé


Simple SQL Injection Bypass Login

Mức độ: Rất dễ

Bạn chỉ thể đăng nhập tài khoản và mật khẩu là “guest:guest”. Bạn không thể đoán được mật khẩu của admin. Hãy tìm cách đăng nhập với tài khoản admin để lấy được thông điệp bí mật.


Có rất nhiều cách để tìm kiếm và khai thác lỗ hổng này, tuy nhiên theo quan sát từ các hiện tượng (dấu hiệu nhận biết) và cách khai thác mà các Hacker chia SQL Injection thành 3 loại khác nhau:

  • SQL Injection In-band – Cách khai thác dễ. Dữ liệu trả về được quan sát đầy đủ, rõ ràng.
  • SQL Injection Inferential (Blind) – Cách khai thác khó. Dữ liệu trả về chỉ trả về hai dạng True/ False. Giống thầy bói xem voi
  • SQL Injection Out of band (OOB SQLi) – Cách khai thác khó. Dữ liệu trả về không quan sát được, phải nhờ một thế lực khác bên ngoài để nhận dữ liệu

Mọi người đón đọc ở các bài viết sau nhé!

Harry Ha

Whitehat hacker, Founder at Cookie Hân Hoan, Co-founder at CyRadar, Senior Penetration Tester, OSCP, CPENT, LPT, Pentest+

svg

What do you think?

It is nice to know your opinion. Leave a comment.

3 Comments:

  • k0 fai Jay

    April 23, 2023 / at 10:26 pmsvgReply

    Húuuu

  • bluechip

    April 24, 2023 / at 3:43 pmsvgReply

    Rất xinh đẹp, tuyệt vời. Xin cảm ơn.

  • Zw33

    April 26, 2023 / at 3:35 pmsvgReply

    Quá xịn lun :3

Leave a reply