2012-11-21 1 views
20

SQL Server 데이터베이스가있는 ASP.NET 웹 응용 프로그램이있는 경우 SQL 주입 공격이 수행 될 경우 SqlCommand 클래스의 인스턴스를 통과한다고 가정하는 것이 안전합니까?SQL Injection 공격은 SqlCommand 이외의 것을 통해 실행될 수 있습니까?

배경 :

내가 어떤 SQL 주입 취약점을 가지고 오히려 큰 웹 응용 프로그램을 상속 상황에서입니다. 몇 가지 다른 문제에 대한 코드를 살펴 보았습니다 만 모든 SQL 주입 취약점을 찾는 안전한 방법이 모든 파일에서 SqlCommand의 인스턴스를 검색 한 다음 매개 변수화 된 쿼리인지 확인하는 것이 아닌지 궁금합니다. 이것은 단단한 계획입니까?

답변

20

내가 특별히 SqlCommand를 위해 단지을 보이지 않아 - 코드가 DBCommand 나에 IDbCommand를 사용할 수 있습니다. 그것은 EF, L2S 또는 NHibernate와 같은 ORM으로 래핑 될 수 있습니다 (모두 원시 액세스 수준을 제공합니다). "dapper"또는 simple.data와 같은 것을 사용할 수 있습니다. 또는 DataTable/DataAdapter. 레거시 OLEDB 또는 ADODB 액세스를 사용하는 코드가있을 수 있습니다. Heck, 당신이 아는 한 모두 당신은 당신 자신의 저수준 TDS API를 작성할 수있었습니다.

그래서 다음과 같이 여러 가지 형태의 데이터 액세스 코드를 확인합니다. 부서별 접근 방식이 "SqlCommand를 직접 사용"하는 경우 상황이 바뀝니다.

또한 SQL 주입은 .NET에 국한되지 않습니다. 예를 들어을 매개 변수화하더라도 원시 명령 텍스트 또는 저장 프로 시저 에 SQL 주입 위험을 만들 수 있습니다. TSQL이 연결을 수행하는 경우 EXEC를 통해 호출되도록 동적 SQL을 작성합니다. sp_executesql이 도움이 될 수 있습니다.

+0

다른 사람의 프로젝트에 대해 이야기하는 경우 마지막 비트가 매우 중요합니다. sprocs가있는 경우 철저하게 감사하고 싶습니다. 데이터가 이미 db에 있으므로 SQL 명령에 연결하는 것이 안전하다는 것을 의미하지는 않습니다. – Wedge

+0

좋은 답변입니다! 마지막 질문 - SQL Server 수준에서 주입 공격이 발생하면 EXEC를 사용하여 수행해야합니까? –

8

또한 또는 SqlCommand를 포함 사용 일을 찾아해야합니다. 여기에는 SqlDataAdapter 등이 포함됩니다.

+0

또한 매개 변수로 설정하는 대신 매개 변수를 쿼리 문자열로 연결하는 용도를 구체적으로 살펴보십시오. 전달 된 문자열을 단순히 실행하는 함수가 하나있는 경우에는 더 이상 사용하지 않는 것으로 표시하고 매개 변수 컬렉션을 수락하는 오버로드를 사용하려면 해당 오류를 리팩토링합니다. – KeithS

+0

문자열 연결을 사용하는 코드를 다루는 데있어 ReSharper를 사용하여 연결을 String.Format의 호출로 전환하는 데 유용한 첫 번째 단계를 발견했습니다. 그런 다음 형식 문자열을 상수로 리팩토링하거나 그렇지 않으면 String.Formats를 명명 된 메서드로 리팩터링합니다. 그런 다음 복제본을 찾고 문자열을 만드는 메서드 대신 SqlCommand를 만드는 메서드로 리팩터링하는 것이 훨씬 쉬워집니다. –

+0

도우미 라이브러리가있을 수 있습니다. '데이터 액세스 응용 프로그램 블록'또는 이전 SqlHelper를 사용하면 쉽게 주입 취약점을 악용 할 수 있습니다. – Tass

7

매개 변수화 된 쿼리 라이브러리를 사용하고 있다고해서 그것이 올바르게 사용되었다고 할 수는 없습니다. 감사 코드에서는 매개 변수가 사용 된 경우를 보았지만 쿼리의 일부는 여전히 문자열 연결을 사용하여 작성됩니다. 특히 쿼리의 테이블 이름과 제한/주문 부분은 일반적인 실수입니다.

정적 분석에서 완전히 설정 한 경우 가장 좋은 방법은 응용 프로그램의 모든 쿼리에 대해 grep을 수행 한 다음 각 구문이 올바르게 구성되었는지 확인하는 것입니다. 예, 이것은 오랜 시간이 걸릴 것이며, 마음이 마비 될 수 있습니다. 휴식을 취하고 메모를하고 언론에 나섭니다. 당신이 SQL 주입을 찾으면 그것은 보람이있을 것입니다!

10

데이터베이스 스키마에 따라 저장된 procs에서 공격을 검사해야 할 수도 있습니다 (저장된 procs를 사용한다고 가정). 나는 사람들이 자신의 코드에 paramterised 저장 프로 시저를 사용 봐 왔지만, proc 디렉토리에 그들은 단지 쿼리 EXEC를 사용

CREATE PROC Dummy 
(
    @Str VARCHAR(50) 
) 
AS 
EXEC ('SELECT * FROM Table Where Column = ''' + @Str + '''') 
관련 문제