정보실

웹학교

정보실

javascript XSS에 대한 확실한 안내서

본문

사이트 간 스크립팅 공격에 대한 가이드입니다. 그들은 어떻게 작동합니까? 어떻게 방지 할 수 있습니까?


크로스 사이트 스크립팅이라고 하는 XSS 란 무엇입니까? 


XSS는 사용자 입력의 안전하지 않은 취급으로 인해 웹 사이트 (귀하의 주의를 기울이지 않으면 웹 사이트)가 사용자를 공격하기 위한 벡터로 사용될 수 있는 특정 종류의 공격을 정의하는 데 사용하는 용어입니다.


기본적으로 나쁜 행위자 (공격자)는 코드에 남겨둔 취약점을 이용하여 어떤 방식으로든 사이트에 JavaScript를 삽입 할 수 있습니다.


이 취약점을 이용하여 사용자 정보를 훔칠 수 있습니다.


XSS 취약점이 어떻게 악용되는지에 따라 3 가지 주요 XSS 공격 유형이 있습니다.

  • 지속적인 XSS
  • 반영된 XSS
  • DOM 기반 XSS

우리는 그들에 관한 모든 것을 곧 보게 될 것입니다.


XSS가 왜 위험한가요? 


웹 사이트가 있다고 상상해보십시오. 공격자는 어떻게 든 웹 사이트에서 제공하는 JavaScript 코드를 삽입 할 수 있으며, 사용자의 브라우저에 의해 사용자의 의지 없이 알 수 있습니다.


이것은 매우 위험합니다.


XSS 취약성 수정에 대한 태만으로 인해 사이트가 공격 경로로 사용될 수 있으며 사용자 정보가 위험에 노출됩니다.


특히, 누구나 페이지에 JavaScript를 삽입 할 수 있으면 웹 사이트와 연결된 사용자의 쿠키에 액세스하여 그 안에 포함 된 정보를 읽을 수 있습니다. 그리고 이것을 자신의 서버로 보냅니다. 또한 키보드 이벤트를 수신하고 사용자가 페이지에 입력하는 모든 사람에게 액세스하여 가져 오기 또는 XHR을 사용하여 공격자의 서버로 보낼 수 있습니다. 예를 들어 사용자 이름과 비밀번호. 또한 DOM을 조작 할 수 있으며 이 기능으로 많은 나쁜 일을 수행 할 수 있습니다.


XSS는 프론트 엔드 또는 백엔드 문제입니까? 


둘 다입니다. 프론트 엔드와 백엔드를 모두 포함하는 웹 사이트 아키텍처 문제입니다.


XSS 공격 예제 


XSS는 기본적으로 사용자가 정보를 입력하여 백엔드에 저장 한 후 다시 표시 할 수 있도록 설정하면 활성화됩니다.


블로그가 있고 사용자가 블로그에 댓글을 달 수 있다고 가정하십시오. 사용자가 입력 한 콘텐츠를 맹목적으로 받아들이는 경우 악의적 인 사용자는 <script> </ script> 안에 포함 된 가장 기본적인 형태로 JavaScript 스니펫을 입력 할 수 있습니다. 예를 들어 <script> alert ( 'test') </ script>입니다.


이 주석을 데이터베이스에 저장하고 페이지를 다시 로드 할 때 (예 : 아무런 예방책이 없는 경우) 해당 페이지를 로드하는 모든 사용자가 해당 JavaScript 스니펫을 실행합니다.


예제를 만들기 위해 간단한 alert() 호출을 사용했지만 위에 나열된 것처럼 사용자는 모든 종류의 스크립트를 입력 할 수 있습니다. 이 시점에서 사이트가 손상되었습니다.


영구 XSS 란 무엇입니까? 


영구 XSS는 우리가 야생에서 발견하는 3 가지 XSS 중 하나입니다. 블로그 포스트 예제에서 위에서 설명한 것입니다.


이 경우 취약점에 대한 코드가 데이터베이스 또는 다른 소스에 저장되어 사용자가 호스팅 합니다.


누군가가 자바 스크립트 스니펫을 입력하면 별도의 조치 없이 사이트에서 자동으로 서비스를 제공합니다.


XSS는 무엇입니까? 


반영된 XSS는 최종 사용자에게 스크립트가 포함 된 링크를 제공하여 사이트의 취약점을 즉시 악용할 수 있는 방법입니다.


이러한 방식으로 공격자는 다음과 유사한 링크를 제공합니다.


yoursite.com/?example=<script>alert('test')</script>

사이트에서 예제 GET 변수를 사용하여 무언가를 수행하고 페이지에 표시하고 값을 확인 및 삭제하지 않으면 해당 스크립트가 사용자의 브라우저에서 실행됩니다.


일반적인 예는 검색 양식입니다. / search URL에있을 수 있으며 GET 용어 변수를 사용하여 검색어를 수락 할 수 있습니다.


다른 사람이 검색 할 때 <term> 검색 한 문자열을 표시 할 수 있습니다. 이제 값을 삭제하지 않으면 문제가 있는 것입니다.


스팸 / 피싱 이메일은 이 XSS 공격의 일반적인 매체입니다. 물론 사이트가 더 크고 중요할수록 해커는 더 자주 해킹을 시도합니다.


DOM 기반 XSS 란 무엇입니까? 


지속적인 XSS를 사용하면 공격 코드를 서버로 보내야 합니다. 반영된 XSS에서도 마찬가지입니다.


DOM 기반 XSS는 악성 코드가 서버로 전송되지 않는 일종의 XSS입니다. URL의 조각 부분을 사용하거나 document.URL / document.location.href를 참조하여 이 문제가 발생하는 것이 일반적입니다. 현대의 브라우저가 자동으로 주소 표시 줄에서 JS를 이스케이프하므로 온라인에서 찾은 일부 예제가 더 이상 작동하지 않습니다. 그들은 당신이 그것을 이스케이프 처리하는 경우에만 작동합니다. 그것은 무섭습니다 (하지 마십시오!).


간단한 작업 예는 다음과 같습니다. http://127.0.0.1:8081/testxss.html에서 청취중인 페이지가 있다고 가정하십시오. 클라이언트 측 JavaScript는 URL의 조각 부분에 전달 된 테스트 변수를 확인합니다.


http://127.0.0.1:8081/testxss.html#test=something 



#test = something 값은 서버로 전송되지 않습니다. 현지에만 있습니다. 지속적 / 반영된 XSS가 작동하지 않습니다. 그러나 스크립트가 다음을 사용하여 해당 값에 액세스한다고 가정하십시오.

const pos = document.URL.indexOf("test=") + 5;
const value = document.URL.substring(document.URL.indexOf("test=") + 5, document.URL.length)


DOM에 직접 작성하십시오.


document.write(value)


누군가가 다음과 같이 URL을 호출 할 때까지 모두 괜찮습니다.


http://127.0.0.1:8081/testxss.html#test= 


이제 document를 참조하여 발생하는 자동 이스케이프 덕분에 이 특정 경우 URL이 발생하지 않습니다.


%3Cscript%3Ealert('x')%3C/script%3E

페이지에 인쇄됩니다. 값이 이스케이프되어 HTML로 해석되지 않습니다.


그러나 어떤 이유로 document.URL 값을 이스케이프 처리하면 JavaScript가 실행될 때 문제가 발생합니다. 모든 JS는 사용자 브라우저에서 실행될 수 있습니다.


오래된 브라우저에서는 주소 표시 줄에 JS를 자동 이스케이프 처리하지 않았기 때문에 훨씬 큰 문제였습니다. 


정적 사이트는 XSS에 취약합니까? 


예! 실제로 모든 종류의 사이트. 정적이라고 해서 다른 소스에서 로드 된 정보가 없다는 의미는 아닙니다. 예를 들어 데이터베이스가 없어도 자체 양식이나 주석을 롤업 할 수 있습니다.


또는 HTTP GET 또는 POST 변수의 입력을 허용하는 검색 기능이 있을 수 있습니다. 데이터베이스가 없어도 면역력이 없습니다.


XSS를 어떻게 방지 할 수 있습니까? 


사용할 수 있는 3 가지 기술이 있습니다.

  • 부호화
  • validation
  • CSP

데이터를 이스케이프 처리하기 위해 인코딩이 수행됩니다. 이렇게 하면 <script>와 같이 %3Cscript %3E로 인코딩되므로 브라우저가 JavaScript를 해석하지 않습니다.


일반적으로 인코딩은 항상 수행해야 합니다.

서버 측 프레임 워크는 일반적으로 이 기능을 제공하는 도우미 기능을 제공합니다.


클라이언트 측 JavaScript에서는 사용 사례에 따라 다른 인코딩 메커니즘을 사용합니다.


HTML 요소에 내용을 추가해야 하는 경우 가장 좋은 방법은 textContent 속성을 사용하여 해당 요소에 사용자 생성 입력을 할당하는 것입니다. 브라우저는 당신을 위해 모든 탈출을 수행합니다 :


document.querySelector('#myElement').textContent = theUserGeneratedInput


요소를 작성 해 야하는 경우 document.createTextNode()를 사용하십시오.

const el = document.createTextNode(theUserGeneratedInput)


HTML 속성에 내용을 추가 해야 하는 경우 요소의 setAttribute() 메소드를 사용하십시오.

document.querySelector('#myElement').setAttribute('attributeName', theUserGeneratedInput)


URL에 내용을 추가해야 하는 경우 window.encodeURIComponent() 함수를 사용하십시오.


window.location.href = window.location.href + '?test=' + window.encodeURIComponent(theUserGeneratedInput)


일반적으로 이스케이프를 사용하여 입력을 필터링 할 수 없는 경우 유효성 검사가 수행됩니다. 일반적인 예로는 사용자가 HTML로 페이지의 내용을 정의 할 수있는 CMS가 있습니다. 당신은 그것을 벗어날 수 없습니다.


블랙리스트 또는 화이트리스트 전략을 사용하여 유효성을 검사합니다. 차이점은 블랙리스트를 사용하면 허용하지 않을 태그를 결정한다는 것입니다. 허용 목록을 사용하면 허용 할 태그를 결정합니다. 블랙리스트는 오류가 발생하기 쉽고 복잡하며 미래를 보장하지 않기 때문에 화이트리스트가 더 안전합니다.


CSP는 콘텐츠 보안 정책을 의미합니다. 안전하고 신뢰할 수 있는 소스에서 제공되는 JavaScript 코드 만 실행하도록 브라우저에서 구현 한 새로운 표준이며 코드에서 인라인 JavaScript 실행을 허용하지 않을 수 있습니다. 예를 들어 위의 XSS 익스플로잇을 허용 한 JavaScript입니다.


CSP는 페이지를 제공 할 때 콘텐츠 보안 정책 HTTP 헤더를 추가하여 웹 서버에서 활성화됩니다.


https://flaviocopes.com/xss/ 






  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

페이지 정보

조회 33회 ]  작성일19-09-04 10:08
XSS

웹학교