스크립트 악용 개요

업데이트: 2007년 11월

브라우저의 관점에서 보면 웹 페이지는 단순히 긴 문자열일 뿐입니다. 브라우저에서는 문자열을 순서대로 처리하여 일부 문자는 그대로 표시하고 <b> 및 <script> 같은 다른 문자는 특수 규칙에 따라 해석하기도 합니다. 악의가 있는 사용자가 이러한 일부 특수 문자를 페이지에 삽입하는 경우 브라우저에서는 이 문자가 포함된 사실을 인식하지 못한 상태에서 페이지의 일부로 처리합니다.

스크립트는 다음과 같은 간단한 방식으로 악용될 수 있습니다. 다른 사용자가 읽을 수 있도록 최신 영화에 대한 의견을 게시할 수 있는 응용 프로그램이 있는 경우 다음과 같은 단계를 통해 스크립트가 악용됩니다.

  1. 응용 프로그램에서 사용자가 의견을 입력할 수 있는 폼을 표시합니다. 악의가 있는 사용자가 <script> 블록이 포함된 의견을 작성합니다.

  2. 폼이 게시되고 악의가 있는 사용자의 의견이 데이터베이스에 저장됩니다.

  3. 다른 사용자가 이 사이트를 방문합니다. 페이지가 구성되면 해당 페이지에서는 데이터베이스에 있는 의견을 읽어 페이지에 표시합니다. 악의가 있는 사용자가 작성한 <script> 블록이 텍스트인 것처럼 페이지에 작성됩니다.

  4. 나중에 방문한 사용자의 브라우저에 페이지가 표시되면 <script> 블록을 가져와 실행합니다.

악의가 있는 사용자는 다른 방법을 사용하여 스크립트를 악용할 수도 있습니다. 스크립트가 악용되려면 대부분 응용 프로그램에서 악의적인 입력을 받아들인 후 이 입력을 브라우저에서 실행할 특정 페이지에 삽입 또는 표시해야 합니다. 이로 인해 발생할 수 있는 손상 정도는 실행되는 스크립트에 따라 다릅니다. 브라우저에서 표시되는 팝업 메시지는 귀찮기는 하지만 큰 문제가 되지 않습니다. 그러나 쿠키와 사용자 입력(예: 암호)을 도용하거나, 인터넷 보안이 허술한 경우 사용자의 컴퓨터에서 네이티브 코드를 실행하는 방법에 의해 심각한 문제가 발생할 수도 있습니다.

스크립트 악용 문제를 방지하는 방법에 대한 내용은 방법: 문자열에 HTML 인코딩을 적용하여 스크립트를 이용한 공격으로부터 웹 응용 프로그램 보호를 참조하십시오.

참고:

ASP.NET을 사용하면 "<!", "</" 및 "<?"와 같은 잠재적으로 위험한 문자열을 검사하여 URL로 가장한 스크립트 악용을 방지할 수 있습니다.

SQL 문 악용

악의적인 SQL 문을 실행하는 것도 스크립트 악용의 한 유형입니다. 응용 프로그램에서 사용자에게 정보를 입력하도록 요청한 다음 사용자가 입력한 내용을 SQL 문을 나타내는 문자열에 연결하는 경우 이런 문제가 발생할 수 있습니다. 예를 들어 응용 프로그램에서 다음과 같은 문을 실행하기 위해 고객 이름을 요청할 수 있습니다.

"Select * From Customers where CustomerName = " & txtCustomerName.Value

그러나 데이터베이스에 대해 어느 정도 알고 있는 악의적인 사용자가 텍스트 상자를 사용하여 SQL 포함 문과 고객 이름을 입력하면 다음과 같은 문이 만들어질 수 있습니다.

Select * From Customers Where CustomerName = 'a' Delete From Customers Where CustomerName > ''

이 쿼리가 실행되면 데이터베이스가 손상됩니다.

스크립트 악용으로부터 보호

스크립트 악용을 방지하는 기본적인 방법은 사용자가 제공하는 정보를 신뢰하지 않는 것입니다. 브라우저를 통해 응용 프로그램에 게시되는 모든 데이터에는 악의적인 스크립트가 포함되어 있다고 가정하는 것이 좋습니다.

마찬가지로 프로그래밍 방식으로 문자열을 직접 만드는 경우가 아니면 페이지에 문자열을 쓸 때마다 문자열에 악의적인 스크립트가 포함되어 있다고 가정해야 합니다. 예를 들어 데이터베이스에서 문자열을 읽을 때 문자열에 악의적인 스크립트가 포함될 수 있다고 가정해야 합니다. 보안을 매우 중요하게 생각하는 개발자는 악의가 있는 사용자가 데이터베이스를 무단으로 변경할 방법을 찾을 수 있다고 가정하기 때문에 자신이 만든 데이터베이스도 신뢰하지 않습니다.

ASP.NET에서는 다음과 같이 스크립트 악용을 방지할 수 있는 여러 가지 방법을 제공합니다.

  • ASP.NET에서는 쿼리 문자열 변수, 폼 변수 및 쿠키 값에 대해 요청 유효성 검사를 수행합니다. 기본적으로 현재 Request에 HTML로 인코딩된 요소 또는 특정 HTML 문자(예: em 대시에 해당하는 &#151;)가 포함되어 있는 경우 ASP.NET 페이지 프레임워크에서 오류가 발생합니다.

  • 신뢰할 수 없는 문자열을 응용 프로그램에 표시하려는 경우에는 해당 문자열을 응답에 다시 쓸 때 HTML 인코딩을 문자열에 적용합니다. 예를 들어 인코딩을 사용하면 <b> 태그가 &lt;b&gt; 형식이 됩니다. 내용을 신뢰할 수 없는 데이터베이스의 문자열을 표시하는 경우에 이 방법을 사용하는 것이 좋습니다.

  • 응용 프로그램에서 사용자가 입력한 서식 지정 명령과 같은 일부 HTML을 허용하려면 해당 HTML을 서버에 제출하기 전에 클라이언트에서 인코딩해야 합니다. 자세한 내용은 방법: 문자열에 HTML 인코딩을 적용하여 스크립트를 이용한 공격으로부터 웹 응용 프로그램 보호를 참조하십시오.

  • SQL 문 악용을 방지하려면 문자열 연결을 사용하여 SQL 쿼리를 만들지 마십시오. 대신 매개 변수가 있는 쿼리를 사용하고 매개 변수 개체에 사용자 입력을 할당합니다. 자세한 내용은 데이터 어댑터 명령의 매개 변수를 참조하십시오.

  • 올바른 값 집합 및 문자열 서식/형식 유효성 검사를 기준으로 폼 입력의 유효성을 항상 검사합니다. 예를 들어, 특정 폼 변수에 정수 형식이 필요한 경우 Int32.TryParse 메서드를 사용하여 해당 값이 실제로 정수인지 확인하고 범위 검사를 사용하여 해당 값이 허용되는 범위 내에 있는지 확인해야 합니다.

참고 항목

작업

방법: 문자열에 HTML 인코딩을 적용하여 스크립트를 이용한 공격으로부터 웹 응용 프로그램 보호

개념

웹 응용 프로그램 보안 위협의 개요

웹 응용 프로그램의 기본 보안에 대한 유용한 정보