Penetration Testing Step 3 – Các thể loại SQL injection phổ biến (Part 2)

Tiếp theo nội dung Penetration Testing Step 3 – Các thể loại SQL injection phổ biến (Part 1), kỳ này tôi sẽ chiến tiếp thể loại tiếp theo của SQL injectionUnion Attack.

Lưu ý: Nội dung liên quan đến Union Attack tương đối phức tạp hơn so với đám Retrieving hidden data Subverting application logic tôi giới thiệu trong kỳ trước. Do vậy, tôi sẽ dành kỳ này để bàn về nguyên lý của Union Attack trước khi động chạm vô phần demo minh họa.

#1. Điều kiện để có một sự vụ Union attack thành công

Nhắc lại, với Union attack này, bạn sẽ có thể truy cập dữ liệu từ nhiều bảng khác nhau của database với từ khóa UNION. Cụ thể hơn, với tình huống kết quả SQL query trả về trong response thì bạn có thể khai thác lỗ hổng SQL injection để hốt dữ liệu từ các bảng khác trong databases thông qua việc sử dụng từ khóa UNION.

Với UNION, bạn có thể thực thi thêm các Select query khác rồi kẹp dữ liệu vào cái query ban đầu. Ví dụ đơn giản như sau:

SELECT a, b FROM table1 UNION SELECT c, d FROM table2

Lúc này ứng dụng sẽ trả về cho bạn thông tin cột a, b từ table1 và cột c, d từ table2.

Union attack
Union attack

Nguồn: portswigger.net

Tuy nhiên, cần lưu ý, không phải lúc nào bạn của múc hàng về với UNION được cả. Để việc chấm mút với Union attack trôi chảy, bạn cần đảm bảo 2 điều kiện:

  • Các query đơn lẻ phải trả về kết quả có cùng số cột;
  • Dạng dữ liệu trong từng cột của các query phải tương tích với nhau.

#2. Xác định số cột yêu cầu cho SQL injection Union attack

Để xác định số cột yêu cầu cho Union attack, bạn có 2 cách để xác định là sử dụng ORDER BY hoặc UNION SELECT.

#2.1 Xác định số cột với ORDER BY

Với ORDER BY, bạn sẽ chơi kiểu tăng dần column index cho đến khi phát sinh lỗi. Cụ thể, với WHERE clause, bạn có lần lượt đút vào ORDER BY 1--, ORDER BY 2--, ORDER BY 3--,

Với cách này bạn có thể mặc kệ sự đời, không cần biết tên của các column mà vẫn có thể query ầm ầm. Khi column index vượt số cột thực tế, bạn sẽ có thể thấy thông báo lỗi kiểu như

The ORDER BY position number 3 is out of range of the number of items in the select list.

(Tạm dịch là query yêu cầu vượt số lượng item truy xuất được từ database)

Tuy nhiên, nếu ứng dụng xử lý chuẩn, bạn sẽ chỉ nhận được các thông báo chung chung. Lúc này, bạn lại phải nai lưng ra mà thử nghiệm để quan sát các sai khác có thể có trong response để đánh giá tiếp.

#2.2 Xác định số cột với UNION SELECT

Với cách thứ 2, bạn sẽ quất hàng loạt UNION SELECT payload với một dãy các giá trị NULL có số lượng khác nhau. Ví dụ:

' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--
etc.

Lúc này, nếu số NULL không khớp số cột, database có thể trả về thông báo lỗi kiểu như:

All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

(Tạm dịch là các query chơi giao lưu phối hợp với đám UNION/INTERSECT/EXCEPT phải có số lượng expression bằng nhau)

Cũng giống như trên, nếu ứng dụng xử lý chuẩn, bạn sẽ chỉ nhận được các thông báo chung chung (hoặc chẳng báo mịa gì cả). Bạn cũng có thể chơi kiểu thử – sai cho đến khi số NULL khớp số cột thì database sẽ trả thêm dòng (toàn giá trị NULL) bổ sung vào kết quả. Còn nếu không ăn hên được thì bạn cũng lại phải nai lưng ra mà thử nghiệm để quan sát các sai khác có thể có trong response để đánh giá tiếp.

Lưu ý:

  • Như tôi nói ở trên, dữ liệu từ các cột của cái query ban đầu và query UNION phải tương thích với nhau. Vì NULL có thể chuyển đổi sang các dạng dữ liệu phổ biến khác nên sẽ tăng khả năng thành công.
  • Với Oracle database, mỗi SELECT query phải sử dụng thêm từ khóa FROM và chỉ định một bảng hiện hữu. Do Oracle có tồn tại một bảng dạng hàng dựng sẵn có tên là dual nên bạn có thể tận dụng thằng này để phục vụ mưu đồ. Cụ thể cái query cho Oracle có thể kiểu như sau: ' UNION SELECT NULL FROM DUAL--

Ngoài ra, bạn cũng cần lưu ý, trong MySQL, cái double-dash sequence để comment phải đi kèm theo một khoảng trắng. Hoặc bạn có thể dùng hash character để thay thế. Chi tiết về phương thức comment cho các dạng database phổ biến được tóm lược như sau:

Comments for DBs
Comments for DBs

Nguồn: portswigger.net

#3. Xác định dạng dữ liệu của các cột cho SQL injection Union attack

Vì mục tiêu tấn công là trích xuất thông tin dạng string nên trong SQL injection UNION attack nên bạn sẽ cần tìm ít nhất một cột có dạng dữ liệu tương thích với string data.

Với Bước 1 – Xác định số cột yêu cầu cho SQL injection Union attack, bạn đã xác định được số cột cần thiết. Tiếp theo, bạn cần thăm dò từng cột để xác định xem nó chứa dữ liệu dạng string hay không bằng cách tung ra hàng loạt payload UNION SELECT có đặt một string value vào mỗi cột. Ví dụ nếu query trả về 4 cột, bạn có thể gửi kiểu như sau:

' UNION SELECT 'a',NULL,NULL,NULL--
' UNION SELECT NULL,'a',NULL,NULL--
' UNION SELECT NULL,NULL,'a',NULL--
' UNION SELECT NULL,NULL,NULL,'a'--

Lúc này, nếu dạng dữ liệu của một cột không tương thích với string thì database có thể trả về cho bạn error kiểu như:

Conversion failed when converting the varchar value ‘a’ to data type int.

(Tạm dịch là quá trình chuyển đổi dữ liệu kiểu ký tự sang dạng số nguyên bị lỗi)

Và cũng như trên, nếu ứng dụng che chắn tốt để không phọt ra error cụ thể thì bạn có thể nghiên cứu các sai khác trong response để phân tích cầu may.

Rồi, đến đây là tôi chém gió xong cái nguyên lý của Union attack rồi đấy. Nếu đến đây bạn vẫn thấy mơ hồ thì cũng không sao. Các kỳ tới tôi sẽ chuyển qua phần demo mình họa để làm rõ các nội dung này.

1 thought on “Penetration Testing Step 3 – Các thể loại SQL injection phổ biến (Part 2)”

Leave a Reply

Your email address will not be published. Required fields are marked *