차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
guide:asp.net_개발_보안_가이드 [2013/11/22 06:54] 121.140.124.172guide:asp.net_개발_보안_가이드 [2024/04/04 05:12] (현재) – 바깥 편집 127.0.0.1
줄 138: 줄 138:
  
 ==== 취약점 상세 내용 및 보안 대책 ==== ==== 취약점 상세 내용 및 보안 대책 ====
-Javascript, Vbscript 등 PC의 웹브라우저에서 실행되는 클라이언트 사이트 스크립트를 다른 사용자의 웹브라우저에서 실행하도록 함으로서 웹 브라우저를 제어하여 PC를 공격하는 취약점을 말한다. 공격에 사용되는 유형은 크게 두가지로 분류할 수 있다.+Javascript, Vbscript 등 PC의 웹브라우저에서 실행되는 클라이언트 사이트 스크립트를 다른 사용자의 웹브라우저에서 실행하도록 함으로서 웹 브라우저를 제어하여 PC를 공격하는 취약점을 말. 공격에 사용되는 유형은 크게 두가지로 분류.
 \\ \\
 (1)  Reflected XSS (1)  Reflected XSS
 \\ \\
-이 유형의 XSS는 클라이언트 측에서 전송된 데이터가 서버측에서 즉시 처리된 후 사용자에게 응답으로 전송되는 돌아오는 경우에 해당한다. 다음과 같은 상황에서 발생이 가능하다.+이 유형의 XSS는 클라이언트 측에서 전송된 데이터가 서버측에서 즉시 처리된 후 사용자에게 응답으로 전송되는 돌아오는 경우에 해당. 다음과 같은 상황에서 발생이 가능.
 \\ \\
   * 검색 페이지에서 입력된 검색어가 검색 결과 페이지에 표시되는 경우   * 검색 페이지에서 입력된 검색어가 검색 결과 페이지에 표시되는 경우
   * URL에 포함된 특정 파라미터가 응답 페이지에 hidden 속성으로 포함되어 있는 경우   * URL에 포함된 특정 파라미터가 응답 페이지에 hidden 속성으로 포함되어 있는 경우
-위의 두가지 유형은 본질적으로는 동일한 내용이다.  +위의 두가지 유형은 본질적으로는 동일한 내용.  
-이러한 유형의 XSS 는 사회 공학적 방법 등을 통해서 공격 스크립트가 포함된 URL을 타인이 실행하도록 유도함으로서 (예를 들면 메신저로 링크를 전송하거나, 게시판에 URL을 링크로 걸어놓고 클릭을 유도하는 방식 등) 공격에 이용될 수 있. 다만, 공격자가 강제적으로 타 사용자의 PC에서 공격 스크립트가 실행되도록 할 수는 없으므로 일반적으로 심각한 취약점으로 분류되지는 않는다+이러한 유형의 XSS 는 사회 공학적 방법 등을 통해서 공격 스크립트가 포함된 URL을 타인이 실행하도록 유도함으로서 (예를 들면 메신저로 링크를 전송하거나, 게시판에 URL을 링크로 걸어놓고 클릭을 유도하는 방식 등) 공격에 이용될 수 있. 다만, 공격자가 강제적으로 타 사용자의 PC에서 공격 스크립트가 실행되도록 할 수는 없으므로 일반적으로 심각한 취약점으로 분류되지는 않
-그러나 공공기관이나 금융권과 같이 신뢰도가 중요한 대상인 경우에는 이 유형의 XSS 도 모두 제거해야 하며, 그 외에도 대외에 공개된 웹사이트라면 일반적으로 제거하도록 하는 것이 좋.+그러나 공공기관이나 금융권과 같이 신뢰도가 중요한 대상인 경우에는 이 유형의 XSS도 모두 제거해야 하며, 그 외에도 대외에 공개된 웹사이트라면 일반적으로 제거하도록 하는 것이 좋.
 \\ \\
  
 (2) Stored XSS (2) Stored XSS
 \\ \\
-게시판과 같이 사용자가 입력한 정보가 서버측 DB에 저장되어 있다가 타 사용자가 해당 정보를 열람할 때 DB에 저장되어 있는 정보를 가져와 화면에 출력하는 방식의 웹 애플리케이션에서 발생하는 취약점으로서, XSS의 가장 핵심적인 취약점이라고 할 수 있다. 불특정 다수를 대상으로 열람자의 웹브라우저에서 공격 스크립트를 실행할 수 있기 때문에 심각한 위협이 발생한다+게시판과 같이 사용자가 입력한 정보가 서버측 DB에 저장되어 있다가 타 사용자가 해당 정보를 열람할 때 DB에 저장되어 있는 정보를 가져와 화면에 출력하는 방식의 웹 애플리케이션에서 발생하는 취약점으로서, XSS의 가장 핵심적인 취약점이라고 할 수 있다. 불특정 다수를 대상으로 열람자의 웹브라우저에서 공격 스크립트를 실행할 수 있기 때문에 심각한 위협이 발생
-공격자가 XSS를 목적으로 악성 스크립트를 삽입하여 둘 수 있는 위치는 비단 게시판의 글 본문 뿐만 아니라 제목, 작성자 이름, 날짜, 첨부파일 이름 등이 모두 가능하며, 또한 게시판 외에도 사용자 프로필의 닉네임, 주소, 전화번호, 등 사용자가 입력이 가능한 모든 데이터에 스크립트가 삽입될 수 있.+공격자가 XSS를 목적으로 악성 스크립트를 삽입하여 둘 수 있는 위치는 비단 게시판의 글 본문 뿐만 아니라 제목, 작성자 이름, 날짜, 첨부파일 이름 등이 모두 가능하며, 또한 게시판 외에도 사용자 프로필의 닉네임, 주소, 전화번호, 등 사용자가 입력이 가능한 모든 데이터에 스크립트가 삽입될 수 있.
   * 게시판 : 제목, 본문, 작성자, 날짜, 첨부파일 이름, 태그, 분류 등   * 게시판 : 제목, 본문, 작성자, 날짜, 첨부파일 이름, 태그, 분류 등
   * 사용자 프로필 : 이름, 닉네임, 주소, 전화번호, 이메일, 직업, 기타 입력정보   * 사용자 프로필 : 이름, 닉네임, 주소, 전화번호, 이메일, 직업, 기타 입력정보
줄 162: 줄 162:
  
 === ASP.NET 요청 유효성 검사가 활성화되어 있는지 확인 === === ASP.NET 요청 유효성 검사가 활성화되어 있는지 확인 ===
-기본적으로 요청 유효성 검사는 Machine.config 파일에서 사용할 수 있습니다. 그 요청 유효성 검사가 현재 서버의 Machine.config 파일에서 활성화되고 응용 프로그램의 Web.config 파일에서이 설정을 무시하지 않는지 확인합니다.+기본적으로 요청 유효성 검사는 Machine.config 파일에서 사용할 수 있. 그 유효성 검사가 현재 서버의 Machine.config 파일에서 활성화되고 응용 프로그램의 Web.config 파일에서 설정을 무시하지 않는지 확인.
  
-가. ASP.NET 요청 유효성 검사가 활성화되어 있는지 테스트 절차+가. ASP.NET 유효성 검사가 활성화되어 있는지 확인하는 테스트 절차
  
-1. 요청 유효성 검사를 비활성화 ASP.NET 페이지를 만들 수 있습니다. 이렇게하려면 설정 ValidateRequest를 = "false"를 다음 코드 예제와 같이을 보유하고 있습니다.+1. 유효성 검사를 비활성화 하여 ASP.NET 페이지를 만들 수 있. 이렇게 하려면 설정 ValidateRequest를 = "false"를 다음 코드 예제와 같이 설정.
  
   <%@ Page Language="C#" ValidateRequest="false" %>   <%@ Page Language="C#" ValidateRequest="false" %>
줄 189: 줄 189:
   </html>   </html>
  
-2. 페이지를 실행합니다. 그 표시 여 의 스크립트 때문에 메시지 상자에 txtString가 통과하고 브라우저에서 클라이언트 측 스크립트로 렌더링됩니다.+2. 페이지를 실행. 그럴 경우 스크립트 때문에 메시지 상자에 txtString를 지나 브라우저에서 클라이언트 측 스크립트로 렌더링.
 \\ \\
-3. 설정 ValidateRequest를 = "진정한" 또는 제거 ValidateRequest의 페이지 속성을 다시 페이지로 이동합니다. 다음과 같은 오류 메시지가 표시되어 있는지 확인합니다.+3. 설정값이 ValidateRequest = "true" 또는 제거 ValidateRequest의 페이지 속성을 다시 페이지로 이동. 다음과 같은 오류 메시지가 표시되어 있는지 확인.
  
   A potentially dangerous Request.Form value was detected from the client (txtString="<script>alert('hello...").   A potentially dangerous Request.Form value was detected from the client (txtString="<script>alert('hello...").
줄 200: 줄 200:
   <% =   <% =
 ===  HTML 출력은 입력 매개 변수를 포함 여부 확인 === ===  HTML 출력은 입력 매개 변수를 포함 여부 확인 ===
-출력은 입력 매개 변수가 포함되어 있는지 여부를 확인하는 당신의 디자인 및 당신의 페이지 코드를 분석합니다. 이러한 매개 변수는 다양한 소스로부터 올 수 있습니다다음 목록은 일반적인 입력 소스를 포함합니다.:+출력은 입력 매개 변수가 포함되어 있는지 여부를 확인하고 디자인 및 당신의 페이지 코드를 분석. 이러한 매개 변수는 다양한 소스로부터 올 수 있. 
 +\\ 
 + 
 +예)일반적인 입력 소스
  
   * Form 필드   * Form 필드
줄 229: 줄 232:
  
 === 잠재적으로 위험한 HTML 태그와 속성 검토 === === 잠재적으로 위험한 HTML 태그와 속성 검토 ===
-당신이 동적으로 HTML 태그를 생성하고 잠재적으로 안전하지 않은 입력으로 태그 속성을 구성하는 경우, 당신이 그들을 쓰기 전에 태그 속성을 HTML로 인코딩해야합니다.+동적으로 HTML 태그를 생성하고 잠재적으로 안전하지 않은 입력으로 태그 속성을 구성하는 경우, 악의적인 사용자가 사용하기 전에 태그 속성을 HTML로 인코딩해야.
 예) aspx 페이지에서는 <사용하여 리턴 페이지에 HTML을 직접 작성하는 방법 예) aspx 페이지에서는 <사용하여 리턴 페이지에 HTML을 직접 작성하는 방법
   <%@ Page Language="C#" AutoEventWireup="true"%>   <%@ Page Language="C#" AutoEventWireup="true"%>
줄 257: 줄 260:
  
 가. 잠재적으로 위험한 HTML 태그 가. 잠재적으로 위험한 HTML 태그
-다음과 같은 일반적으로 사용되는 HTML 태그 악의적 인 사용자가 스크립트 코드를 삽입 할 수 있습니다 :+\\ 
 + 
 +예)악의적인 사용자가 스크립트 코드를 삽입 할 수 있는 일반적으로 사용되는 HTML 태그
   * <applet>   * <applet>
   * <body>   * <body>
줄 273: 줄 278:
   * <meta>   * <meta>
   * <object>   * <object>
 +
 \\ \\
 예) HTML 특성을 사용하여 SRC , lowsrc , 스타일 및 HREF 크로스 사이트 스크립팅을 삽입 예) HTML 특성을 사용하여 SRC , lowsrc , 스타일 및 HREF 크로스 사이트 스크립팅을 삽입
줄 284: 줄 290:
   </style>   </style>
 === 대책 평가 === === 대책 평가 ===
-몇 가지 입력을 사용하여 HTML을 생성하는 ASP.NET 코드를 찾을 때, 당신은 특정 응용 프로그램에 대한 적절한 대책을 평가+몇 가지 입력을 사용하여 HTML을 생성하는 ASP.NET 코드를 찾을 때, 특정 응용 프로그램에 대한 적절한 대책을 평가
 \\ \\
  
 가. HTML 출력을 인코딩 가. HTML 출력을 인코딩
 \\ \\
-당신이 웹 페이지에 텍스트 출력을 작성하고 텍스트를 HTML 특수 문자 (예 : <,>, 그리고 포함 된 경우 모르는 경우 )를 사용하여 텍스트를 미리 처리+웹 페이지에 텍스트 출력을 작성하고 텍스트를 HTML 특수 문자 (예 : <,>, and & 포함 된 경우 모르는 경우 )를 사용하여 텍스트를 미리 처리
 \\ \\
 예) 텍스트 사용자 입력, 데이터베이스 또는 로컬 파일에서 온 경우이 작업을 수행 예) 텍스트 사용자 입력, 데이터베이스 또는 로컬 파일에서 온 경우이 작업을 수행
줄 303: 줄 309:
 다. 필터 사용자 입력 다. 필터 사용자 입력
 \\ \\
-텍스트 입력 필드의 어떤 종류를 예를 들어 HTML 요소의 범위를 수락해야 페이지가 있다면, 당신은 페이지에 대해 ASP.NET 요청 유효성 검사를 비활성화해야합니다. 이렇게 여러 페이지가있는 경우, 당신이 동의 할 경우에만 HTML 요소를 허용하는 필터를 만듭니다.+텍스트 입력 필드의 어떤 종류를 예를 들어 HTML 요소의 범위를 수락해야 페이지가 있다면, 페이지에 대해 ASP.NET 유효성 검사를 요청시 비활성화해야. 이렇게 여러 페이지가있는 경우, 동의 할 경우에만 HTML 요소를 허용하는 필터를 만.
 \\ \\
   * 안전 제한된 HTML 입력   * 안전 제한된 HTML 입력
-  - ASP.NET 요청 유효성 검사를 비활성화 ValidateRequest="false"로 하는 특성을 @ Page로 지시.+  - ASP.NET 유효성 검사를 요청시 비활성화 ValidateRequest="false"로 하는 특성을 @ Page로 지시.
   - 문자열 입력 인코딩 HtmlEncode 방법.   - 문자열 입력 인코딩 HtmlEncode 방법.
-  - 사용 StringBuilder을 고 전화를 교체 선택적으로 허용 할 HTML 요소에 인코딩을 제거하는 방법. +  - 사용되는 StringBuilder을 불러오고 교체 선택적으로 허용 할 HTML 요소에 인코딩을 제거하는 방법.
- +
-  <%@ Page Language="C#" ValidateRequest="false"%> +
-   +
-  <script runat="server"> +
-   +
-    void submitBtn_Click(object sender, EventArgs e) +
-    { +
-      // Encode the string input +
-      StringBuilder sb = new StringBuilder( +
-                              HttpUtility.HtmlEncode(htmlInputTxt.Text)); +
-      // Selectively allow  <b> and <i> +
-      sb.Replace("&lt;b&gt;", "<b>"); +
-      sb.Replace("&lt;/b&gt;", ""); +
-      sb.Replace("&lt;i&gt;", "<i>"); +
-      sb.Replace("&lt;/i&gt;", ""); +
-      Response.Write(sb.ToString()); +
-    } +
-  </script> +
- +
-<html> +
-  <body> +
-    <form id="form1" runat="server"> +
-      <div> +
-        <asp:TextBox ID="htmlInputTxt" Runat="server"  +
-                     TextMode="MultiLine" Width="318px" +
-                     Height="168px"></asp:TextBox> +
-        <asp:Button ID="submitBtn" Runat="server"  +
-                     Text="Submit" OnClick="submitBtn_Click" /> +
-      </div> +
-    </form> +
-  </body> +
-</html>+