마이크로소프트에서 최근 빈발하고 있는 SQL 인젝션 공격을 방어하는데 도움이 되는 도구를 6월 24일에 발표했습니다. ASP 코드로 만들어진 소스를 분석해서 SQL 취약점이 있는 부분을 알려주는 도구입니다. 원문은 아래 링크를 참조하시면 됩니다. 아직 한글 문서가 없는 것 같아서 제가 간략하게 번역하였습니다.
http://support.microsoft.com/kb/954476

* ASP 코드에 숨어있는 SQL 인젝션 문제
만약 ASP 코드 내에 있는 Request.Form 또는 Request.QueryString 컬렉션으로부터 사용자가 입력한 데이터를 꺼내어 아무런 데이터 검증 작업 없이 동적인 SQL 구문을 만드는데 사용한다면 SQL 문장 안에 임의의 SQL 명령을 삽입할 수 있게 됩니다. 이 취약점을 "1차 SQL 인젝션 취약점 (First Order SQL injection vulnerability)"이라 부릅니다.

사용자 입력값이 ASP를 통해 데이터베이스에 저장되었다가, 나중에 그 입력값을 데이터베이스에서 가져와서 다른 ASP 페이지에서 동적으로 SQL 문장을 만드는데 사용하는 경우 역시 공격자가 SQL 명령을 삽입할 수 있게 됩니다. 이를 "2차 SQL 인젝션 취약점 (Second Order SQL injection vulnerability)"이라 부릅니다.

이런 유형의 취약점을 줄이려면 매개변수화 된 쿼리를 사용하는 것이 최선입니다. ASP에서의 SQL 인젝션 취약점과 이를 감소시키는 방법을 더 자세하게 알아보시려면 아래 마이크로소프트 웹 사이트를 방문하세요.
http://msdn.microsoft.com/en-us/library/cc676512.aspx (영문)

마이크로소프트 SQL 인젝션용 소스 코드 분석기 (Microsoft Source Code Analyzer for SQL Injection tool)는 이런 문제를 자동으로 찾는데 도움을 줍니다.

* 문법
이 도구는 아래와 같은 문법을 사용합니다.
msscasi_asp.exe [/nologo] [/quiet] [/suppress=num;..;num] [/GlobalAsaPath=path] [/IncludePaths=path;..;path] /Input=file.asp

* 매개변수 목록
/GlobalAsaPath : Global.asa 파일의 경로
/IncludePaths : 가상 경로를 사용해서 포함되는 파일이 들어있는 세미콜론으로 구분된 경로 목록
/input : 반드시 분석되어야 하는 ASP 파일의 "절대 경로"
/suppress : 이 옵션을 쓰면 경고는 보고하지 않습니다.
/nologo : 로고를 표시하지 않습니다.
/quiet : 파싱 오류는 표시하지 않습니다. /nologo와 /quiet 스위치를 같이 사용하면 경고 메시지만 보입니다.

* 사용 예제
MSSCASI_ASP /input="c:\source\logon.asp"

MSSCASI_ASP /GlobalAsaPath="C:\source" /input="c:\source\webitems\display.asp"

MSSCASI_ASP /GlobalAsaPath="C:\source" /input="c:\source\webitems\display.asp" /IncludePaths="C:\virtualdirectory1;C:\virtualdirectory2"

MSSCASI_ASP /input="c:\source\webitems\display.asp" /suppress="80406;80407"

* 출력 결과 보는 방법
이 도구는 아래와 같은 경고를 생성합니다.

- 80400 : Request 개체를 통해 얻은 데이터를 아무런 입력 검증 없이 사용하여 잠재적인 SQL 인젝션 취약점이 있습니다. 이 경고는 반드시 고쳐야 되는 버그일 가능성이 높습니다.

- 80406 : 알려지지 않은 함수 호출로 받은 Request 개체에서 얻은 데이터로 인해 SQL 인젝션 취약점이 발생할 수 있습니다. 해당 함수 호출 시에 내부에서 데이터 검증 작업을 거치지 않았다면 버그가 있을 가능성이 높습니다. 해당 함수 내에서 입력 검증을 한다면 오탐입니다.

- 80403 : 뒷단의 서버 (데이터베이스 등)에서 얻어온 데이터를 통해 2차 SQL 인젝션 취약점이 발생할 수 있습니다. 다른 웹 사이트 등을 통해 사용자가 이런 데이터를 입력할 수 있는 경우라면 버그일 가능성이 큽니다. 그렇지만 데이터가 신뢰할 수 있는 것이라면 별도로 검증할 필요가 없으니 아마도 버그가 아닐 것입니다. 그렇더라도 종심 보안 전략의 일부로서 매개변수화 된 쿼리를 사용하는 것이 좋습니다.

- 80407 : 뒷단의 서버 (데이터베이스 등)에서 데이터를 가져온 다음 알려지지 않은 함수 호출로 넘깁니다. 다른 웹 사이트 등을 통해 사용자가 이런 데이터를 입력할 수 있는 경우이고, 데이터를 검증하지 않는다면 버그일 가능성이 높습니다.

- 80420 : 함수 매개변수를 통해 SQL 인젝션이 발생할 수 있습니다. 이 경고는 함수 수준에서 발생한 것이므로, 함수의 매개변수 자체가 신뢰할 수 있는 출처에서 온 것이라면 오탐입니다. 만약 여기서 쓰이는 매개변수가 사용자가 입력할 수 있는 값이라면 버그일 가능성이 큽니다. __sql_pre_validated 어노테이션을 함수 매개변수에 사용해서 사용자가 이 코드에 도달할 수 있는지 확인할 수 있습니다.

- 80421 : 알려지지 않은 함수 호출을 통해 받아온 함수 매개변수를 사용하여 SQL 인젝션 취약점이 발생할 가능성이 있습니다. 데이터를 넘겨주는 알려지지 않은 함수에서 데이터 검증을 수행한다면 오탐입니다. 함수 매개변수에 __sql_pre_validated 어노테이션을 쓰고 검증을 수행하는 함수에는 __sql_validate을 써서 사용자가 이 코드에 도달할 수 있는지 확인할 수 있습니다.

다른 모든 경고 중에 80400이 실제 버그일 가능성이 가장 큽니다. ASP 웹 개발자들은 반드시 매개변수화 된 쿼리를 사용해서 이 버그를 고쳐야 합니다. ASP 코드에서 매개변수화 된 쿼리를 사용하는 방법은 아래 마이크로소프트 웹 사이트를 참고하십시오:
http://msdn.microsoft.com/en-us/library/cc676512.aspx

* 제약 사항
- 이 도구는 VBScript로 작성된 ASP 코드만 점검할 수 있습니다. Jscript 등으로 쓰여진 코드는 분석할 수 없습니다.
- 이 도구를 개발하는 도중에 새로운 ASP 파서가 개발되었습니다. 그래서 모든 ASP 구성 요소를 포괄하지 못할 수도 있습니다. 그런 경우에는 파싱 오류를 보게 될 수 있습니다.

* 참고
- 이 도구를 다운로드하려면 아래 링크를 누르세요.
http://www.microsoft.com/downloads/details.aspx?FamilyId=58A7C46E-A599-4FCB-9AB4-A4334146B6BA

- 다양한 베스트 프랙티스에 대한 정보를 더 알고 싶다면 아래 링크를 참고하세요.
http://blogs.technet.com/swi/archive/2008/05/29/sql-injection-attack.aspx

- ASP에서 SQL 인젝션을 방지하는 방법은 아래 링크를 참고하세요.
http://msdn.microsoft.com/en-us/library/cc676512.aspx

- SQL 인젝션 공격에 대해 더 알고 싶다면 아래 링크를 참고하세요.
http://blogs.msdn.com/sdl/archive/2008/05/15/giving-sql-injection-the-respect-it-deserves.aspx

- 이 도구에 대해 더 알고 싶다면 아래 링크를 참고하세요.
http://blogs.msdn.com/sqlsecurity