Anti-Cross Site Scripting Library V3.1

웹 어플리케이션 2009. 12. 9. 10:06 Posted by TEAMCR@K

1.Anti-Cross Site Scripting Library 란?
The Microsoft Anti-Cross Site Scripting Library V3.1 (Anti-XSS V3.1) XSS취약점으로부터 ASP.NET기반의 웹 어플리케이션을 대응하는데 사용되는 인코딩 기능을 가지고 있는 라이브러리 이다. XSS 공격들을 대응하는데, 허용되는 패턴과 가능한 패턴들을 정의하여 잠재적인 위험성이 존재하는 패턴들에 대해서 인코딩된 결과 값으로 표시한다.


2.적용 방법
Step1. 출력값이 생성되는 ASP.NET 코드를 검사

XSS(Cross Site Scripting) 취약점은 출력물의 결과값에 따라서 발생한다. 그렇기 때문에 출력문을 처음 검사를 해야 한다. .NET 환경에서 일반적으로 사용되는 패턴은 “Response.Write” 와 “<%=” 이다.


Step2. 신뢰하지 않는 입력값이 결과값에 포함이 되어 있는지 결정

신뢰하지 않는 입력값이 아래와 같은 변수에 사용되었는지 판단한다.

 Application variables

 Cookies

 Databases

 Form fields

 Query String variables

 Session variables


Step3. Encoding 메소드 사용할지 결정

아래 메소드 표를 참고하여 신뢰하지 않는 입력값에 따라서 메소드를 선택한다. 예를 들면 HTML 속성에 값이 입력 되었다면, Microsoft.Security.Application. HtmlAttributeEncode 메소드를 사용하고, Javascript 안에 값이 입력 된다면, Microsoft.Security.Application.JavaScriptEncode 메소드를 사용한다.

   // 취약한 소스 예제
  // HTML 속성값에 신뢰하지 않는 값이 입력될 경우
  Literal1.Text = ”<hr size='[untrusted input here]'></hr>”;

  // 수정된 소스 예제
  Literal1.Text = ”<hr size='+Microsoft.Security.Application.AntiXss.HtmlAttributeEncode([untrusted input here])+'></hr>”;



다음은 Encoding 메소드 사용시 관련된 내용 및 패턴 예제입니다.

 Encoding 메소드  관련 내용  패턴 예제
 HtmlEncode(String)  HTML 속성 이외에 신뢰하지 않는 입력값이 HTML출력에 사용할  <a href=”http://www.contoso.com”>Click Here [Untrusted input]</a>
 HtmlAttributeEncode(String)  신뢰하지 않는 입력값이 HTML 속성에 사용할  <hr noshade size=[Untrusted input]>
 JavaScriptEncode(String)  신뢰하지 않는 입력값이 Javascript 문에 사용할  

<script type=”text/javascript”>

[Untrusted input]

</script>
 UrlEncode(String)  신뢰하지 않는 입력값이 URL 사용할 <a href=”http://search.msn.com/results.aspx?q=[Untrusted input]”>Click Here!</a>
 VisualBasicScriptEncode(String)  신뢰하지 않는 입력값이 VBScript 문에 사용할  <script type=”text/vbscript” language=”vbscript”>

[Untrusted input]

</script>
 XmlEncode(String)  XML 속성 이외에 신뢰하지 않는 입력값이 XML출력에 사용할시  <xml_tag>[Untrusted input]</xml_tag>
 XmlAttributeEncode(String)  신뢰하지 않는 입력값이 XML 속성에 사용할  <xml_tag attribute=[Untrusted input]>Some Text</xml_tag>


Step4. 출력값 인코딩 구현

출력값에 인코딩을 적용할 시에 주의할 점이 두개 있다.
1) 출력물에는 한번만 구현 해야 한다.
2) 아래 예제와 같이 입력값을 저장하는 변수에 구현하는 것이 아니라, 실제 출력되는 부분에 구현하라.


// 잘못 구현한 예제
  protected void Button1_Click(object sender, EventArgs e)
  {
    // Read input
    String Input = TextBox1.Text;
    // Encode untrusted input
    Input = Microsoft.Security.Application.AntiXss.HtmlEncode(Input);
   
    // Process input
    ...
   
    // Write Output
    Response.Write(”The input you gave was” + Input );

   
  }

  // 잘 구현한 예제
  protected void Button1_Click(object sender, EventArgs e)
  {
    // Read input
    String Input = TextBox1.Text;

    // Process input
    ...
   
    // Encode untrusted input and write output
    Response.Write(”The input you gave was” + Microsoft.Security.Application.AntiXss.HtmlEncode(Input));

   
  }

 




상세내역을 보실려면 아래 "더보기"로 펼치시면 됩니다.



3.참고 자료
가. MSDN 블로그
http://blogs.msdn.com/sdl/archive/2009/09/23/new-and-improved-antixss-3-1-now-with-sanitization.aspx

나. MSDN 다운로드 페이지
http://www.microsoft.com/downloads/thankyou.aspx?familyId=051ee83c-5ccf-48ed-8463-02f56a6bfc09&displayLang=en

본 내용은 MSDN 을 참고하여 내용을 번역 및 추가하였습니다.