다양한 기록

[모의 해킹] XSS 본문

보안개론

[모의 해킹] XSS

라구넹 2024. 12. 29. 22:01

XSS?

XSS(Cross-Site Script) 공격자가 모종의 방법으로 대상이 보는 페이지에 악성 스크립트를 심어놓는 것을 뜻한다. 예를 들어, XSS 대처가 되어 있는 않은 인터넷 게시판에 <script>alert("XSS")</script> 라는 내용으로 글을 쓰면 HTML 페이지 내에 태그가 그대로 들어가서 글을 보는 사람에게 "XSS" 메시지를 띄울 것이다. 공격자가 심어놓은 코드가 다른 사람이 보는 페이지에서 실행된 것이다.

 

XSS에는 종류가 있다. Stored XSS, Reflected XSS, DOM-Based XSS 가지이다. Stored XSS 게시판에 악성 코드가 심어진 글을 쓰는 예시처럼, 서버에 악성 코드가 Stored 되는 방식이다. 서버에서 저장되어 있는 페이지를 다른 이용자가 요청하면 악성코드가 그대로 전달될 것이고, 페이지를 이용자는 공격에 당한다.

 

두번째는 Reflected XSS이다. 악성코드를 URL 매개변수로 같이 보내고, 서버는 요청을 그대로 이용자한테 전달한다. 그렇게 되면 같이 보내진 악성 코드가 중간에 삽입되고 이용자는 공격에 당한다. 다만, 악성 스크립트가 포함되어 있는 URL 사용자가 직접 사용해야 하기에 공격자가 유도를 해야 한다. 이름처럼 악성 스크립트를 Reflected 되어 사용자에게 도달하도록 하는 방법이다.

 

Dom-Based XSS Document Object Model 이용한 공격 방식이다. 자바 스크립트가 이용자의 브라우저에서 실행될 , URL 포함하는 등의 방식으로 DOM 구조가 변경이 가능한 경우에 발생할 있다. DOM 구조를 변경하는 것으로 악성 스크립트를 주입하면 이용자의 브라우저에서 악성코드가 실행되게 된다. 다른 방법과의 차이점은 공격은 서버에서 이루어지는 것이 아니라 클라이언트의 브라우저에서 일어난다는 것이다.

 

XSS 종류에 대해 알아보았으니 이제 이번 실습에서 어떤 방식을 사용하게 되는지를 파악해야 한다. 문제에서는 클라이언트 봇이 게시판에 글이 올라오면 글을 읽는다고 한다. 게시판에 글을 써보면 글이 작성되어 올라가고 <script>alert('1')</script> 라는 내용으로 글을 쓰면 "1"이라는 메시지가 출력된다. 그렇다면 과제는 Stored XSS 방식으로 해결 가능하다는 뜻이 된다. 이번 과제의 해결은 Stored XSS방식으로 진행하였다.


공격

게시판에 글을 쓸 수 있는 상황이었는데, 위와 같이 페이로드를 작성하였다.

 

쿠키를 탈취하고 어딘가로 전송해야 내용을 알아낼 수가 있다.

일단 탈취한 쿠키를 어딘가에서 받아야 하는데 방법은 Pipedream에서 제공하는 Requestbin 서비스가 HTTP 요청이 들어오면 요청에 대해 알려주기에 기능을 사용하고자 했다

 

그 결과 다음과 같이 플래그를 얻을 수 있었다

 

방어 기법

일단 브라우저 자체에서 XSS 프로텍션 기능이 켜져 있다. 당연히 이것만 믿고 XSS 대한 대처를 하지 않아도 되는 것은 아니다. 입력되는 데이터는 일단 전부 위험하다고 간주하고 필터링이 진행되어야 한다. 어떻게 필터링 것이냐가 주된 문제이다.

 

우선 가장 정석적인 방법인 <script> 태그를 사용할 없도록 막았다고 하자. 그렇다면 이제 다른 태그로 우회가 가능할 것이다. 하지만 <script> 태그를 쓰지 않아도 자바 스크립트를 사용하는 방법은 많이 있다. 아무 태그나 넣어두고 에러가 발생하게 다음 에러가 발생했을 때의 처리로 악성 코드를 넣어두는 것도 가능하다. 결국 이런 식으로 하나하나 사용 불가능한 코드를 지정하기보다는 결국 화이트리스트를 만들어서 사용이 가능한 태그와 속성들을 지정하는 방식이 많이 사용된다.

 

화이트리스트로 관리하면 취약한 태그들을 제외하고 안전하다고 판단되는 입력만 받을 있다. 이렇게 걸러낸 다음 document.cookie 같은 비정상적 접근을 추가로 걸러낼 있다. 이렇게까지 통제를 해도 우회하는 방법이 있을 있다. 내용을 난독화하여 필터링을 우회할 있을 것이다. 어느 정도 난독화를 막아줄 있는 분석 도구나 난독화된 코드를 탐지하는 방법을 수도 있겠지만, 공격자가 어떤 방식으로 우회해 올지는 결국 없다. 다양한 방식으로 필터링을 걸어두고 로그를 관리해서 XSS 발생하면 즉각 관리할 있게 해야하며, 사용하는 라이브러리가 업데이트가 있으면 바로 해주어서 안전한 상태를 유지해야 한다.

 

또한 XSS 막기 위한 다양한 기능들이 있다. <meta> 태그에서 관련 헤더값을 설정할 있다. X-XSS-Protection 헤더를 설정한다면 브라우저가 XSS 필터를 활성화하는 것이 예시이다. Content-Security-Policy, Strict-Transport-Security, X-Content-Type-Options 같은 설정들이 존재한다. Strict-Transport-Security 정확히는 HTTPS 통신을 강제하는 헤더인데 보안을 강화하여 중간에 악성 스트립트가 주입되는 것을 방지하여 XSS 예방한다. X-Content-Type-Options 헤더의 경우 콘텐츠의 MIME타입 설정을 무시하도록 강제할 있다. MIME 타입은 데이터의 유형 처리 방법에 대해 지정하는데 이를 통해 HTML 자바스크립트로 해석하도록 만드는 등의 악의적 사용이 가능할 수도 있다. 이를 무시하도록 해서 안전성을 향상시키는 것이다. Content-Security-Policy 리소스의 출처를 제한하여 악성 스크립트가 실행되는 것을 막아주는 방식으로 사용이 가능한 헤더이다. 이러한 다양한 기능들을 활용하여 XSS 대응할 있다.

'보안개론' 카테고리의 다른 글

[모의 해킹] UAF & Double Free  (0) 2024.12.29
[모의 해킹] 파라미터 위변조  (0) 2024.12.29
[모의 해킹] Blind SQL Injection  (0) 2024.12.29
암호 기법 정리  (0) 2024.06.08
PT, BBP  (0) 2024.06.08