SQLi: Tiêm tấn công
SQL injection là gì?
SQLi là một loại tấn công trong ứng dụng dựa trên web, nơi kẻ tấn công có thể chạy các truy vấn độc hại trong cơ sở dữ liệu của trang web. SQL là một kỹ thuật chèn mã được sử dụng để thực thi các câu lệnh SQL độc hại.
Ví dụ: nếu bạn muốn đăng nhập vào trang web và bạn quên tên người dùng và mật khẩu, bằng cách sử dụng SQLi injection, chúng tôi có thể đăng nhập hoặc truy cập trang web mà không cần biết mật khẩu.
SQL injection hoạt động như thế nào?
SQL injection bao gồm chèn hoặc chèn truy vấn SQL thông qua dữ liệu đầu vào từ máy khách trong ứng dụng. Chúng được đưa vào mặt phẳng dữ liệu ảnh hưởng đến các lệnh SQL được xác định trước.
Các cuộc tấn công SQL injection nhắm vào các lỗ hổng trong các câu lệnh SQL động. Hãy nghĩ về một câu lệnh SQL động giống như một hàm toán học đa biến có các tham số được cố định trong khi kết quả được xác định bởi các giá trị được đặt trong các biến độc lập.
Tương tự, một câu lệnh SQL động cũng bao gồm một bộ tham số được xác định trước (chẳng hạn như biểu mẫu web) và câu lệnh đầy đủ chỉ được tạo khi người dùng cung cấp đầu vào.
Xem ví dụ sau về câu lệnh SQL của biểu mẫu đăng nhập:
SELECT * FROM users WHERE username = '$username' AND password = bcrypt ('$password')
Nếu tồn tại lỗ hổng bảo mật trong câu lệnh SQL động, kẻ tấn công có thể nhập tập lệnh phức tạp trong một biểu mẫu để làm hỏng các tham số hiện có và thay đổi ý nghĩa của toàn bộ câu lệnh.
Các loại SQL injection:
In-band SQLi: In-band SQL injection là một loại SQL injection trong đó kẻ tấn công nhận được kết quả dưới dạng phản hồi trực tiếp thông qua cùng một kênh liên lạc. Ví dụ: nếu kẻ tấn công thực hiện cuộc tấn công theo cách thủ công thông qua trình duyệt web của cô ấy, thì kết quả của cuộc tấn công sẽ được hiển thị trong cùng trình duyệt web của cô ấy. In-band SQL injection còn được gọi là SQL injection truyền thống.
Lỗi tiêm SQL dựa trên lỗi — Tại đây, kẻ tấn công thực hiện một số hành động nhất định khiến cơ sở dữ liệu tạo thông báo lỗi. Bạn có thể sử dụng thông báo lỗi để xác định cơ sở dữ liệu nào đang được sử dụng, phiên bản máy chủ mà trình xử lý đang sử dụng, v.v.
Union-Based SQL injection — Một câu lệnh được cơ sở dữ liệu tạo ra để nhận một phản hồi HTTP duy nhất. Bạn có thể xây dựng truy vấn trong URL hoặc kết hợp nhiều câu lệnh trong trường nhập liệu để thử tạo câu trả lời
Blind SQLi : Blind SQL injection là một kiểu SQL injection trong đó kẻ tấn công không nhận được phản hồi rõ ràng từ cơ sở dữ liệu bị tấn công mà thay vào đó quan sát hành vi của máy chủ cơ sở dữ liệu và ứng dụng để tái tạo lại cấu trúc cơ sở dữ liệu theo từng bước. Blind SQL injection còn được gọi là SQL injection suy luận.
Dựa trên Boolean — Tại đây, kẻ tấn công gửi truy vấn SQL đến cơ sở dữ liệu và yêu cầu ứng dụng trả về các kết quả khác nhau tùy thuộc vào việc truy vấn trả về Đúng hay Sai.
Dựa trên thời gian — Trong cuộc tấn công này, kẻ tấn công gửi truy vấn SQL tới cơ sở dữ liệu và khiến cơ sở dữ liệu đợi một khoảng thời gian xác định trước khi chia sẻ kết quả. Thời gian phản hồi giúp kẻ tấn công xác định xem một truy vấn là đúng hay sai.
Out-of-Band SQLi: Out-of-Band SQL Injection (OOB SQLi) là một kiểu SQL injection trong đó kẻ tấn công không nhận được phản hồi từ ứng dụng bị tấn công qua cùng một kênh liên lạc, nhưng có thể bị lừa gửi dữ liệu đến một điểm cuối từ xa do kẻ tấn công kiểm soát. Chỉ có thể chèn SQL ngoài băng tần nếu máy chủ bạn đang sử dụng có các lệnh kích hoạt các yêu cầu DNS hoặc HTTP. Tuy nhiên, điều này áp dụng cho tất cả các máy chủ SQL phổ biến.
Ví dụ về SQLi
Ví dụ đầu tiên rất đơn giản. Nó cho thấy cách kẻ tấn công có thể sử dụng lỗ hổng SQL Injection để đi vòng quanh bảo mật ứng dụng và xác thực với tư cách là quản trị viên.
Tập lệnh sau đây là mã giả được thực thi trên máy chủ web. Đây là một ví dụ đơn giản về xác thực bằng tên người dùng và mật khẩu. Cơ sở dữ liệu ví dụ có một bảng được đặt tên usersvới các cột sau: usernamevà password.
# Define POST variables
uname = request.POST['username']
passwd = request.POST['password']
# SQL query vulnerable to SQLi
sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”
# Execute the SQL statement
database.execute(sql)
password' OR 1=1
SELECT id FROM users WHERE username='username' AND password='password' OR 1=1'
-- MySQL, MSSQL, Oracle, PostgreSQL, SQLite
' OR '1'='1' --
' OR '1'='1' /*
-- MySQL
' OR '1'='1' #
-- Access (using null characters)
' OR '1'='1' %00
' OR '1'='1' %16
Các tổ chức có thể áp dụng các chính sách sau để bảo vệ chống lại các cuộc tấn công SQL injection.
- Không bao giờ tin tưởng đầu vào của người dùng. Chúng phải luôn được làm sạch trước khi sử dụng chúng trong các câu lệnh SQL động.
Các thủ tục được lưu trữ — Cho phép bạn đóng gói các câu lệnh SQL và coi tất cả các đầu vào là các tham số. - Báo cáo đã chuẩn bị — Các câu lệnh đã chuẩn bị hoạt động bằng cách xây dựng một câu lệnh SQL trước rồi xử lý dữ liệu người dùng đã gửi dưới dạng tham số. Điều này không ảnh hưởng đến cú pháp của câu lệnh SQL.
Biểu thức chính quy — có thể được sử dụng để phát hiện mã độc tiềm ẩn và loại bỏ mã đó trước khi câu lệnh SQL được thực thi. - Quyền của người dùng kết nối cơ sở dữ liệu — Tài khoản được sử dụng để kết nối với cơ sở dữ liệu chỉ được cấp các quyền cần thiết. Điều này giúp giảm hiệu suất của các câu lệnh SQL trên máy chủ.
- Thông báo lỗi — Những thông báo này không tiết lộ thông tin nhạy cảm hoặc vị trí chính xác của lỗi. “Xin lỗi, đã xảy ra lỗi kỹ thuật. Tôi đã liên hệ với đội kỹ thuật. Hãy thử lại sau” thay vì hiển thị câu lệnh SQL gây ra lỗi.
Đây chính xác là những gì tường lửa ứng dụng web (WAF) thực hiện. Phân tích tất cả thông tin người dùng nhập vào ứng dụng web của bạn để tìm các kết quả khớp với mã đáng ngờ.
Chúng tôi hy vọng bạn hiểu sự so sánh và rõ ràng với các khái niệm.
Để lại bình luận và chia sẻ suy nghĩ của bạn !!
của tác giả:
Akash Shekhavat,Madhuri Shelke,Chetan Shinde,Swarali Sole
Người giới thiệu:
https://learn.microsoft.com/en-us/sql/relational-databases/security/sql-injection?view=sql-server-ver16
https://systemweakness.com/sql-injection-attacks-53e942aae1f8
https://qawerk.com/blog/what-is-sql-injection/
https://brightsec.com/blog/sql-injection-attack/

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































