SQL Server tiêm - thiệt hại bao nhiêu trong 26 ký tự?


21

Tôi đang kiểm tra khả năng phục hồi chống lại các cuộc tấn công tiêm chích vào cơ sở dữ liệu SQL Server.

Tất cả các tên bảng trong db là chữ thường và đối chiếu là phân biệt chữ hoa chữ thường, Latin1_General_CS_AS .

Chuỗi tôi có thể gửi được buộc phải viết hoa và có thể dài tối đa 26 ký tự. Vì vậy, tôi không thể gửi BẢNG DROP vì tên bảng sẽ được viết hoa và do đó câu lệnh sẽ thất bại do đối chiếu.

Vậy - thiệt hại tối đa tôi có thể làm trong 26 ký tự là gì?

CHỈNH SỬA

Tôi biết tất cả về các truy vấn được tham số hóa và vv - hãy tưởng tượng rằng người đã phát triển giao diện người dùng xây dựng truy vấn để gửi không sử dụng thông số trong trường hợp này.

Tôi cũng không cố làm bất cứ điều gì bất chính, đây là một hệ thống được xây dựng bởi một người khác trong cùng một tổ chức.


1
Chúng tôi đang tưởng tượng hoặc bạn thực sự đang thử nghiệm bút và có những yêu cầu không cho phép bạn tránh tiêm? Bạn đang tìm cách để phá vỡ sự thiếu an ninh của anh ấy?
LowlyDBA

41
Tại sao nó thậm chí là một lựa chọn mà cánh cửa phải được mở? Điều này có vẻ như bạn đã dành nhiều thời gian hơn để suy ngẫm về điều này hơn là chi phí để chốt cửa. Tôi cảm thấy đây là một bài tập không có kết quả - nếu bạn đưa ra 10 lỗ hổng, họ sẽ nói, chúng tôi sẽ cắm 10 lỗ hổng đó và chắc chắn sẽ không có lần thứ 11. Đây là nơi "làm sạch" chuỗi đã cho chúng tôi. / facepalm
Aaron Bertrand

5
Đây là câu hỏi cực kỳ mơ hồ và tùy tiện, và thậm chí về mặt lý thuyết nó không thể được giải quyết. Có các tính năng giảm thiểu tự nhiên khác của SQL Injection (quyền, hộp cát, tường lửa, v.v.) và bạn phải tính đến tất cả những điều đó để trả lời câu hỏi này.
Evan Carroll

2
Điều gì thực thi giới hạn 26 ký tự? Ứng dụng?
Jonathan Fite

7
Dừng lại đi. Dừng nó lại. Nếu các truy vấn được tham số hóa từ xa là một tùy chọn, hãy sử dụng chúng . Nếu ai đó không biết cách sử dụng chúng, hãy tìm một tài nguyên phong nha và để họ đọc nó. Nếu họ không lắng nghe, hãy thông báo cho người quản lý hoặc người giám sát họ đang tạo ra các lỗ hổng bảo mật quan trọng (Một bản demo không phá hủy sẽ không bị tổn thương.) Và từ chối được giáo dục.
jpmc26

Câu trả lời:


38

Dễ dàng:

GRANT EXECUTE TO LowlyDBA

Hoặc, tôi đoán trong trường hợp này nó sẽ là

grant execute to lowlydba 

Hãy lựa chọn các biến thể về điều này.

Trong tất cả khả năng bạn có thể kiểm tra điều này ngay bây giờ so với hệ thống hiện tại của bạn, nhưng bất kỳ số lượng thay đổi nhỏ nào trong cơ sở dữ liệu theo thời gian có thể làm mất hiệu lực kiểm tra của bạn. Chuỗi ký tự có thể thay đổi, ai đó có thể tạo một thủ tục lưu trữ chữ thường có tiềm năng phá hủy - bất cứ điều gì. Bạn không bao giờ có thể nói với sự tự tin 100% rằng sẽ không có một cuộc tấn công 26 nhân vật phá hoại mà ai đó có thể xây dựng.

Tôi khuyên bạn nên tìm cách khiến nhà phát triển tuân theo các thực tiễn bảo mật tốt nhất theo tiêu chuẩn cơ bản của ngành, nếu chỉ vì lợi ích của riêng bạn vì một người mà tôi cho là ít nhất phải chịu trách nhiệm một phần nếu vi phạm an ninh xảy ra.

Chỉnh sửa:

Và để độc hại / vui vẻ, bạn có thể thử bật mọi cờ theo dõi. Điều này sẽ rất thú vị để quan sát. Cảm thấy như một bài đăng trên blog Brent Ozar sẽ làm ...

DBCC TRACEON(xxxx, -1)

1
Bên cạnh đó tạo điều kiện cho cờ dấu vết: thay đổi cài đặt ngẫu nhiên khác nhau: SET LOCK_TIMEOUT 0;, SET LANGUAGE Malaysian;, SET ANSI_NULLS OFF:...
ypercubeᵀᴹ

2
@ ypercubeᵀᴹ tất cả chỉ ảnh hưởng đến phiên của bạn.
Martin Smith

2
@MartinSmith thnx. Nếu SETchỉ ảnh hưởng đến cài đặt phiên, thì cài đặt satabase và máy chủ được thay đổi ( ALTER DATABASE ...;?) DROP DATABASE ..;Sẽ gây ra nhiều thiệt hại hơn, nếu nó thành công;)
ypercubeᵀᴹ

1
Thay đổi cơ sở dữ liệu và sp_cool chủ yếu cho các cài đặt cấp độ DB và Máy chủ. Mặc dù bạn có thể đạt giới hạn 26 ký tự với những điều này. Ngoài ra, các cài đặt cụ thể này ở cấp cơ sở dữ liệu chỉ được sử dụng nếu kết nối máy khách không đặt chúng. Và theo mặc định hầu hết hoặc tất cả làm.
Martin Smith

7
Tôi giống như nhận xét đó.
Brent Ozar

22

Cả hai SHUTDOWNlệnh hoặc KILLLệnh (chọn một số ngẫu nhiên trên 50) đều mất ít hơn đáng kể 26 ký tự, mặc dù tài khoản thực thi các truy vấn ứng dụng hy vọng không có đủ quyền để chạy các lệnh này.


Thông thường, tài khoản sẽ không cần thả bảng ...
Greg

3
@Greg vâng. Mặc dù bạn có thể phỏng đoán một môi trường đang xem xét cho phép SQL SQL miễn là độ dài ngắn không tuân theo các thực tiễn tốt nhất về bảo mật và các tài khoản có thể không được cấu hình với các quyền tối thiểu.
Martin Smith

14

Bạn có thể tạo một bảng mà sau đó bạn điền vào cho đến khi hết thời gian hoặc không gian đĩa hết bất cứ khi nào đến trước.

declare @S char(26);

set @S = 'create table t(c char(99))';
exec (@S);

set @S = 'insert t values('''')'
exec (@S);

set @S = 'insert t select c from t'
exec (@S);
exec (@S);
exec (@S);
exec (@S);
-- etc

19
@AlanB Chà, sau đó bạn sẽ cần thứ gì đó ngăn tôi khai thác điểm yếu hơn một lần.
Mikael Eriksson

1
xỉn màu ... while 1=1 insert t values('')là 30 ... create table x(i int)=> while 1=1 insert t select 0là 27
WernerCD

1
Bạn có thể sử dụng điều này để xây dựng một lệnh dài hơn giới hạn ký tự, và sau đó thực thi lệnh đó không?
Lawtonfogle

1
@MartinSmith Tôi nghĩ tôi sẽ rời đi như thế này nhưng bây giờ tôi chỉ cần thử nó :). Sẽ cho bạn biết nếu tôi tìm ra nó.
Mikael Eriksson

7
@WernerCD x:insert t select 0 GOTO xchính xác là 26 mặc dù.
Martin Smith

4

Tùy thuộc vào định nghĩa thiệt hại của bạn, bạn có thể chạy điều này: WAITFOR DELAY '23: 59 'Để thực sự xấu xa, bạn có thể sử dụng công cụ kiểm tra tải để chạy từ 32.768 khách hàng.



1
Nếu chuỗi được đưa vào lô ad-hoc có khóa, nó có thể cung cấp từ chối dịch vụ khả thi dưới dạng một cuộc gọi mà không cần gây ra tình trạng chết đói chuỗi.
David Spillett

3

Sự thay đổi dựa trên câu trả lời của @ MikaelEriksson và câu trả lời của @ MartinSmith cho nhận xét ban đầu của tôi:

declare @S char(26);

set @S = 'create table x(i int)';
exec (@S);

Ban đầu tôi đã cố gắng thực hiện một câu lệnh WHILE, nhưng điều tốt nhất tôi có thể làm là 27 ký tự:

set @S = 'while 1=1 insert t select 0'; -- fails at 27 characters
exec (@S);

Nhưng Martin đã chỉ ra GOTO:

set @S = 'x:insert t select 0 GOTO x';
exec (@S);

GOTO ... gốc rễ của tất cả tà ác và người tạo ra một câu lệnh chèn vòng lặp vô hạn trong 26 ký tự.

Như đã nói ... có thể thuận lợi khi gắn bó với CHAR (99) thay vì int vì điều đó sẽ sử dụng nhiều không gian hơn. Các tùy chọn khác sử dụng tên dài hơn và sẽ phá vỡ giới hạn 26 ký tự ... hoặc sử dụng ít không gian lưu trữ hơn trên mỗi hàng.

Mã kiểm tra đầy đủ:

declare @S char(26);
set @S = 'drop table t;';
exec (@S);
GO

declare @S char(26);

set @S = 'create table t(c CHAR(99))';
exec (@S);

set @S = 'x:insert t select 0 GOTO x';
exec (@S);
GO

1
set @S = 'x:insert t;select 0;GOTO x';để tương thích với cuộc tấn công tiêm chích của bạn trong tương lai;)
ypercubeᵀᴹ

@ ypercubeᵀᴹ Bạn đã thêm hai ;s ... cái thứ hai vẫn ổn - thay thế một khoảng trắng và có chức năng nếu không cần thiết. Cái đầu tiên phá vỡ truy vấn - tách câu lệnh INSERT khỏi câu lệnh SELECT.
WernerCD

À đúng rồi. Đó là những gì xảy ra khi người ta không sử dụng dải phân cách! Chúng tôi không biết mỗi truy vấn kết thúc ở đâu và khi nào tiếp theo bắt đầu!
ypercubeᵀᴹ

1
@WarnerCD Tôi biết. Đó là một trò đùa về thủ tục mất giá trong SQL Server. Nó dường như mất mãi mãi. Tuy nhiên, đó là cách thực hành tốt để sử dụng dấu chấm phẩy giữa các câu lệnh và không chỉ ở nơi cần thiết.
ypercubeᵀᴹ

2
@yper Tôi nghi ngờ rằng nó sẽ được thực thi. Có lẽ có một tấn mã kế thừa sẽ cần thiếu dấu hai chấm được thêm vào mà không có giá trị kinh doanh cụ thể nào để làm như vậy. Và nó có thể được nhúng trong các ứng dụng khó hoặc không thể cập nhật.
Martin Smith

0
XP_CMDSHELL 'SHUTDOWN -PF'

Tùy thuộc vào mức độ thiệt hại mà bạn cho là giảm sức mạnh. :-)

Điều này không yêu cầu xp_cmdshell phải được kích hoạt trên máy chủ, một điều không phải là trường hợp của một vài phiên bản SQL Server cuối cùng. Nó cũng yêu cầu tài khoản dịch vụ có quyền tắt, điều này có thể có hoặc không có.

Kích hoạt xp_cmdshell có thể nằm ngoài giới hạn 26 ký tự của bạn. Bạn có cho phép tiêm nhiều lần không?

SP_CONFIGURE 'SHOW ADV',1

RECONFIGURE

SP_CONFIGURE 'XP', 1

RECONFIGURE

1
EXEC chỉ là tùy chọn nếu đây là tuyên bố đầu tiên trong lô. Mà có lẽ sẽ không phải là trường hợp ở đây.
Martin Smith

@Martin Smith, bình luận tốt. EXEC thêm 5 ký tự vào mỗi dòng gọi thủ tục, giúp đẩy hầu hết trong số chúng hơn 26 ký tự. Tôi tự hỏi nếu TẠO ALIAS sẽ giúp ở đây?
Greenstone Walker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.