보안개구리
[게시판 실습] - CSRF (1) CSRF 공격 취약 본문
[설 명]
CSRF(Cross Site Request Forgery)는 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격으로 사용자의 신뢰(인증) 정보 내에서 사용자의 요청(Request)을 변조함으로써 해당 사용자의 권한으로 악의적인 공격을 수행할 수 있다. 사용자 입력값에 대한 적절한 필터링 및 인증에 대한 유효성을 검증하여 신뢰(인증) 정보 내의 요청에 대한 변조 방지하여야 한다.
[점검 내용]
사용자의 신뢰(인증) 정보의 변조 여부 점검
[점검 기준]
사용자 입력 값에 대한 필터링이 이루어지지 않으며, HTML 코드(또는 스크립트)를 입력하여 실행되는 경우
[대응 방법]
* 웹 사이트에 사용자 입력 값이 저장되는 페이지는 요청이 일회성이 될 수 있도록 설계
* 사용 중인 프레임워크에 기본적으로 제공되는 CSRF 보호 기능 사용
* 사용자가 정상적인 프로세스를 통해 요청하였는지 HTTP 헤더의 Referer 검증 로직 구현
* 정상적인 요청(Request)과 비정상적인 요청(Request)를 구분할 수 있도록 Hidden Form을 사용하여 임의의 암호화된 토큰(세션 ID, Timestamp, nonce 등)을 추가하고 이 토큰을 검증하도록 설계
* HTML이나 자바스크립트에 해당되는 태그 ㅅ사용을 사전에 제한하고, 서버 단에서 사용자 입력 값에 대한 필터링 구현
* HTML Ediotr 사용으로 인한 상기사항 조치 불가 시, 서버 사이드/서블릿/DAO 영역에서 조치하도록 설계
* XSS 조치 방안 참조
[진단 과정]
[실습 시나리오]
ㄱ) 해커가 게시글 내 악의적인 스크립트를 삽입
ㄴ) 사용자가 해당 게시글 조회. 게시글 조회 시 무단으로 패스워드 변경
1) 'hacker' 아이디로 로그인 후 패스워드 변경을 시도합니다.
2) 패스워드 변경 시 프록시 도구를 통하여 요청값을 확인합니다. 패스워드 변경 시 요청되는 URL 및 파라미터값을 수집하였습니다. (http://127.0.0.1:8088/hacker_B/changepwAction.jsp?newPW=123&confirmPW=123)
3) 게시글을 작성 후 악성 스크립트를 삽입합니다. 해당 스크립트는 게시글을 조회 시 강제적으로 패스워드를 123으로 변경하는 스크립트입니다.
4) admin 계정으로 로그인 후 패스워드를 확인합니다. 현재 패스워드는 'admin'인것을 확인하였습니다.
5) 게시판메뉴로 이동 후 해커가 작성한 게시글을 조회합니다.
6) 게시글이 정상적으로 조회되었습니다. 게시글 요청 시 요청값을 프록시 도구를 통하여 확인해 보겠습니다.
7) 게시글 조회 시 changepwAction.jsp로 이동시켜 패스워드를 강제적으로 123으로 변경하는 요청을 보냈고 응답값 내 비밀번호가 수정되었다는 메시지가 출력됨을 확인하였습니다.
8) 'admin' 계정으로 재 로그인 시(ID:admin / PW:admin) 비밀번호가 틀리다는 메시지가 출력됨을 확인하였습니다.
9) 기존 패스워드가 아닌 스크립트에 삽입된 '123'을 사용하여 로그인을 시도했습니다. 로그인이 성공하였으며 회원 목록 확인 시 'admin' 계정의 패스워드가 '123'으로 변경된 것을 확인하였습니다.
10) 현재 실습 환경은 다음과 같습니다
해커접속 도메인 : 127.0.0.1:8088/hacker_b/
admin접속 도메인 : 192.168.0.12:8088/hacerk_b/
악성스크립트를 살펴보면 패스워드 변경 요청 주소가 http://192.168.0.12:8088/hacker_B/changepwAction.jsp?newPW=123&confirmPW=123으로 admin이 접속한 도메인과 같은 주소임을 알 수 있습니다.
따라서 CORS 정책에 어긋나지 않기 때문에 admin계정으로 로그인 후 게시글 조회 시 정상적으로 패스워드가 변경된 것입니다.
하지만 악성스크립트 내 URL을 192.168.0.12 -> 127.0.0.1로 변경 후 삽입한 후 악성 스크립트가 삽입된 게시글을 'amdin' 계정으로 조회 시 아래와 같이 CORS error가 출력되며 패스워드가 변경되지 않음을 확인하였습니다.
* CORS(Cross-Origin Resource Sharing): 도메인이 다른 서버끼리 리소스를 주고 받을 때 보안을 위해 설정된 정책
-> 'admin'계정으로 접속 한 도메인 주소는 192.168.0.12이기 때문에 스크립트 내 삽입된 주소인 127.0.0.1로 이동하는 것은 CROS를 위반했기 때문에 아래 사진과 같이 CORS 에러가 출력되며 이동(패스워드 변경)되지 않습니다.
'웹 진단 > 게시판 실습' 카테고리의 다른 글
[게시판 실습] - 불충분한 인증 (2) 타인의 게시글 수정 및 삭제 가능 (0) | 2024.06.10 |
---|---|
[게시판 실습] - 불충분한 인증 (1) 중요페이지 접근 시 추가 인증 불충분 (0) | 2024.06.06 |
[게시판 실습] - XSS (2) Stored XSS 공격 취약 (0) | 2024.06.05 |
[게시판 실습] - XSS (1) Reflected XSS 공격 취약 (0) | 2024.06.05 |
[게시판 실습] - SQL Injection (1) 로그인 시 로그인 검증 우회 (0) | 2024.06.03 |