최근 크로스 사이트 스크립팅(XSS) 취약점이 발견된 이후, FBI와 CISA는 보안 조치를 강화하고 사이버 복원력 향상에 주력하고 있습니다. 당연하게도, 조직들은 종종 기본적인 사항을 제대로 처리하지 못하며, 이것이 바로 데이터 유출 사고가 발생하는 이유입니다.
크로스 사이트 스크립팅 공격은 웹 애플리케이션과 서비스가 요청이나 입력을 제대로 처리하지 못하거나 의도한 대로 작동하지 않을 때 발생합니다. 이러한 공격은 단순히 애플리케이션만을 노리는 것이 아니라 그 뒤에 있는 사용자들까지 위협하기 때문에 위험합니다.
크로스 사이트 스크립팅 공격과 이 주제에 대해 알아야 할 모든 것을 다루는 가이드를 소개합니다.
크로스 사이트 스크립팅(XSS) 공격이란 무엇인가요?
어떤 애플리케이션이나 웹사이트도 완벽하지 않으며, 숨겨진 결함이 존재합니다. 크로스 사이트 스크립팅 공격은 악성 코드를 전송하여 이를 악용해 오작동을 유발합니다. 이러한 공격을 통해 악의적인 행위자가 피해자의 신원을 탈취하고 심지어 사칭할 수도 있습니다.
악성 스크립트는 웹 애플리케이션 내에 숨어 있어 쉽게 탐지되지 않습니다. 애플리케이션 소스 코드에 자연스럽게 녹아들어 서비스가 신뢰할 수 없는 출처에서 유래했는지 확인하는 것을 불가능하게 만듭니다. 그 결과는 무엇일까요?
해커는 웹 브라우저가 수집한 쿠키, 사이트 토큰 및 기타 민감한 데이터에 접근할 수 있습니다. 웹사이트나 앱이 콘텐츠를 다른 위치로 전송할 경우, 해당 콘텐츠도 자동으로 가로채집니다. 게시물 아래에 댓글을 남길 수 있는 온라인 포럼과 사용자 게시판도 이 공격에 취약합니다.
크로스 사이트 스크립팅(XSS) 공격의 유형
XSS 취약점은 과거에 웜을 생성하고 애플리케이션 보안 조치를 훼손한 바 있습니다. 이들은 악성 코드를 확산시키고, 인증 정보를 피싱하며, 방어 웹사이트를 탈취할 수 있습니다.
크로스 사이트 스크립팅(XSS) 공격에는 세 가지 주요 유형이 있습니다. XSS 공격을 방지하는 방법을 배우기 전에, 여러분이 직면한 위협에 대해 알아두세요. 그 유형은 다음과 같습니다.
1. 저장형 XSS(지속형 XSS)
이는 가장 기본적이면서도 위험한 형태의 XSS 중 하나입니다. 저장형 XSS는 입력 검증 부족 시 웹 데이터베이스에 저장된 악성 코드를 의미합니다. 공격자는 웹 애플리케이션 취약점을 통해 코드를 주입하고 영구적으로 저장합니다. 피해자는 모르고 스크립트를 실행할 수 있으며, 페이로드는 HTML 코드로 웹 브라우저에 제공됩니다. 웹 페이지를 로드하여 악성 스크립트를 실행하는 순간, 모든 것이 끝납니다.
블로그 게시물에 남겨진 댓글이 대표적인 예입니다. 공격자는 URL을 첨부하고 피해자가 이를 클릭하여 댓글을 읽도록 유도할 수 있습니다. 사용자가 상호 작용하면 코드가 자동으로 실행됩니다.
2. 반사형 XSS (비지속적 XSS)
공격자의 페이로드가 웹 브라우저로 전송되는 페이로드의 일부가 되면, 이는 반사형 XSS 공격으로 변형됩니다. 요청은 브라우저에서 반사되어 HTTP 응답에 HTTP 요청의 페이로드가 포함됩니다. 해커는 사회 공학 위협, 악성 링크 및 기타 피싱 사기 전술을 조합하여 피해자를 유인해 서버 요청을 수행하게 할 수 있습니다. 이 기법의 유일한 단점은 공격자가 피해자에게 개별 페이로드를 별도로 전달해야 한다는 것입니다. 대량으로 페이로드를 전달할 수 없으며, 대부분의 반사형 XSS 공격은 소셜 미디어 네트워크에서 수행됩니다.
3. DOM 기반 XSS
DOM 기반 XSS는 공격자가 제어 가능한 소스에서 악성 자바스크립트 코드를 가져와 사용자 계정을 해킹하는 방식입니다. 이 코드는 싱크로 전달되어 동적으로 실행되며 임의로 블록을 실행합니다. 이러한 크로스 사이트 스크립팅 공격의 가장 흔한 소스는 브라우저 URL입니다. 공격자는 또한 쿼리 문자열에 페이로드를 포함시킨 취약한 페이지로 피해자를 유도하는 링크를 추가합니다. URL의 일부를 분할하고 피해자를 오도하여 추가로 조작할 수도 있습니다.
크로스 사이트 스크립팅(XSS)은 어떻게 작동하나요?
크로스 사이트 스크립팅은 취약한 웹사이트를 조작하여 사용자에게 악성 자바스크립트 코드를 반환하는 방식으로 작동합니다. 공격자가 악성 코드를 삽입하여 피해자의 브라우저 내부에서 실행하면, 해당 애플리케이션과 그로 인한 모든 상호작용을 완전히 장악할 수 있습니다.
크로스 오리진 iframe은 사용자가 alert 함수를 호출하는 것을 허용하지 않습니다. 이들은 보다 진보된 XSS 공격을 구성하는 데 사용됩니다. 공격자는 웹 애플리케이션 내에서 권한 및 사용자 접근을 제어하고 그 안에 저장된 데이터를 탈취할 수도 있습니다.
크로스 사이트 스크립팅 공격과 취약점은 공격자가 피해자를 사칭하고 네트워크 전반에 걸쳐 피해자로 위장할 수 있게 합니다. 그들은 원본 정책을 우회할 수 있습니다. 그들은 서로 다른 웹사이트들을 완전히 분리시킬 수도 있습니다.
이제 크로스 사이트 스크립팅 공격이 어떻게 작동하는지에 대한 간략한 개요를 살펴보겠습니다:
- 공격자는 악성 링크를 보냅니다. 사용자가 링크를 클릭하면 코드가 삽입되고 동적 콘텐츠가 웹 브라우저로 전달됩니다.
- 공격자의 웹 서버로 HTTP 요청을 보냅니다. 하이재커는 훔친 쿠키를 사용하여 사용자를 사칭할 수 있습니다.
- 민감한 정보에 접근하고 더 정교한 사회공학적 공격을 수행할 수 있습니다.
- 크로스 사이트 스크립팅 공격을 통해 공격자는 서로 다른 웹사이트를 분리하기 위해 설계된 동일 출처 정책을 우회할 수 있습니다. 이러한 공격은 실행하기 매우 잔혹하며 비즈니스 평판에 해를 끼칠 수 있습니다. 공격자는 콘텐츠를 변경하고 회사 이미지를 훼손하거나 실추시켜 조직을 훼손할 수 있습니다.
- 허위 정보를 유포하거나 웹사이트의 사용자 지침을 변경하여 사용자를 오도할 수도 있습니다.
XSS 공격은 특히 정부 기관, 의료 기관 또는 위기 상황에서 필수 자원을 제공하는 기업을 표적으로 삼을 경우 위험합니다.
크로스 사이트 스크립팅(XSS) 공격을 방지하는 방법?
여러 가지 접근 방식을 취할 수 있습니다. 크로스 사이트 스크립팅 공격을 방지하는 방법을 알아보세요.
- 웹 애플리케이션 및 서비스 입력을 검증하면 크로스 사이트 스크립팅 공격(XSS)을 방지하는 데 도움이 됩니다. 또한 취약점 스캐너를 사용하여 웹사이트의 다른 보안 취약점을 확인할 수도 있습니다. 이는 (XSS) 공격을 자동으로 방지하는 가장 효과적인 방법 중 하나입니다.
- XSS 공격을 방지하는 두 번째 방법은 출력 데이터를 인코딩하는 것입니다. 이는 데이터를 페이지에 작성하기 전에 수행하는 것이 이상적입니다. 사용해야 할 인코딩 유형은 작성 환경에 따라 달라집니다.
- 예를 들어, 자바스크립트 문자열 값은 HTML 컨텍스트의 값과 다른 유형의 인코딩이 필요합니다. HTML 환경에서는 화이트리스트에 포함되지 않은 값을 HTML 엔티티로 변환해야 합니다. 반면 자바스크립트 문자열 환경에서는 영숫자가 아닌 값에 대해 유니코드 이스케이프 처리를 반드시 수행해야 합니다.
- 여러 단계의 인코딩이 필요할 수 있으며, 이 과정은 올바른 순서로 적용되어야 합니다. 사용자 입력을 이벤트 핸들러에 포함시키고 HTML 및 자바스크립트 컨텍스트를 처리해야 합니다. 입력값이 도착했을 때 검증하는 방법은 다양합니다.
- 예를 들어, 사용자가 URL을 제출하고 응답으로 반환된 경우 HTTPS나 HTTP 같은 안전 프로토콜로 시작하는지 검증할 수 있습니다. 사용자가 알파벳이나 숫자로 값을 제공할 때도 검증할 수 있습니다. 예상되는 문자 집합으로 입력을 제한하여 다르게 검증할 수도 있습니다.
다음은 취할 수 있는 다른 접근법들입니다:
- 웹사이트에서 허용되는 모든 안전한 프로토콜 목록을 만들 수 있습니다. 따라서 기본적으로 인식하지 못하는 유해한 프로토콜은 방어 체계가 자동으로 차단합니다. 이를 통해 XSS 공격이 차단 목록을 회피하여 유효하지 않은 값을 난독화하는 것을 방지할 수 있습니다.
- 사용자가 HTML 마크업을 게시하는 것은 허용되어서는 안 되지만, 때로는 필요한 경우도 있습니다. 화이트리스트를 구현하여 유해한 태그를 걸러낼 수 있습니다. 화이트리스트는 안전한 태그를 저장하고 블랙리스트에 등록된 태그와 관련된 악성 코드를 걸러냅니다. 화이트리스트에 명시되지 않은 모든 태그는 블랙리스트에 등록된 것으로 간주됩니다.
- 보안 업데이트를 위해 웹사이트를 모니터링해야 합니다. 사용자의 브라우저에서 직접 필터링 및 인코딩을 수행하기 위해 자바스크립트 라이브러리를 사용할 계획이라면, 서버 측 템플릿 엔진을 사용하여 XSS 공격을 방지할 수도 있습니다. 이는 HTML에 동적 콘텐츠를 삽입하고 특정 코드를 정의할 수 있습니다.
- 인수를 사용하여 필터를 사용하고 컨텍스트를 정의할 수도 있습니다. 이는 대부분의 XSS 공격 사례를 방지하는 데 도움이 될 수 있습니다. 또한 이러한 이스케이프 기능을 검토하여 템플릿 엔진이나 프레임워크를 계속 사용할지 여부를 주기적으로 평가할 수 있습니다.
- PHP에는 엔티티를 인코딩하는 내장 함수도 있으며, 값이 HTML 컨텍스트 내에 있을 때마다 입력을 이스케이프하기 위해 호출할 수 있습니다. 세 개의 인자로 호출할 수 있으며, 유니코드 이스케이프 입력이 필요합니다. PHP는 문자열을 유니코드 이스케이프하기 위한 API를 제공하지 않습니다.
- 문자열을 HTML 엔티티로 변환한 다음 함수를 호출하세요. 사용자 정의 HTML 인코더를 사용하여 클라이언트 측 JavaScript XSS 공격을 방지할 수 있습니다.
크로스 사이트 스크립팅(XSS) 공격: 예방 팁(모범 사례 다루기)
XSS 공격을 방지하기 위해 수립할 수 있는 모범 사례는 다음과 같습니다:
- 인코딩을 통해 사용자 입력 및 출력 데이터를 정리하십시오.
- 특수 문자를 인코딩된 값으로 대체하여 모든 데이터를 코드가 아닌 텍스트로 처리할 수 있습니다. 공격자는 일반 텍스트를 다루는 경우 악성 스크립트를 삽입할 수 없습니다. 인코딩을 올바르게 적용하면 어떤 사용자도 그런 방식으로 영향을 받지 않습니다.
- 저장 및 처리되는 데이터 유형을 포함하여 비즈니스 로직이나 애플리케이션 유형에 따라 다양한 유형의 인코딩을 적용할 수 있습니다. 가장 기본적인 조치 중 하나인 HTML 엔티티 인코딩과 같은 다양한 인코딩 방법이 있습니다. 속성 값도 인코딩할 수 있습니다.
- XSS 공격을 방지하는 또 다른 좋은 방법은 클라이언트 측에서 수신된 데이터를 필터링하는 것입니다. 데이터 필터링은 태그, HTML 이벤트 핸들러, 악성 자바스크립트 요소 등 위험한 문자를 제거합니다.
- 입력 및 출력 필터링을 조합하여 웹 페이지 응답을 반환할 수 있습니다. 이 방법은 저장형 XSS 공격을 가장 효과적으로 완화합니다.
- 사용자 입력 검증은 또 다른 안전 조치입니다. 예를 들어, 기본 입력 필드를 텍스트 데이터 유형으로 설정하면 사용자가 숫자를 입력할 수 없게 됩니다. 이는 웹 양식에 효과적입니다. 입력값을 검증하여 공격자가 인증 절차를 통해 악성 스크립트를 업로드하는 것을 방지할 수 있습니다. 웹 브라우저는 허용된 리소스에만 접근을 허용하고 다른 모든 도메인은 무시합니다. 공격자가 XSS 주입 취약점을 발견하더라도 주입된 스크립트는 실행되지 않습니다.
- jQuery에서 크로스 사이트 스크립팅 공격을 방지하려면 사용자 입력을 jQuery 선택기에 전달할 수 있습니다. 가장 일반적인 방법은 location. 해시를 사용하여 HTML을 렌더링하는 선택기를 전달하는 것입니다. jQuery는 이 문제를 인식하고 선택기 로직을 패치하여 입력값이 해시로 시작하는지 확인할 수 있습니다.
- 사이트의 원본에서 로드할 수 있는 이미지나 스크립트 같은 리소스를 지정할 수 있습니다. 공격자가 XSS 페이로드를 주입하더라도 현재 원본 외부의 리소스는 로드할 수 없습니다. jQuery 선택기는 XSS 공격이나 취약점 발생 가능성을 크게 줄일 수 있습니다.
신뢰할 수 없는 데이터를 jQuery 선택기에 전달할 계획이라면, js—escape 함수를 사용하여 값을 올바르게 이스케이프 처리해야 합니다. 콘텐츠 보안 정책을 활용하여 XSS 공격을 완화할 수도 있습니다. 이를 통해 외부 스크립트 로딩 및 인라인 스크립트 실행과 같은 외부 스크립트 관리의 다양한 측면을 제어할 수 있습니다.
일반적인 XSS 공격 사례
실제 환경에서 흔히 발생하는 XSS 공격 사례는 다음과 같습니다:
- 2018년 영국항공(British Airways)은 유명 해커 그룹인 MageCart의 공격을 받았습니다. 이 그룹은 자바스크립트 라이브러리의 XSS 취약점을 악용했습니다. 고객 데이터는 공식 웹사이트와 유사한 도메인 이름을 가진 악성 서버로 전송되었습니다. 결국 38만 건 이상의 예약 거래에서 신용카드 정보가 탈취되었으며, 침해 사실이 너무 늦게 발견되어 항공사에 막대한 손실을 입혔습니다.
- 인기 온라인 멀티플레이어 게임인 포트나이트도 XSS 공격을 경험했습니다. 안전하지 않은 SSO 취약점으로 인해 사용자가 가짜 로그인 페이지로 리디렉션되어 정보가 도난당했습니다. 플레이어는 게임 내 가상 화폐도 잃었고, 녹음된 플레이어 채팅 내용이 유출되었습니다.
- eBay에는 공격자가 판매자 계정에 대한 전체 접근 권한을 얻을 수 있는 XSS 취약점이 있었습니다. 해커들은 eBay의 목록 위치를 조작했으며, eBay가 취약점을 발견하고 수정했음에도 공격을 계속했습니다.
결론
크로스 사이트 스크립팅 공격은 가장 심각한 웹 보안 위협 중 하나로, 온라인 플랫폼에 대한 신뢰를 훼손하고 사용자 데이터를 위험에 빠뜨립니다. XSS 공격 유형에 대한 인식과 적절한 방지 메커니즘을 적용함으로써 개발자는 애플리케이션을 안전하게 보호할 수 있습니다. 적절한 조치에는 입력 검증, 출력 인코딩, 콘텐츠 보안 정책 적용 등이 포함됩니다.
보안 감사 및 정교한 위협 탐지 도구는 안전하고 보안이 보장된 온라인 환경을 유지하는 데 필수적입니다. 기술이 발전함에 따라 공격자의 방법론도 진화하므로 주의가 가장 중요합니다. XSS 방지를 최우선으로 함으로써 조직은 평판을 보호하고 온라인 존재의 무결성을 보장할 수 있습니다.
FAQs
XSS 공격은 웹사이트에 악성 스크립트를 삽입하여 해커가 민감한 사용자 데이터에 접근할 수 있도록 하는 공격입니다. XSS 공격은 웹 애플리케이션의 취약점을 악용하며, 주로 사용자 입력값이나 조작된 URL을 이용합니다.
개발자는 사용자 입력을 검증하고, 출력 데이터를 인코딩하며, 악성 스크립트만 허용함으로써 XSS 공격을 방지할 수 있습니다. 정기적인 보안 감사와 콘텐츠 보안 정책(CSP)도 위험을 줄입니다.
XSS 공격은 사용자가 접속하는 브라우저에서 실행되는 악성 스크립트를 주입하여 보안 통제를 우회하고 민감한 정보에 접근함으로써 웹 애플리케이션을 악용합니다.
XSS는 데이터 유출, 재정적 손실, 평판 손상을 초래할 수 있으므로 반드시 방지해야 합니다. 또한 사용자의 신뢰를 훼손하고 악성코드 유포나 피싱 공격의 통로가 될 수 있습니다.
해결책과 도구로는 취약점 스캐너, 웹 애플리케이션 방화벽, 고급 위협 탐지 시스템 등이 있습니다. 이들은 취약점을 탐지하고 악성 스크립트의 실행을 차단하는 데 도움이 됩니다.
예. WAF는 트래픽을 필터링하고 악성 스크립트가 애플리케이션과 상호작용하기 전에 식별함으로써 XSS 공격을 차단할 수 있습니다.
XSS 테스트는 취약점 스캐너와 침투 테스트 도구를 사용하여 공격을 시뮬레이션하고 악성 스크립트의 잠재적 진입점을 찾습니다.
진화하는 위협으로부터 보호하기 위해 XSS 취약점에 대한 보안 스캔은 정기적으로, 이상적으로는 3개월마다 수행해야 합니다.
