1. Cookie & Session
Cookie
클라이언트의 정보 기록과 상태 정보를 표현하는 용도로 사용된다. 이를 사용하는 이유는 HTTP 특징과 관련이 깊다. HTTP는 connectionless와 stateless라는 특성을 가진다. 따라서 클라이언트를 기억할 수 없는데, HTTP에서 상태를 유지하기 위해 Cookie가 탄생했다. Cookie는 'KEY'와 'VALUE'로 이뤄진 단위이다. 서버가 클라이언트에게 쿠키를 발급하면, 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 같이 전송한다. 그러면 서버는 클라이언트가 전송한 쿠키를 확인하여 이들을 구분한다.
Cookie는 정보기록 용도로 사용된다. 과거에 클라이언트의 정보를 저장하기 위해 쿠키가 종종 사용됐지만, 쿠키가 필요없는 요청에도 매번 클라이언트가 서버에게 쿠키를 보내어 리소스가 낭비되었다. 따라서 최근에는 Modern Storage APIs를 통해 데이터를 저장하는 방식을 권장한다고 한다.
Cookie는 상태정보 용도로 사용된다. 웹 서버가 수많은 클라이언트의 로그인 상태와 이용자를 구분하기 위해 클라이언트를 식별할 수 있는 값을 쿠키에 저장해 사용한다.
HTTP 프로토콜 특징
- -Connectionless : 하나의 요청에 하나의 응답을 한 후 연결 종료
- Stateless : 통신이 끝난 후 상태 정보를 저장하지 않는 것
=>HTTP connection에는 non-persistent와 persistent가 있는데 현재는 persistent가 디폴트 값이다.
쿠키가 있는 통신의 예
쿠키의 변조
악의적인 클라이언트가 쿠키 정보를 변조해 서버에 요청할 수 있다.
세션
쿠키에 포함된 Session ID를 사용해 서버에 저장된 세션 데이터에 접근하는 방식이다. 클라이언트가 인증 정보를 변조할 수 없게 하기 위해서 '세션'을 사용한다. 세션은 인증 정보를 서버에 저장하고, 해당 데이터에 접근할 수 있는 '키'를 만들어 클라이언트에 전달하는 방식으로 작동한다. 여기서 '키'(유추할 수 없는 랜덤한 문자열)를 '세션ID'라고 부른다. 브라우저는 해당 키를 쿠키에 저장하고 이후 HTTP 요청을 보낼 때 사용한다. 서버는 요청에 포함된 키(쿠키 안에 있는 '키')에 해당하는 데이터를 가져와 인증 상태를 확인한다.
쿠키와 세션 비교
쿠키는 데이터 자체를 "이용자"가 저장하지만, 세션은 "서버"가 저장한다.
쿠키 적용법
쿠키는 서버와 클라이언트 둘 다 설정 가능하다. 쿠키는 클라이언트에 저장되기 때문에 클라이언트는 저장된 쿠키를 조회, 수정, 추가, 변조 가능하다. 또한 쿠키 설정할 때 만료 시간 지정 가능하고 만료 시간 이후에는 클라이언트에서 쿠키가 삭제된다. 쿠키의 만료는 클라이언트(브라우저)에서 관리된다.
세션 하이재킹
타 이용자의 쿠키를 훔쳐 인증 정보를 획득하는 공격이다.
[실습-Cookie]
(파이썬에 익숙하지 않고, 관련 문제를 풀어본 적이 없기 때문에 함께 실습하는 Cookie 부터 풀어보았다.)
/ : 이용자의 username을 출력하고 관리자 계정인지 확인함
/login : username,password를 입력받고 로그인 함
figure1. 인덱스 페이지 코드 : 요청에 포함된 쿠키를 통해 이용자를 식별함
->username이 admin인 경우 flag출력, admin이 아닌 경우 'you are not admin' 출력
figure2. 로그인 페이지 코드
->get인경우, username과 password를 입력할 수 있는 로그인 페이지인 'login.html'제공
->post인 경우, 사용자가 입력한 username과 password 값을 가져와서 users의 변수값과 비교함
->코드에서 try문,, pw = users[username] 은 username의 값을 가지고 있는 users의 값을 pw에 넣는다는 의미..?
figure3. users 변수 선언
'guest' 계정의 비밀번호는 'guest', 'admin'계정의 비밀번호는 파일에서 읽어온 'FLAG'임
=>취약점
username 변수는 요청에 포함된 쿠키에 의해 결정되는게 문제이다. 왜냐면 쿠키는 이용자가 임의로 조작할 수 있기 때문이다. 서버는 이용자 요청에 포함된 쿠키를 신뢰하여 검증없이 이용자 인증 정보를 식별하기 때문에 공격자가 쿠키에 타 계정 정보를 삽입하여 계정 탈취가 가능하다.
=>해결책
쿠키에 존재하는 username을 'admin' 문자열로 조작해야 한다.
=>결론
잘못된 쿠키의 설계로 발생할 수 있는 문제점, 즉 서버가 검증없이 쿠키를 신뢰하고 인증 정보를 식별할 때 발생할 수 있는 문제점 알아보는 실습이었다.
[실습-Session]
cookie 실습을 활용해서 풀어봤는데 답이 안나왔다....풀지 못하면 다음 단계로 올라갈 수 없어서 여기저기 구글링 해보면서 풀어보았다. 브루트 포스 방식으로 풀어야 한다는 힌트를 봐서 브루트 포스가 무엇인지 알아보았다.
<브루트 포스>란, 조합 가능한 모든 문자열을 하나씩 대입해 보는 방식으로 암호를 해독하는 방법이다. 브루트 포스 공격, 키 전수조사, 무차별 대입 공격 등으로도 부른다. 일반적으로 이 공격은 로그인에 필요한 패스워드를 알아내려고 할 때 사용된다. 하지만 요즘 사이트들은 아이디 실패 횟수가 제한되어 있어서 무한대로 맞추려는 행위는 할 수 없다. 그래서 패스워드 목록이 있는 사전 파일을 통해 시도하게 된다고 한다.
☞느낀점
웹 해킹을 처음 공부하는 사람에게는 이렇게 background로 개념을 다시 정리할 수 있어서 좋은 것 같다. 처음으로 웹 해킹관련 실습을 해보았는데 처음이라 낯설고 어려웠지만 재밌었다!
2. 주요정보통신기반시설 기술적 취약점 분석
08.웹보안_28.쿠키변조
점검대상
- 웹 애플리케이션 소스코드
판단기준
- 양호
- 쿠키를 사용하지 않고, server side session을 사용
- 쿠키 또는 session을 사용하는 경우, 안전한 알고리즘(SEED, 3DES, AES)가 적용된 경우
- 취약
- 안전한 알고리즘이 적용되지 않은 쿠기 또는 session을 사용하는 경우
- client side session을 사용하는 경우
'해킹 > 웹해킹' 카테고리의 다른 글
[드림핵 웹해킹]Background-Web (0) | 2022.01.03 |
---|