반응형
크로스사이트 스크립트에 나만의 취약점 점검 방식과 우회법을 작성한다.
XSS / CSRF 크로스사이트 스크립트 / CSRF
- 크로스사이트 스크립트(Cross Site Script)는 개발자의 실수로 인해 발견되는 취약점으로 발견 통계 중 가장 많은 비중을 차지하고있다.
- 종류로는 DOM-Based XSS, Reflected, Stored가 있다.
- 큰 목적으로는 사용자 정보 탈취와 공격자가 의도한 기능 실행이 대다수이다. 하지만 글은 진단자의 입장으로 작성한다.
크로스사이트 스트립트 XSS 원인과 원리
- 사용자의 입력을 받는 파라미터에 특수문자를 제한하지 않아 발생한다.
- 간단한 원리로는 직접 HTML, JAVASCRIPT를 직접 수정해 스크립트를 입력한다라고 봐도 될거같다.
- 소스코드에 직접 입력하는것이 아닌 "파라미터 또는 URL에 입력한 값이 소스코드에 하드코딩된다" 라는 가정이 가능할거 같다.
크로스사이트 스트립트 XSS 공격 방식
대상
- 사이트에 접속하는 모든 사용자(일반, 관리자)
행위
- 쿠키 및 세션을 탈취하여 계정 탈취(주로 관리자 계정을 대상)
- 악성 사이트로 강제 이동(모든 사용자 대상)
- javascript, activeX 실행 등
크로스사이트 스트립트 XSS 공격 구간
- 입력 가능한 구간에 HTML, Javascript, VBSCript, ActiveX, Flash와 같은 브라우저에서 실행 가능한 구문을 입력한다.
- 파라미터 뿐만 아니라 URL, Reqeust Header 필드 중 일부든 공격 가능성이 없다고 보긴 어렵다
- 단순하게 사용자가 입력한 값이 HTML 소스코드에 똑같이 입력되면 취약점이 존재할 가능성이 있다고 보면된다.
크로스사이트 스트립트 XSS 종류
3.4.1 DOM-Based
- 본 내용은 추후 작성 예정
3.4.2 리플렉티드(Reflected)
- 주로 GET으로 전달되는 파리미터에 공격구문을 넣어 사용자가 링크를 클릭하도록 유도한다.
- 브라우저에 자체 보안으로 인해 공격 가능성은 현저히 낮다.
- POST 방식의 경우 Burp Suite의 chang request method 기능으로 GET 형식으로 변환이 가능하므로 POST 방식의 공격 가능성이 없는건 아니다.
- 장점으로는 도메인은 신뢰되는 도메인이기 떄문에 의심이 적은 사용자는 아무렇지 않게 해당 링크를 클릭하여 접속 한 후 스크립트를 실행하게 된다.
- 경험으로는 URL을 소스(HTML)에 추가하는 로직의 홈페이지를 본적이 있다, 그래서 URL에 구문을 입력하여 스크리트를 실행한 적이 있다.
3.4.3 스토어드(Stored)
- GET과 POST는 storerd 공격에 무관하며 게시판과 같은 내가 입력한 데이터가 저장되는 구간에 공격을 진행한다.
- 게시판 외 사용자 정보 등 내가 입력한 값이 DB에 저장되고 저장된 데이터가 브라우저에 출력되는 구간에는 모두 공격 가능성이 존재한다.
크로스사이트 스트립트 XSS 공격 방법
파라미터 값에 특정 문자열을 입력
ex) xss'">() |
입력한 문자열이 HTML 소스에 출력되는지 확인
- 파라미터 값 이외에 Reqeust 헤더와 바디에 전송되는 값이 Response Body에 존재할 경우 추가 공격 진행
(4.2)에서 출력되는지 확인했을 경우 특수문자 필터링 여부 확인
- 개발자도구에서 확인할 경우 신뢰도 저하
- 정확한 필터링 여부를 확인하기 위해 Burp Suite로 Response Body를 확인한다.
<사진 개발자도구와 burp response 비교>
진단자 입장으로는 스크립트 실행 여부만 확인하면 되기 떄문에 아래 구문 입력
- 주로 사용하는 스크립트
- <,>, (, ), " JAVA Event 등 스크립트가 실행될 수 있는 요인이 허용되었는지 확인하기 좋다.
xss"><img src="#" onerror="alert(1)"> |
JAVA 이벤트 속성
- 보통 onmouseover, onerror 등을 많이 사용하는것으로 알고 있는데 이 외에도 자바이벤트가 엄청 많다.
- 하나하나 행위는 파악하지 않았지만 리스트는 작성한다.
- 복사를 원할 경우를 대비히여 텍스트도 작성한다.
(아래 JAVA 이벤트 클릭 하면 리스트 출력됨)
더보기
onafterprint
onafterscriptexecute
onanimationcancel
onanimationend
onanimationiteration
onanimationstart
onauxclick
onbeforecopy
onbeforecut
onbeforeprint
onbeforescriptexecute
onbeforeunload
onbegin
onblur
onbounce
oncanplay
oncanplaythrough
onchange
onclick
onclose
oncontextmenu
oncopy
oncuechange
oncut
ondblclick
onwebkittransitionend
onwheel
onloadedmetadata
onloadend
onloadstart
onmessage
onmousedown
onmouseenter
onmouseleave
onmousemove
onmouseout
onmouseover
onmouseup
onmousewheel
onmozfullscreenchange
onpagehide
onpageshow
onpaste
onpause
onplay
onplaying
onpointerdown
onpointerenter
onpointerleave
onpointermove
onpointerout
onpointerover
onunload
onvolumechange
ondrag
ondragend
ondragenter
ondragleave
ondragover
ondragstart
ondrop
ondurationchange
onend
onended
onerror
onfinish
onfocus
onfocusin
onfocusout
onfullscreenchange
onhashchange
oninput
oninvalid
onkeydown
onkeypress
onkeyup
onload
onloadeddata
onwebkitanimationend
onwebkitanimationiteration
onwebkitanimationstart
onpointerrawupdate
onpointerup
onpopstate
onprogress
onrepeat
onreset
onresize
onscroll
onsearch
onseeked
onseeking
onselect
onselectionchange
onselectstart
onshow
onstart
onsubmit
ontimeupdate
ontoggle
ontouchend
ontouchmove
ontouchstart
ontransitioncancel
ontransitionend
ontransitionrun
ontransitionstart
onunhandledrejection
onafterscriptexecute
onanimationcancel
onanimationend
onanimationiteration
onanimationstart
onauxclick
onbeforecopy
onbeforecut
onbeforeprint
onbeforescriptexecute
onbeforeunload
onbegin
onblur
onbounce
oncanplay
oncanplaythrough
onchange
onclick
onclose
oncontextmenu
oncopy
oncuechange
oncut
ondblclick
onwebkittransitionend
onwheel
onloadedmetadata
onloadend
onloadstart
onmessage
onmousedown
onmouseenter
onmouseleave
onmousemove
onmouseout
onmouseover
onmouseup
onmousewheel
onmozfullscreenchange
onpagehide
onpageshow
onpaste
onpause
onplay
onplaying
onpointerdown
onpointerenter
onpointerleave
onpointermove
onpointerout
onpointerover
onunload
onvolumechange
ondrag
ondragend
ondragenter
ondragleave
ondragover
ondragstart
ondrop
ondurationchange
onend
onended
onerror
onfinish
onfocus
onfocusin
onfocusout
onfullscreenchange
onhashchange
oninput
oninvalid
onkeydown
onkeypress
onkeyup
onload
onloadeddata
onwebkitanimationend
onwebkitanimationiteration
onwebkitanimationstart
onpointerrawupdate
onpointerup
onpopstate
onprogress
onrepeat
onreset
onresize
onscroll
onsearch
onseeked
onseeking
onselect
onselectionchange
onselectstart
onshow
onstart
onsubmit
ontimeupdate
ontoggle
ontouchend
ontouchmove
ontouchstart
ontransitioncancel
ontransitionend
ontransitionrun
ontransitionstart
onunhandledrejection
크로스사이트 스트립트 XSS 우회 기법 XSS Bypass
<, > 꺽쇠 부등호 필터링
- 사용자가 입력한 값이 태그안에 입력될 경우 우회가 가능하다.
- 입력 값 : xss">
- > 가 필터링 되었을 경우 아래 소스코드처럼 출력될 것으로 가정한다.
입력 전) <input name="text" value="">
입력 후) <input name="text" value="xss">">
- 하지만 우회 가능한 스크립트를 입력할 경우 스크립트 실행이 가능하다.
- 이게 가능한 이유는 " 가 필터링되지 않아 꺽쇠 안에 있는 태그에 자바 이벤트를 추가할 수 있다는 식으로 설명할 수 있다.
우회 가능 스크립트: xss"+onkeydown="alert(1)"
입력 후) <input name="text" value="xss"+onkeydown="alert(1)"">
- 이 외에도 사용자가 입력한 데이터가 SCRIPT 태그 안에 입력 될경우엔 자바 이벤트 외 여러 스크립트를 입력할 수 있다.(추후 내용 추가 예정)
alert 필터링
- promft, confirm, print()등으로 대체 가능
Bypass list
- 아래 파일 다운로드하여 메모장으로 열면 된다.
크로스사이트 스트립트 XSS 구문 모음(xss Cheat Sheet)
- 리스트를 파일로 첨부한다.
- Burp에서 제공하는 XSS Cheat Sheet다.
Cross-Site Scripting (XSS) Cheat Sheet - 2022 Edition | Web Security Academy
Interactive cross-site scripting (XSS) cheat sheet for 2022, brought to you by PortSwigger. Actively maintained, and regularly updated with new vectors.
portswigger.net
크로스사이트 스트립트 XSS 조치방법
특수문자 필터링
- 사실 상 꺽쇠도 아니다 ", ', (, ), =만 막아도 취약점에 위험성은 현저히 낮아진다.
ASP.NET
#특수문자 필터링
textString = replace(textString, "<", "<")
textString = replace(textString, ">", ">")
PHP
#특수문자 필터링
$text = text_replace(array("<",">"),array("<",">"), $text);
#전용 필터링 기능 사용
string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )
JSP
#특수문자 필터링
text = text.replaceAll("<","<");
text = text.replaceAll(">",">");
#전용 필터링 기능 사용
</c:out value="${text}">
반응형