Cross-Site Scripting (XSS) 및 JavaScript Defense에 대한 소개

XSS(XSS)는 OWASP Top 10에서 가장 오래된 웹 보안 취약점 중 하나입니다. XSS 공격은 공격자가 다른 사용자가 볼 웹 페이지에 악의적인 클라이언트 측 스크립트를 주사 할 수 있도록 합니다. 이 스크립트는 세션 토큰을 훔칠 수 있으며, 사용자가 phishing 사이트, deface 페이지를 훔쳐서 악성 사이트를 설치하거나 악성코드를 설치합니다. 서버 측 위생은 중요하지만, JavaScript는 클라이언트 측에서 피벗 역할을 수행하여 이러한 공격을 방지하기 위해 XSS를 사용하여 이러한 공격을 방지합니다. XSS는 XSS를 사용하여 포괄적인 응용 프로그램을 사용하여 포괄적인 응용 프로그램을 제공합니다.

XSS의 세 가지 유형 이해

예방에 다이빙하기 전에 XSS의 3 가지 범주를 이해하는 것이 필수적입니다. 저장, 반사 및 DOM 기반. 각은 약간 다른 감지 및 예방 접근 방식을 요구합니다.

XSS를 저장

저장 (인기) XSS는 악성 입력이 영구적으로 서버 (예를 들어, 데이터베이스, 포럼 게시물 또는 코멘트)에 저장되고 나중에 적절한 위생없이 사용자에게 제공. 공격 탑재는 저장된 콘텐츠를보고하는 사람의 브라우저에서 실행합니다.

XSS를 반영

XSS는 웹 서버에서 악의적인 스크립트가 반영될 때, 일반적으로 URL 매개 변수 또는 양식 제출을 통해 발생합니다. 공격자는 기술 링크를 클릭하여 피해자를 감수하고, 주사된 코드는 즉시 실행됩니다. 저장되지 않은 XSS, 페이로드는 영구하지 않습니다.

DOM 기반 XSS

DOM 기반 XSS는 순으로 클라이언트 측 취약점입니다. 공격 탑재량은 피해자의 브라우저에서 DOM 환경을 수정합니다. 악의적인 코드는 서버가 결코 접촉하지 않습니다. 사용자 입력을 안전하게 처리하지 않는 클라이언트 측 JavaScript에서 시작됩니다 (예: , , 또는 ]).

XSS 공격을 JavaScript로 탐지

탐지는 손상의 앞에 의심스러운 활동을 식별하는 것에 관하여 입니다. 자바 스크립트는 사용자 입력, 궤도 DOM mutations를 감시하고, 입장 점에 유효한 자료. 클라이언트 측 탐지가 모든 공격을 붙잡을 수 없는 동안 (특히 공격자 기술이 서버에 직접 요구한 경우에), 그것은 방어의 귀중한 첫번째 선을 제공합니다.

입력 검증 및 위생

항상 검증 및 사용자 입력을 만족시키기 전에 클라이언트 측에 처리. 사용 대신 스크립트 실행을 방지하기 위해. 다음 기능 스트립 위험한 문자 문자열에서:

function sanitizeInput(input) {
 const div = document.createElement('div');
 div.textContent = input;
 return div.innerHTML;
}

]을 설정하기 때문에이 작품은 HTML 태그를 해석하지 않습니다. 그것은 모든 것을 일반 텍스트로 취급합니다. 결과 은 HTML 특수 문자의 탈출 된 버전을 포함 (예 : , , ).

Suspicious Elements에 대한 DOM Mutation 모니터링

공격자는 종종 태그 또는 이벤트 핸들러 (], ]) DOM에 주사합니다. API를 사용하여 예상치 못한 요소 삽입을 볼 수 있습니다. 기본 예:

const observer = new MutationObserver((mutations) => {
 mutations.forEach((mutation) => {
 mutation.addedNodes.forEach((node) => {
 if (node.nodeType === 1) { // element node
 if (node.tagName === 'SCRIPT') {
 console.warn('Potential XSS: a script element was injected via DOM.');
 node.remove(); // or log and analyze
 }
 // Check for dangerous attributes
 if (node.hasAttribute('onerror') || node.hasAttribute('onload')) {
 console.warn('Suspicious event handler attribute detected.');
 }
 }
 });
 });
});
observer.observe(document.body, { childList: true, subtree: true });

주의: ]]를 통해 스크립트 차단은 clever attackers에 의해 우회되고 합법적인 기능을 깰 수 있습니다. 이 작업을 기본 예방 메커니즘보다 모니터링 도구로 사용하십시오.

URL 및 Hash 매개 변수 검증

DOM 기반 XSS의 경우, URL 구성 요소를 안전하게 ]을 사용하여 HTML에 직접 삽입 값을 방지합니다. 실행 가능한 코드를 전달하는 시도를 감지:

const params = new URLSearchParams(window.location.search);
const userParam = params.get('name');
if (userParam && /[<>"'\/]/.test(userParam)) {
 console.warn('Potential XSS in parameter: ' + userParam);
 // Do not use this value in the DOM without encoding
}

XSS 공격을 자바스크립트로 방지

예방은 다중 계층 접근을 요구합니다. JavaScript는 혼자 완전히 응용 프로그램을 보안 할 수 없지만 적절한 백엔드 위생과 결합 할 때 [FLT : 0]]Content Security Policy (CSP) [[FLT : 1], 극적으로 위험을 줄일 수 있습니다.

DOM에 삽입하기 전에 모든 사용자 제어 데이터

황금 규칙: 절대로 도무에 위탁되지 않는 자료를 직접 삽입하지 마십시오. 안HTML 대신 안전한 DOM 방법을 사용하십시오.

또는 ]

const userInput = getUserInput();
const safeText = document.createTextNode(userInput);
document.getElementById('output').appendChild(safeText);

를 사용해야 할 때, 도서관과 산

HTML (예: 풍부한 텍스트 편집기에서)를 렌더링하는 데 절대적으로 필요한 경우, DOMPurify]와 같은 신뢰할 수있는 위생 라이브러리에 의존. DOMPurify 널리 사용, 안전한 HTML을 보존하는 동안 악성 코드를 제거 전투 테스트 라이브러리.

// Example with DOMPurify (install via npm or CDN)
const dirty = '<img src=x onerror="alert(1)">';
const clean = DOMPurify.sanitize(dirty);
document.getElementById('content').innerHTML = clean;

DOMPurify는 입력, 위험한 태그 및 속성을 스트라이프핑하고, 만 허용 된 요소 반환에 의해 작동합니다. GitHub]에서 DOMPurify를 참조하십시오.

위험한 JavaScript 기능을 피하십시오.

일부 JavaScript 방법 및 속성은 XSS를 활성화하기위한 악명적이다. 피하거나 엄격하게 제어 :

  • ] - ] 또는 제대로 위생을 사용하십시오.
  • ], ] - 같은 규칙.
  • - 사용자 입력으로 사용하지 않는.
  • - 입력이 혼잡되면 악용 될 수 있습니다.
  • / 문자열 코드 - 피; 대신 함수 참조를 사용합니다.
  • constructor] - 에 유사합니다.

JavaScript를 통해 Content Security Policy (CSP) 구현? 추천되지 않음

CSP는 스크립트가 실행될 수 있는 제한하는 브라우저 메커니즘입니다. 일반적으로 HTTP 헤더를 통해 설정되지만, 태그를 사용하여 설정하거나 동적으로 요소를 생성하여 JavaScript를 통해 설정할 수 있습니다. 그러나, 자바스크립트에서 CSP를 설정하면 이미 몇 가지 컨트롤이 비활성화 될 수 있기 때문에 더 적은 안전합니다. 항상 HTTP 헤더를 선호합니다. CSP (예: 개발 중)를 강제로 JavaScript를 사용해야 하는 경우, 개발 페이지에 매우 초기 로드가 됩니다.

const meta = document.createElement('meta');
meta.httpEquiv = 'Content-Security-Policy';
meta.content = "default-src 'self'; script-src 'self' 'unsafe-inline'"; // Be very careful with 'unsafe-inline'
document.head.appendChild(meta);

생산에 대한, 웹 서버 또는 역 프록시에서 CSP를 구성합니다. MDN CSP documentation은 종합적인 지도를 제공합니다.

추가 보안 조치

JavaScript-specific tactics를 넘어 완전한 XSS 예방 전략은 이러한 중요한 조치를 포함합니다.

  • 서버 측에서 검증된 Always.] 클라이언트 측 유효성 검사는 우회될 수 있습니다. 클라이언트 데이터를 절대로 신뢰하지 마십시오.
  • 적절한 HTTP 응답 헤더를 사용합니다. ], ]], 특히 ]].
  • 사용자 데이터를 렌더링하는 때마다 출력 인코딩. 컨텍스트 사정: HTML 엔티티티티티티, URL 인코딩, JavaScript 문자열 인코딩 등
  • Keep Dependencies update. Vulnerable JavaScript 라이브러리(예: jQuery의 이전 버전)는 일반적인 XSS 벡터입니다. npm 감사 또는 유사한 도구를 사용하십시오.
  • XSS 보호 내장 프레임 워크를 사용합니다. React, Angular, Vue는 기본적으로 출력을 자동으로 탈출합니다. 그러나 또는 ]와 함께 신중하게 계산됩니다.
  • ] 엄격한 CSP를 구현합니다. ]]와 ]]를 피하십시오. 인라인 스크립트에 대한 아무런도 또는 해시를 사용하십시오.

Real-World 예제: 보안 코멘트 렌더링

사용자가 다른 사람에게 표시된 메시지를 제출하는 블로그 의견 시스템을 고려하십시오. 공격자는 ]를 삽입하려고 할 수 있습니다. 다음은 백엔드와 통합 된 JavaScript 접근법입니다.

  1. Frontend 제출: 서버로 전송하기 전에 를 사용하여 Sanitize (하지만 서버는 여전히 만족해야합니다).
  2. Server 반환 데이터: 백엔드는 HTML-encode를 작성해야 합니다.
  3. Client 렌더링: ] 또는 안전한 템플릿 엔진을 사용합니다. ]를 사용해서 원시 사용자 데이터로 사용하지 마십시오.
function renderComment(comment) {
 const item = document.createElement('div');
 item.className = 'comment';
 const body = document.createElement('p');
 body.textContent = comment.body; // escaped by browser
 item.appendChild(body);
 document.getElementById('comments').appendChild(item);
}

방어를 테스트

예방을 구현한 후 자동화된 스캐너 및 수동 탑재를 사용하여 응용 프로그램을 테스트합니다. 일반적인 테스트 벡터는 다음과 같습니다.

  • ] ] ] ] ] ]] ] ] ] ]] ] ] ] ] ]] ] ] ] ] ] ] ]] ]] ]]] ]] ]] ]] ] ]] ]] ]]] ]]]] [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [F
  • ] ]] ] ] ] ]] ] ] ] ] ] ] ] ] ] ] ] ]] ] ] ]] ]]
  • ] ]] ] ] ] ]] ] ] ] ] ] ] ] ] ]] ] ]] ]] ]] ]] ]] ]]] [FLT: [FLT: [FLT: [FLT: [FLT:]]]]]]]]]]] [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT:]]]]]]]]]]]]]]]]]
  • ] ]] ]] ]] ]] ]] ] ]] ]] ]] ] ]] ] ]] ]] ]] ]]] ]] ]] ]]
  • ] ]] ]] ]] ]] ]] ] ]] ]] ]] ] ] ] ]] ]] ]] ]] ]] ]] ]] ]]] [FLT: [FLT: [FLT:]]]]]]]]] [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT: [FLT:]]]]]]]]]]

브라우저 개발자 도구를 사용하여 DOM을 검사하고 급여를 방지하는 것은 탈출됩니다. 또한, CSP 집행을 통해 콘솔을 위반 보고서를 검사합니다.

관련 기사

이 웹 사이트는 귀하가 웹 사이트를 탐색하는 동안 귀하의 경험을 향상시키기 위해 쿠키를 사용합니다. 이 쿠키들 중에서 필요에 따라 분류 된 쿠키는 웹 사이트의 기본적인 기능을 수행하는 데 필수적이므로 브라우저에 저장됩니다. 또한이 웹 사이트의 사용 방식을 분석하고 이해하는 데 도움이되는 제 3 자 쿠키를 사용합니다. 이 쿠키는 귀하의 동의하에 만 브라우저에 저장됩니다. 이러한 쿠키를 거부 할 수도 있습니다. 이러한 쿠키 중 일부를 선택 해제하면 검색 환경에 영향을 미칠 수 있습니다.

더 읽기를 위해 OWASP XSS 페이지OWASP XSS 예방 열 시트]를 참조하십시오.