Trang chủ Dạy và họcBảo Mật UNION attack trong SQli

UNION attack trong SQli

Bởi Lê Huy

Khi một ứng dụng dễ bị tấn công bởi SQLi và kết quả của truy vấn được trả về trong phản hồi của ứng dụng, bạn có thể sử dụng từ UNION khóa để truy xuất dữ liệu từ các bảng khác trong cơ sở dữ liệu. Điều này thường được gọi là cuộc tấn công UNION tiêm SQL.

Từ UNION khóa cho phép bạn thực hiện một hoặc nhiều SELECT truy vấn bổ sung và nối kết quả vào truy vấn ban đầu.

Ví dụ:

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

				
			
Truy vấn SQL này trả về một tập kết quả duy nhất có hai cột, chứa các giá trị từ các cột a b in table1 và các cột cd trong table2. Để một UNION truy vấn hoạt động, phải đáp ứng hai yêu cầu chính:
  • Các truy vấn riêng lẻ phải trả về cùng số cột.
  • Các kiểu dữ liệu trong mỗi cột phải tương thích giữa các truy vấn riêng lẻ.
Để thực hiện cuộc tấn công UNION tiêm SQL, hãy đảm bảo rằng cuộc tấn công của bạn đáp ứng hai yêu cầu này. Điều này thường liên quan đến việc tìm hiểu:
  • Có bao nhiêu cột được trả về từ truy vấn ban đầu.
  • Những cột được trả về từ truy vấn ban đầu thuộc loại dữ liệu phù hợp để chứa kết quả từ truy vấn được chèn.

1.Xác định số cột cần thiết:

Khi bạn thực hiện một cuộc tấn công UNION chèn SQL, có hai phương pháp hiệu quả để xác định số lượng cột được trả về từ truy vấn ban đầu. Một phương pháp liên quan đến việc đưa vào một loạt mệnh đề ORDER BY và tăng chỉ số cột được chỉ định cho đến khi xảy ra lỗi. Ví dụ: nếu điểm chèn là một chuỗi được trích dẫn trong mệnh đề WHEREcủa truy vấn ban đầu, bạn sẽ gửi:
				
					' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--
etc.
				
			
Chuỗi tải trọng này sửa đổi truy vấn ban đầu để sắp xếp kết quả theo các cột khác nhau trong tập kết quả. Cột trong mệnh đề ORDER BYcó thể được chỉ định bằng chỉ mục của nó, do đó bạn không cần biết tên của bất kỳ cột nào. Khi chỉ mục cột được chỉ định vượt quá số cột thực tế trong tập kết quả, cơ sở dữ liệu sẽ trả về lỗi, chẳng hạn như:
				
					The ORDER BY position number 3 is out of range of the number of items in the select list.

				
			
Ứng dụng thực sự có thể trả về lỗi cơ sở dữ liệu trong phản hồi HTTP của nó, nhưng nó cũng có thể đưa ra phản hồi lỗi chung. Trong các trường hợp khác, nó có thể không trả lại kết quả nào cả. Dù bằng cách nào, miễn là bạn có thể phát hiện ra một số khác biệt trong phản hồi, bạn có thể suy ra số lượng cột được trả về từ truy vấn. Phương pháp thứ hai liên quan đến việc gửi một loạt tải trọng UNION S3LECT chỉ định một số giá trị null khác nhau:
				
					' UNION S3LECT NULL--
' UNION S3LECT NULL,NULL--
' UNION S3LECT NULL,NULL,NULL--
etc.
				
			

Nếu số lượng null không khớp với số cột thì cơ sở dữ liệu sẽ trả về lỗi, chẳng hạn như:

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

				
			

Chúng tôi sử dụng NULL làm giá trị được trả về từ truy vấn S3LECT được chèn vì các kiểu dữ liệu trong mỗi cột phải tương thích giữa truy vấn gốc và truy vấn được chèn. NULL có thể chuyển đổi thành mọi loại dữ liệu phổ biến, do đó, nó tối đa hóa khả năng tải trọng sẽ thành công khi số cột chính xác.

Giống như kỹ thuật ORDER BY này, ứng dụng thực sự có thể trả về lỗi cơ sở dữ liệu trong phản hồi HTTP của nó, nhưng có thể trả về lỗi chung hoặc đơn giản là không trả về kết quả nào. Khi số lượng null khớp với số cột, cơ sở dữ liệu sẽ trả về một hàng bổ sung trong tập kết quả, chứa các giá trị null trong mỗi cột. Hiệu ứng đối với phản hồi HTTP phụ thuộc vào mã của ứng dụng. Nếu may mắn, bạn sẽ thấy một số nội dung bổ sung trong phản hồi, chẳng hạn như một hàng bổ sung trên bảng HTML. Nếu không, các giá trị null có thể gây ra một lỗi khác, chẳng hạn như tệp NullPointerException. Trong trường hợp xấu nhất, phản hồi có thể trông giống như phản hồi do số lượng giá trị rỗng không chính xác. Điều này sẽ làm cho phương pháp này không hiệu quả.Giống như ORDER BYkỹ thuật này, ứng dụng thực sự có thể trả về lỗi cơ sở dữ liệu trong phản hồi HTTP của nó, nhưng có thể trả về lỗi chung hoặc đơn giản là không trả về kết quả nào. Khi số lượng null khớp với số cột, cơ sở dữ liệu sẽ trả về một hàng bổ sung trong tập kết quả, chứa các giá trị null trong mỗi cột. Hiệu ứng đối với phản hồi HTTP phụ thuộc vào mã của ứng dụng. Nếu may mắn, bạn sẽ thấy một số nội dung bổ sung trong phản hồi, chẳng hạn như một hàng bổ sung trên bảng HTML. Nếu không, các giá trị null có thể gây ra một lỗi khác, chẳng hạn như tệp NullPointerException. Trong trường hợp xấu nhất, phản hồi có thể trông giống như phản hồi do số lượng giá trị rỗng không chính xác. Điều này sẽ làm cho phương pháp này không hiệu quả.

2.Tìm các cột có kiểu dữ liệu hữu ích

Cuộc tấn công UNION chèn SQL cho phép bạn truy xuất kết quả từ một truy vấn được chèn. Dữ liệu thú vị mà bạn muốn truy xuất thường ở dạng chuỗi. Điều này có nghĩa là bạn cần tìm một hoặc nhiều cột trong kết quả truy vấn ban đầu có kiểu dữ liệu là hoặc tương thích với dữ liệu chuỗi. Sau khi xác định số cột cần thiết, bạn có thể thăm dò từng cột để kiểm tra xem cột đó có thể chứa dữ liệu chuỗi hay không. Bạn có thể gửi một loạt tải trọng UNION S3LECT lần lượt đặt giá trị chuỗi vào từng cột. Ví dụ: nếu truy vấn trả về bốn cột, bạn sẽ gửi:
				
					' UNION S3LECT 'a',NULL,NULL,NULL--
' UNION S3LECT NULL,'a',NULL,NULL--
' UNION S3LECT NULL,NULL,'a',NULL--
' UNION S3LECT NULL,NULL,NULL,'a'--
				
			

Nếu kiểu dữ liệu cột không tương thích với dữ liệu chuỗi thì truy vấn được chèn sẽ gây ra lỗi cơ sở dữ liệu, chẳng hạn như:

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

Nếu lỗi không xảy ra và phản hồi của ứng dụng chứa một số nội dung bổ sung bao gồm giá trị chuỗi được chèn thì cột liên quan sẽ phù hợp để truy xuất dữ liệu chuỗi.

3.Sử dụng cuộc tấn công UNION tiêm SQL để lấy dữ liệu thú vị

Khi bạn đã xác định được số cột được truy vấn ban đầu trả về và tìm thấy cột nào có thể chứa dữ liệu chuỗi, bạn đã có thể truy xuất dữ liệu thú vị.

Giả sử rằng:

  • Truy vấn ban đầu trả về hai cột, cả hai cột đều có thể chứa dữ liệu chuỗi.
  • Điểm tiêm là một chuỗi được trích dẫn trong mệnh đề WHERE.
  • Cơ sở dữ liệu chứa một bảng được gọi users với các cột username và password.

Trong ví dụ này, bạn có thể truy xuất nội dung của users bảng bằng cách gửi dữ liệu đầu vào: 

				
					' UNION S3LECT username, password FROM users--

				
			
Để thực hiện cuộc tấn công này, bạn cần biết rằng có một bảng được gọi users với hai cột được gọi username là và password. Nếu không có thông tin này, bạn sẽ phải đoán tên của các bảng và cột. Tất cả các cơ sở dữ liệu hiện đại đều cung cấp các cách để kiểm tra cấu trúc cơ sở dữ liệu và xác định chúng chứa những bảng và cột nào.

4.Truy xuất nhiều giá trị trong một cột

Trong một số trường hợp, truy vấn trong ví dụ trước chỉ có thể trả về một cột duy nhất.

Bạn có thể truy xuất nhiều giá trị cùng nhau trong một cột này bằng cách ghép các giá trị lại với nhau. Bạn có thể thêm dấu phân cách để phân biệt các giá trị kết hợp. Ví dụ: trên Oracle bạn có thể gửi đầu vào:

 

				
					' UNION S3LECT username || '~' || password FROM users--

				
			
Điều này sử dụng chuỗi ống đôi || là toán tử nối chuỗi trên Oracle. Truy vấn được chèn nối các giá trị của trường username password với nhau, phân tách bằng ký tự~. Kết quả từ truy vấn chứa tất cả tên người dùng và mật khẩu, ví dụ:
				
					...
administrator~s3cure
wiener~peter
carlos~montoya
...
				
			

5.Ví dụ Tấn công UNION chèn SQL , truy xuất nhiều giá trị trong một cột

Related Posts

Để lại một bình luận