본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 12-1. 크로스 사이트 요청 변조(CSRF) [Change Secret]

by Robert8478 2023. 12. 14.

[난이도 하]

이번 페이지는 비밀번호 힌트를 변경하는 페이지이다. 관리자도구를 보면 hidden 타입으로 된 login 변수를 보니 login 변수가 아이디 값을 입력받는 변수인듯 하다.

또한 버프슈트에서도 3개의 변수를 확인 가능하다. login 변수에 다른 사용자 아이디를 입력해서 비밀번호 힌트를 바꾸는 CSRF 공격을 해보자. htmli_stored 페이지의 게시판에 전처럼 img 태그를 업로드 할것이다.

<img src="http://192.168.56.102/bWAPP/csrf_3.php?secret=Hello World changed again!&login=robert&action=change" width="0' height="0"> 악성 img 태그를 업로드 해주었다. 힌트값이 변경되었을지 확인해보자. sqli_16.php 페이지에서 확인한다.

비밀번호 힌트가 변경되었다.

[대응방안]
우선 htmlspecialchars와 mysqli_real_escape_string 함수로 입력값을 필터링하여 모든 변수에 다른 공격은 시도하지 못하게 방어한다.

또한, 난이도 중부터는 로그인 요청을 토큰으로 받기 때문에 힌트를 변경하기 어려워진다.

토큰을 생성할 때도 랜덤 함수를 사용한다. 비밀번호 힌트 변경 요청시 매번 새로운 토큰을 발행해서 예측하거나 중복사용하지 않도록 방어한다. 현재 사용자로 접속하여도 비밀번호 변경 요청시 매번 다른 토큰을 사용한다.

토큰값에 사용된 mt_rand 함수는 메르센 트위스터 알고리즘이다. 이는 rand 함수보다 중복값이 발생할 확률이 낮다. 또한, uniqid 함수는 현재 시각을 사용, 구별되는 식별자를 문자열 객체로 반환한다. 이 반환값은 중복되거나 예측할수 있는 값을 생성하나 mt_rand 함수의 반환값을 인자로 입력하여 중복되거나 예측할 확률이 낮다.