공격자가 웹 서버와 같은 백엔드 시스템을 제어하기 위해 악의적으로 HTTP 요청을 작성하는 인젝션과 달리, 크로스 사이트 스크립팅 (XSS)는 사용자의 브라우저에 악의적인 자바스크립트를 주입하는 것을 의미한다. 자바스크립트는 웹 페이지의 모든 부분을 읽고 수정할 수 있기 때문이다.
스토어드 크로스 사이트 스크립팅 공격
웹사이트는 사용자가 탐색한 URL에 따라 데이터베이스로부터 콘텐츠를 가져와서 페이지에 삽입해 완성된 HTML을 생성한다. 데이터베이스에서 나오는 페이지 내용은 해커의 잠재적인 공격 벡터 (Attack Vector)다. 크로스 사이트 스크립팅 공격은 공격자가 데이터베이스에 자바스크립트 코드를 주입하여 웹 서버가 HTML을 렌더링 할 때 자바스크립트를 작성하도록 하는 것이다. 예를 들어, 사용자가 웹사이트 내에서 주석을 게시할 때, <script> 태그를 포함하는 주석을 작성한다면 HTML을 안전하게 구성하지 못하는 웹사이트의 경우 다른 사용자에게 그 주석이 렌더링될 때마다 <script> 태그가 작성되고, 공격 대상자의 브라우저에서 자바스크립트가 실행되게 된다. 이를 통해 공격자가 alert() 기능을 호출할 수 있다면, 다른 사용자의 세션을 도용하거나 유해 사이트로 리다이렉션하는 등 더 위험한 공격으로 이어질 수 있다. 따라서 모든 사용자 제어 콘텐츠는 보안이 필요하다.
스토어드 크로스 사이트 스크립팅 공격을 방지하기 위해선 브라우저에서 HTML 태그의 콘텐츠로 간주하도록 데이터스토어에서 들어오는 모든 동적 콘텐츠를 이스케이프하고, 엔티티 인코딩으로 교체해야 한다. 이스케이프 문자를 이스케이프하지 않은 문자로 변환하는 것은 브라우저가 페이지의 DOM을 생성한 후에 일어나기 때문에 브라우저가 HTML 태그로 취급하지 않는다.
콘텐츠 보안 정책을 설정하는 것도 다른 조치 방안이다. 이를 통해 사이트에서 자바스크립트 실행을 차단할 수 있다. 또한 브라우저에서 스크립트를 로드하는 도메인을 화이트리스트에 추가함으로써 인라인 자바스크립트가 허용되지 않음을 명시할 수 있다. 이렇게 공격자는 이스케이프되지 않은 콘텐츠 인스턴스를 찾고 화이트리스트 도메인으로 악의적인 스크립트를 삽입하기 어렵기 때문에, 여러 계층의 방어를 사용해 심층적으로 방어하는 것이 중요하다.
리플렉티드 크로스 사이트 스크립팅 공격
스토어드 XSS가 데이터베이스의 로그 자바스크립트로써 해당 웹사이트를 방문하는 사용자들에게 지속적으로 공격을 실행한다면, 리플렉티드 XSS는 서버에 전달된 스크립트가 즉시 반사되어 렌더링된 웹 페이지에 다시 표시하는 것을 의미한다. 공격자는 특정 타겟에게 URL을 이메일로 보내거나 설명을 추가해 사용자가 URL을 방문하도록 속인다. 이 때, HTML에 악의적인 코드를 보낸 다음 서버가 이를 재반사한다.
동적 콘텐츠가 백엔드 데이터베이스에서 나오든 HTTP 요청에서 나오든 동일한 방법으로 이스케이프하여 공격을 막아야 한다. 리플렉티드 XSS 취약점은 쿼리 문자열의 일부를 사용자에게 다시 표시하는 검색 페이지, 오류 페이지에서 발생한다.
DOM 기반 크로스 사이트 스크립팅 공격
리치 프레임워크의 증가로 웹 페이지의 많은 부분이 자바스크립트로 제어되기 때문에, 서버와의 상호작용 없이 클라이언트 측에서 데이터 처리가 많이 이루어지게 되었다. 이 과정에서 사용자 입력 기반으로 페이지를 동적으로 업데이트 할 때, 적절한 보안 처리가 없으면 DOM 기반 XSS에 취약해질 수 있다. 콘텐츠가 이스케이프되지 않고 웹 페이지의 DOM에 직접 기록된다면, 공격자는 해당 채널로 악의적인 자바스크립트를 삽입할 수 있다. 공격자는 URI 조각에서 일부 악의적인 자바스크립트를 사용해 URL을 만든 다음 사용자가 해당 URL을 방문하도록 속여 크로스 사이트 스크립팅 공격을 시작할 수 있다.
DOM 기반 XSS에 대응하기 위해서는 서버 측 코드와 마찬가지로 HTML의 값을 클라이언트 측 코드로 삽입하기 전에 URI 조각에서 가져온 모든 값을 이스케이프하도록 해야한다. 만약 클라이언트 측 자바스크립트 코드가 복잡하다면 최신 자바스크립트 프레임워크로 전환하는 것도 방법이다. 코드베이스를 보다 쉽게 관리하려면 보안 고려 사항이 명확해야 하기 때문이다. 그리고 적절한 콘텐츠 보안 정책을 설정하는 것도 중요하다.
세 가지 공격 모두 데이터베이스, HTTP 요청, 또는 URI 조각에서 오는 동적 콘텐츠에 악의적인 자바스크립트를 주입한다. 동적 콘텐츠의 HTML 제어 문자를 이스케이프하고 인라인 자바스크립트를 실행하기 못하게 하는 콘텐츠 보안 정책을 설정해 XSS 공격을 방지할 수 있다.
'Book' 카테고리의 다른 글
웹 개발자를 위한 웹 보안: 9장 요약 - 인증 손상 (2) | 2024.09.18 |
---|---|
웹 개발자를 위한 웹 보안: 8장 요약 - 사이트 간 요청 위조 공격 (1) | 2024.09.17 |
웹 개발자를 위한 웹 보안: 6장 요약 - 인젝션 공격 (3) | 2024.09.16 |
웹 개발자를 위한 웹 보안: 5장 요약 - 프로그래머 작동 방식 (0) | 2024.09.16 |
웹 개발자를 위한 웹 보안: 4장 요약 - 웹 서버 작동 방식 (3) | 2024.09.15 |