wonder

정보보안 스터디 - 6주차 1일 - XSS 필터링 우회방법 본문

hacking study/XSS

정보보안 스터디 - 6주차 1일 - XSS 필터링 우회방법

wonder12 2022. 11. 18. 03:52

 

XSS란

 

XSS란 클라이언트 측에 스크립트를 삽입하는 것입니다.

클라이언트의 브라우저에서 스크립트가 실행됩니다.

 

 

저번 내용을 복습하면서 추가적으로 정리하자면,

 

Stored XSS

DB서버에 데이터를 저장할 때 사용가능한 공격입니다.

예를들어 글쓰기, 회원가입이 있겠습니다.

 

공격 과정:

 

1. Burp suite에서 파라미터가 있는것을 찾습니다.

 

2. 그 중 입력값에대한 응답이 있는 것을 찾고

 

3. 제목, 내용에 키워드 <" '>를 넣어서 필터링이 안걸려있는지 확인합니다.

 

여기서 확인은 화면말고 응답코드에서 확인합니다.

 

4. 필터링이 없이 된다면 <script> 역시 필터링 없이 사용가능한지 확인합니다.

 

 

Reflected XSS

저장하지않고 공격링크를 만들어 클릭을 유도해 당하는 공격입니다.

 

공격 과정:

 

1. 처음에는 http 히스토리를 다지우고 접속해서 로그인부터 해봅니다.

간혹가다 로그인에서 응답값이 나오고 XSS공격이 통하는 경우가 있을 수도있기 때문에

2. 응답이 나오는 파라미터에 <" '>를 넣어봅니다.

 안됩니다.

 

페이지뷰 id값에도 해보니 페이지번호인 숫자만 먹힙니다.

 

3. 검색창을 이용해 페이로드를 삽입해봅니다.

꺽쇠는 HTML entity로 치환되고 " ' 만 사용가능하지만

애초에 스크립트 태그에 감싸져 있기 때문에 

주석처리 또는 뒷구문 형식을 맞춰줘서

alert는 물론 원하는 script 페이로드가 가능해졌습니다.

 

링크를 확인 할 때는 post방식인 것을 get방식으로 바꿔야합니다.

copy url로 알림창이 뜨는 것을 확인해보고

링크를 전송합니다. 

 

만약 문법적인오류 등으로 실행이 안된다면

F12 > Console > unexpected ~로 클릭해보면 문법오류가 뜨는 것을 확인 할 수 있습니다.

 

 

 

 

 

 

Stored XSS 또는 Reflect XSS로 alert까지 뜨는 것을 확인하였다면

쿠키세션을 탈취하는 스크립트는

document.write를 이용합니다.

 

원래는 다른 네트워크 VPS서버가 필요하지만

없다면 request bin에서 세션내용이 보내지는 것을 확인할 수 있습니다.

 

 

Stored XSS가 일어나는 곳인 게시판 제목에

라고 입력하고 클릭해주면

 

세션을 탈취했습니다.

admin에서 로그아웃이 되면 세션 변경됩니다.

 

 

세션 권한 변경 같은경우에는 

1. Burp suite에서 PHPSESSID를 바꿔서 forward 합니다.

2. F12 > console > F12 > document.cookie 를 검색하고 수정합니다.

 

 

참고로 Reflected XSS는 링크가 자기만 보여지거나, 들어가는데 권한이 필요하다면

링크를 클릭한 사용자에게 공격이 안되는 것을 유의합시다.

 

 

 

 

XSS 예방책

 

근본적이고 확실한 예방책은

HTML 모든 특수문자에 HTML entity처리를 하는 것입니다.

 

하지만 HTML 에디터를 사용하는 곳이 예외입니다.

 

HTML 에디터를 꼭 써야한다. 하는 경우에는

1. 일단 모든 HTML을 entity로 치환한다.

2. 모든 태그를 허용해주면 안되고 이용자가 사용가능한 태그만 화이트리스트 기반으로 지정해줘서 &gt; &lt; 처리 된 부분을 다시 살려낸다.

3. img 등 안에서도 event handler로 자바스크립트를 실행할 수 있을테니 onerror >> onxxror 이런식으로 블랙리스트 기반 필터링한다.

 

 

 

 

event handler 종류

 

img src=x onerror="alert(1);"

x에 가서 요청을했지만 페이지가 없기 때문에 404에러를 띄웁니다.

onmouseover: 그림에 마우스를 올렸을 때만 실행됩니다.

 

침투테스트를 할 때는 기본매너가

제목에는 코드를 노출시키는 게 아니라 보안 테스트중이라고 하고

사용자가 글을 클릭했을 때 영향을 끼치도록 하지않고

나만 테스트해보기 위해 onmouseover 이벤트 핸들러를 사용합니다.

테스트가 완료되었다면 글 삭제까지 시켜줍니다.

 

흔하지 않은 태그인

<audio src="아무거나.mp3' onplay="alert(1);" autoplay>

등등이 있습니다.

 

 

 

 

 

예상 가능한 시나리오

 

 

1. 쿠키 세션 탈취

 

2. 피싱사이트로 리다이렉트

location.href=" " 는 뒤로가기가 가능하고 

location.replace(" ")는 뒤로가기가 불가능합니다.

 

3. HTML 태그 삽입

예를 들어 XSS point 를 alert만 할 게 아니라.

div를 통해 검색창을만들고 검색하면 가짜페이지로 리다이렉트 되도록 합니다.

자극적인 제목의 공지 게시글이 뜨고 클릭을 하여 docx파일을 실행시킨다면

VBA매크로가 실행되어 악의적 행동을 합니다.

 

예를들어

외부서버에서 악성코드 파일을 다운로드 한 뒤에 랜섬웨어를 실행합니다.

 

이러한 취약점으로 현재 다운로드는 지원하지 않고 있지만

다양한 것이 가능할 것으로 보입니다.

 

그러니까 결국 html 과 java스크립트를 같이 활용하게 되는 셈입니다.

 

 

4. Miner 

코인채굴이 가능하지만 피해자가 페이지에 머무는 기간이 길어야 하기 때문에

동영상이나 강의를 들을 때 사용가능 합니다. 

 

피해를 당하고 있는지 확인하는 방법은

작업관리자의 CPU 메모리 사용량이 100%으로 과부하인지 확인합니다. 

 

 

5. 키로거

만약 메인 웹페이지에 스크립트삽입이 가능한 게시글이 있고 옆에 로그인 기능이 있다면 키로거를 사용합니다.

홈화면에서 스크립트를 실행할 수 있다는 뜻이기 때문에 키로거로 로그인 내용을 sniffing 할 수 있습니다.

 

 

6. 파일 업로드

파일 업로드로 인해 HTML 파일을 넣거나 자바스크립트 파일을 DB에 저장시켜

XSS가 될 수도 있습니다.

 

등등 여러가지가 있습니다.

시나리오에대해 고민해보고 연구할 필요가 있습니다.

 

 

 

XSS 필터링 우회 방법

 

대부분 사이트들은

1차로 XSS 필터링을 해서 막기는 합니다.

근데 제대로 막지않아 허술하다는 점이 문제입니다.

 

자바스크립트 코드에 대한 인증,검증은 클라이언트에게 넘겨주는 게 아니라 무조건 서버측에서 해야합니다. 

클라이언트에게 인증한다는 것은 시험지를 학생 스스로 채점하는 것입니다.

클라이언트의 웹브라우저에서 자바스크립트를 받아서 처리를 하고 서버로 넘겨줍니다.

 

브라우저에서 코드가 다 나오기 때문에

인터셉트로 잡아서 스크립트를 수정하거나 지울 수 있습니다.

(크롬 F12 > Element 에서도 가능합니다.)

 

 

블랙리스트 기반의 필터링을 해놓았을 때

script단어를 필터링했을 때 해결책은

대소문자 변환: ScriPt

키워드 반복: <scrscriptip>   >>  <script>

이 있습니다.

 

이벤트 핸들러를 통한 우회

script나 꺽쇠없이도 "만 사용하여 우회 가능합니다.

 img, object, svg 등 태그도 이벤트핸들러와 결합해 사용 가능합니다.

 

+ 예상외의 XSS포인트

<input type="text" placeholder="이름"> 이라는 정상적인 태그에

script, <> 꺽쇠 모두 못쓰는 상황입니다.

<input onfocus="alert(1);" autofocus>

" 사용으로만 페이로드를 만들었습니다.

 

 

 

 

DOM Based XSS

브라우저에서 /소스에서는  노출이 안되서  확인이 어렵다.

document.write()로 확인?

html , js분석?

어떻게 할까요?

 

 

 

다음 시간에는 DOM Based XSS의 정의와 활용방법을 자세히 알아보고 심화과정을 올리겠습니다.

 

 

 

Comments