본문 바로가기

웹 해킹

웹 해킹 공부 일기장 (XSS 정리)

저번주에 수업을 쉬어서 앞에 공부한 것을 한번더 요약을 하고 시작하겠습니다.

 

XSS란? 클라이언트측 스크립트를 삽입하여 실행하게 하는 공격이라고 할 수 있습니다.

 

XSS 공격에서 스크립트를 포함하는 곳에 따라 분류할 수 있었습니다.

1. Stored XSS: 서버측에 스크립트를 저장시켜 해당 스크립트를 불러오게 될 경우 실행됩니다.

2. Reflected XSS: 요청의 파라미터에 삽입된 스크립트가 서버에서 그대로 포함시켜 응답할 경우 실행됩니다.

3. DOM Based XSS: 요청의 파라미터에 삽입된 스크립트가 브라우저에서 처리하면서 그대로 출력할 경우 실행됩니다.

 - DOM Based XSS 같은 경우 URL의 # 부분 뒤에 받은 데이터에서도 일어난다고 합니다.

 

#뒷 부분은 서버에 데이터를 보내지 않고 브라우저에서만 인식하는 파라미터이기 때문에 브라우저에서 처리하면서 발생하는 취약점인 DOM Based XSS 가 발생할 수 있는 것입니다.

#뒤에 데이터를추가하여 보냄
요청 확인 시 #뒤의 데이터가 보내지 않는 것을 확인

 

그럼 XSS 대응 방안은 무엇이었나요?

HTML Entity를 사용하여 특수 문자들을 지정된 문자열로 처리하는 것이었습니다.

최소한!!! < , ' , " , > 4가지는 무조건 처리를 해주어야 합니다.

 

하지만 HTML Entity를 사용하지 못하는 곳도 있습니다.

바로 HTML Editor 에는 사용을 하지 못하는 데 HTML Editor는 우리가 작성한 특수문자가 실제 HTML로 처리가 되어야하기 때문입니다.

 

그럼 이런곳은 어떻게 방어할 수 있을까요?

일단, 가능하다면 그냥 해당 기능을 삭제해버리는 것입니다. ㅋㅋㅋㅋㅋ 만약 많이 사용하지 않으며 필요가 없다고 판단되면 없애버리는 것입니다. 하지만 꼭, 이 기능이 필요하다!! 그럴 경우에는 아래 과정을 따라줘야 합니다.

 

1. 파라마터에서 HTML 특수문자들을 전부 HTML Entity로 치환을 합니다.

2. 이제 허용해줄 태그들을 식별하고 해당 태그들만 HTML Entity를 풀어 다시 살려줍니다. (화이트 리스트 기반)

3. 해당 태그 내에서 악의적인 이번트 핸들러 들은 필터링해줍니다. (블랙 리스트 기반)

 

그리고 XSS 대응 방안으로 필터링하는 방법은 완벽한 대응 방안이 되지 못합니다.

 

필터링에는 블랙 리스트 필터링, 화이트 리스트 필터링이 있었습니다.

- 블랙 리스트 필터링 : 특정 단어를 차단합니다.

- 화이트 리스트 필터링 : 특정 단어만 허용해줍니다.

 

일단 화이트 리스트 필터링으로 필터링을 하면 물론, 많은 공격을 막을 수 있겠지만!! 게시판 같은 경우에 우리가 원하는 대로 작성하고 표현하는 곳인데, 특정 단어만 허용해준다면 게시판의 기능을 잃어버리게 됩니다.

 

그럼 블랙 리스트 필터링은 어떨까요??

예를 들어가며 확인해보겠습니다.

 

1. script라는 단어를 필터링

- <ScRipT></sCRiPt> 와 같이 대소문자를 섞어 사용하면 우회가 가능합니다.

대소문자 혼용
스크립트 실행

 

대소문자를 혼용하여 사용하면 스크립트가 실행되는 것을 확인할 수 있습니다.

 

2. 해당 단어 빈 문자열로 치환

- <scrscripipt></scrscripipt> 와 같이 작성하면 중앙에 작성한 script가 사라지며 정상적인 script 태그가 생성되어 스크립트를 실행시킬 수 있습니다.

 

3. 스크립트 태그 사용 불가할 경우

- 다른 태그들과 이벤트 핸들러를 사용하여 스크립트를 실행시킬 수 있습니다.

- img 태그로 스크립트 실행시키기

img 태그로 스크립트 실행
img 태그로 스크립트 실행

img의 src는 해당 경로에서 사진을 가져오게 합니다. 하지만 해당 경로에 사진이 없거나 접근할 수 없다면 정상적으로 실행을 하지 못합니다. 이때 !! onerror 라는 이벤트핸들러를 사용하는 것입니다. onerror 는 정상적으로 작동하지 못할때 해당 스크립트를 실행시켜 줍니다.

 

그렇기 때문에 스크립트 없이도 원하는 스크립트를 실행시킬 수 있습니다.

 

- a 태그로 스크립트 실행시키기

a 태그로 스크립트 실행
해당 링크 클릭 시 스크립트 실행

a 태그의 주소 기능 href에서도 자바스크립트를 실행시킬 수 있습니다. 만약, 해당 링크를 클릭하게 된다면 스크립트가 실행되는 것입니다.

(이 경우에는 사용자의 조작이 필요합니다.)

 

- input 태그로 스크립트 실행시키기

input 태그로 스크립트 실행
해당 입력란 클릭 시 스크립트 실행

 

input 태그도 마찬가지로 onfocus 이벤트 핸들러를 사용하여 input 태그를 클릭하면 스크립트를 실행시킬 수 있습니다.

이렇게 작성하면 a 태그와 마찬가지로 사용자의 조작이 필요하지만 autofocus 기능을 같이 사용해준다면 사용자의 조작없이 스크립트를 실행시킬 수도 있습니다. 

autofocus로 스크립트 실행
바로 스크립트 실행

 

onfocus 즉, focus를 하면 실행을 시켜주는 것인데 autofocus로 페이지 로드 시 해당 입력란을 focus해주면서 실행되는 것입니다.

 

이것은 아주 기본이되는 XSS 에 대한 필터링 우회방법입니다. 이 방법들 외에도 많이 존재합니다.

하고싶은 말은 블랙 리스트 필터링의 경우 아무리 필터링을 잘 해놓았다해도 우회할 가능성이 존재한다는 것입니다. 

그렇기 때문에 XSS 대응 방안으로는 HTML Entity를 사용해야합니다.