2008-09-10 3 views

답변

85

번호

몇 가지 태그 (질문 정말 지점), 대해 HTMLEncode 단순히 모든 XSS 공격을 포함하지 않습니다를 허용하는 주제를 옆으로 퍼팅. 예를 들어

고려 서버 생성 클라이언트 측 javascript - 서버가 htmlencoded 값을 동적으로 출력합니다. 직접 클라이언트 쪽 자바 스크립트로, htmlencode 주입 스크립트 실행을 중지하지 않습니다.

다음, 다음 의사 생각 : 지금

<input value=<%= HtmlEncode(somevar) %> id=textbox> 

을 경우 그 즉시 명확하지,의 somevar (물론, 사용자가 보낸)는

a onclick=alert(document.cookie) 

에 예를 들어 설정되어있는 경우 결과 출력은 분명히 작동 할 것입니다

<input value=a onclick=alert(document.cookie) id=textbox> 

입니다. 분명히, 이것은 (거의) 다른 스크립트 일 수 있습니다 ... 그리고 HtmlEncode는별로 도움이되지 않습니다.

DOM 기반 XSS (예 : # 값을 기반으로 악성 스크립트가 클라이언트에서 동적으로 생성 됨)라고하는 XSS의 세 번째 버전을 포함하여 고려해야 할 몇 가지 추가 벡터가 있습니다. 또한

UTF-7 형 공격에 대해 잊지 마세요 - 공격이

+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4- 

가 인코딩하는 것이 훨씬 아무것도 ...

솔루션

같은 (물론, 적절한 외에 보인다 제한적인 화이트리스트 입력 유효성 검사)은 인코딩을 수행합니다. 인코딩 : HtmlEncoding is great 출력 컨텍스트가 HTML이거나 JavaScriptEncoding, VBScriptEncoding 또는 AttributeValueEncoding이 필요한 경우 등

MS ASP.NET을 사용하는 경우 모든 필요한 컨텍스트 인코딩 방법을 제공하는 Anti-XSS 라이브러리를 사용할 수 있습니다. 모든 인코딩이 HTTP 모두, 사용자 입력에 제한뿐만 아니라 데이터베이스, 텍스트 파일에서 값을 저장 등

아, 그리고 캐릭터 세트를 명시 적으로 설정하는 것을 잊지 마세요되어서는 안된다는

주 나는 'http://ha.ckers.org/xss.html

+1

글자는 처음에 잘못되었습니다. id = 텍스트 상자> 하지 <입력 값 = "<% = 대해 HTMLEncode (의 somevar)"%> ID = 텍스트 상자> 의 에디터가 예를 들어이 포함되어 있는지 알 수없는 경우 빈. – Erik

+1

그게 정확히 포인트입니다 - HTMLEncode는 실수로부터 당신을 보호하지 않습니다. 물론, 프로그래머는 somevar에 23을 포함시킬 것을 기대했는데, 그 중 공허한 것을 공격하기로 결정한 악의적 인 공격자가 ... – AviD

+0

SOMEVAR에이 텍스트가 포함되어있는 이미지를 동봉하는 것이 도움이되지 않습니다. "onclick ="alert(); ""| 그러면 유효한 태그처럼 렌더링됩니다. – Espo

-1

저는 그렇게 생각하지 않습니다. Html Encode는 모든 기능 문자 (브라우저에서 코드로 해석 할 수있는 문자)를 브라우저에서 파싱 할 수없는 엔터티 참조로 변환하므로 실행할 수 없습니다.

&lt;script/&gt; 

위의 사항을 브라우저에서 실행할 수있는 방법은 없습니다.

** 브라우저의 버그는 당연히 자신의 경우를 제외하고. * 당신이 합격을 인코딩하는 경우

+0

또는 Javascript가 어떻게 든 GUI 용도로 사용자 입력을 변경하는 데 사용되는 경우. XSS 취약점에 대해 처음 엔 < and >으로 인코딩되었지만,이 기능을 통과하면 다시 대체되었습니다! 그래서 ... XSS 예방이 진행됩니다. :) – verix

3

. (플랫폼과 htmlencode 구현에 따라 다름) 그러나 유용한 웹 애플리케이션은 너무 복잡하여 모든 부분을 확인하는 것을 잊기 쉽습니다. 또는 제 3 자 구성 요소가 안전하지 않을 수 있습니다. 아니면 인코딩을 했어도 코드 경로를 사용하지 않아 다른 곳에서 잊어 버렸을 수도 있습니다.

입력면에서 내용을 확인할 수도 있습니다. 그리고 데이터베이스에서 읽은 내용을 확인하고 싶을 수도 있습니다.

8

을 표시하기 전에 모든 사용자 입력을 체계적으로 인코딩하면 안전합니다. 당신은 여전히 ​​100 % 안전하지 않습니다.
당신이 처리 할 사용자가 이미지 나 굵은 텍스트 또는 사용자의 입력을 필요로하는 기능을 게시 할 수 있도록 일부 태그 인코딩되지 않은 가자 할 때 발생하는 추가 문제에서

(자세한 내용은 Avid의 포스트 @ 참조) 인코딩되지 않은 마크 업으로 변환 (또는 변환)됩니다.

어떤 태그가 허용되고 어떤 태그가 아닌지 결정하기 위해 의사 결정 시스템을 설정해야하며 허용되지 않은 태그가 통과 할 수있는 방법을 찾아 낼 가능성이 항상 있습니다.

조엘의 조언 인 Making Wrong Code Look Wrong을 따르거나 처리되지 않은 사용자 데이터 (정적 유형 지정)를 출력 할 때 경고/컴파일하지 않음으로써 your language helps you 일 경우 도움이됩니다.

+0

여기에는 일부 태그를 우회하는 것과 관련하여 좋은 점이 포함되어 있지만 질문에 대한 대답은 잘못되었습니다. 내 대답보기 ... – AviD

+0

OP에 댓글을 추가 했으므로 대신 답을 수락합니다. 그리고 귀하의 답변에 대한 게시물에 링크를 추가했습니다. – Pat

+0

감사합니다 :) 보안 담당자로서, 나는 그 사람이 올바른지 확인하고 싶습니다 ... – AviD

1

다른 모든 사람들이 언급했듯이 모든 사용자 입력을 표시하기 전에 사용자 입력을 인코딩하면 안전합니다. 여기에는 사용자 입력에 의해 변경 될 수있는 데이터베이스에서 검색된 모든 요청 매개 변수와 데이터가 포함됩니다.

mentioned by Pat 때때로 모든 태그가 아닌 일부 태그 만 표시 할 수 있습니다. 이를 수행하는 일반적인 방법 중 하나는 Textile, Markdown 또는 BBCode과 같은 마크 업 언어를 사용하는 것입니다. 그러나 마크 업 언어조차도 XSS에 취약 할 수 있습니다.

# Markup example 
[foo](javascript:alert\('bar'\);) 

당신은 내가 &을 구문 분석하는 몇 가지 기존 라이브러리를 찾는 추천을 통해 "안전한"태그를하게하기로 결정하는 경우

출력하기 전에 코드를 소독. 거기에 a lot of XSS vectors 거기에 당신의 살균제가 상당히 안전하기 전에 감지해야 할 것입니다.

1

출력 필터링을 처리 할 수있는 타사 라이브러리를 찾는 데 필요한 두 번째 메타 뷰다의 조언. HTML 문자를 중립화하는 것은 XSS 공격을 막는 좋은 방법입니다.그러나 메타 문자를 변환하는 데 사용하는 코드는 회피 공격에 취약 할 수 있습니다. 예를 들어 유니 코드 및 국제화를 제대로 처리하지 못하는 경우입니다.

homebrew 출력 필터는 고전적인 단순한 실수 필터 인 <을 잡아내는 것이지만 "사용자가 제어하는 ​​출력을 HTML 태그의 속성 공간으로 나눌 수 있습니다. 자바 스크립트를 DOM.

0

: 헤더와 메타 태그, 그렇지 않으면 당신은 여전히 ​​

... 좀 더 정보, 꽤 명확한 목록 (지속적으로 업데이트)를 UTF-7의 취약점을해야합니다, RSnake의 치트 시트를 확인 d는 HTML 정수기 (http://htmlpurifier.org/)를 제안하고 싶습니다. html을 필터링하는 것이 아니라 b asically 토큰 화하고 다시 컴파일합니다. 진정한 산업력입니다.

유효한 html/xhtml 출력을 보장 할 수있는 추가 이점이 있습니다.

또한 n'thing 섬유, 그것의 훌륭한 도구와 나는 그것을 항상 사용하지만 html 정화기 너무 그것을 실행할 수 있습니다.

내가 토큰의 의미를 이해하지 못했다고 생각합니다. HTML 정수기는 '필터링'만하는 것이 아니라 실제로 HTML을 재구성합니다. http://htmlpurifier.org/comparison.html

1

아니오, 일반적인 HTML 토큰 만 인코딩하면 XSS 공격으로부터 사이트가 완전히 보호되지 않습니다. 예를 들어,이 XSS 취약점이 google.com에서 발견, 참조 :

http://www.securiteam.com/securitynews/6Z00L0AEUE.html

취약점의 유형에 대한 중요한 것은 공격자가 UTF-7을 사용하여 자신의 XSS 페이로드를 인코딩 할 수 있는지, 그리고 당신 경우 페이지에서 다른 문자 인코딩을 지정하지 않으면 사용자의 브라우저가 UTF-7 페이로드를 해석하고 공격 스크립트를 실행할 수 있습니다.

0

확인해야 할 다른 한 가지는 입력 내용의 출처입니다. 리퍼러 문자열 (대부분의 경우)을 사용하여 자신의 페이지에서 왔는지 확인할 수 있지만 양식에 숨겨진 임의의 숫자 또는 무언가를 입력 한 다음 세션을 설정할 수있는 변수를 사용하여 확인할 수 있습니다. 입력이 귀하의 사이트에서오고 일부 피싱 사이트에서 오지는 않습니다.

관련 문제