- Captcha(Completely Automated Public Turing test to tell Computers and Humans Apart)
- 컴퓨터와 인간을 구별하는 완전히 자동화된 테스트이다.
- 컴퓨터가 아닌 실제 사람에 의해 수행되는지 검증하는 과정이다.
- Brute Force와 같이 컴퓨터에 의해 자동적으로 실행되는 공격에 효과적으로 대응 가능하다.
- 아래 그림과 같은 인증 방식을 captcha인증이라 한다.
- 패스워드 변경과 Captcha를 통과하였다.
- 패스워드 변경 요청을 인터셉트 한 결과이다.
- 요청 파라미터로 step, password_new, password_conf, g-recaptcha-response 등이 있다.
- step이 1로 되어 있으므로 패스워드 변경의 1단계임을 알 수 있다.
- 다음 요청으로 Forward한 결과이다.
- Change를 누르면 다음 단계로 넘어가게 된다.
- step은 2로 되어 있고 첫 단계와 거의 동일한 파라미터를 갖고 있다. captcha값만 빠져있는 상태이다.
step1, 2 총 두 단계로 나누어져 있는 것이 가장 큰 취약점이다. 공격해보자.
- 2단계만 따로 조작하여 요청할 수 있다면?
- 두 번째 단계(step=2)의 요청을 인터셉트 한 상태이다.
- 해당 요청을 조작하기 위해 Burpsuit의 Repeater로 보낸다.
- 리피터에서 요청을 조작한다.
- test로 변경되는 요청을 다른 패스워드로 변경해보자.
- attack으로 변경 후 변경된 요청을 수행한다. (Go)
- 조작된 요청을 보낸 후 랜더링 된 결과이다.
- 최초 test로 변경 요청하였지만 요청을 인터셉트하여 두 번째 요청(step=2)에서 attack으로 변경 요청이 되도록 하였다.
- 로그인 시 test가 아닌 attack으로 로그인되는 것을 확인 할 수 있다. (공격성공)
- Medium단계 역시 Low단계와 마찬가지로 두 개 단계로 captcha인증을 이용한 패스워드 변경을 수행한다.
- 두 단계인 것을 알았으니 Low단계와 동일한 공격 방법을 적용시켜보았다.
- 일단 두 번째 요청을 인터셉트 해보자.
- 달라진 것은 passed_captcha 파라미터이다.
- 1단계를 통과하였는지, 즉 captcha인증을 통과하였는지를 나타내는 파라미터이다.
- 두 번째 요청을 인터셉트하여 조작할 수 있다면 passed_captcha파라미터가 무슨 의미인가..
- Low단계와 동일하게 2단계 요청을 리피터로 보내 요청을 조작해보자.
- Repeater로 Low단계와 동일하게 요청 파라미터를 조작하였더니
성공적으로 패스워드 변경을 조작할 수 있게 되었다.- 요청을 2단계를 나눈다는 점에서 Low와 Medium단계는 동일한 취약점을 갖는다.
- High단계의 경우 요청이 한 단계이다.
- HTTP 요청을 확인해보자.
- g-recaptcha-response, user_token등이 눈에 띈다.
- 공격을 위해 소스코드를 먼저 확인해본다.
- 아래 빨간 박스 안의 코드에 명백히 잘못된 코드가 있다.
- g-recaptcha-response는 랜덤하게 정해지는 captcha값인데 서버측에서 이를 고정된 문자열과 비교한다.
- 서버측 코드를 확인하여 저 값을 알아내고 요청시 if문에 해당하는 파라미터에 서버에서 요구하는 문자열을 넣어준다.
- 리피터를 통해 요청을 조작한다.
- User-Agent와 g-recapcha-response를 조작하였다.
- 조작된 요청을 수행하니 패스워드 변경에 성공하였다.
- 요청을 한 단계로 했지만 요청 파리미터를 확인하는데 있어 고정된 문자열을 사용하는 어처구니 없는 실수로 인해 취약점이 발생하였다.
- 개발자가 디버깅, 테스트 단계에서 편의를 위해 고정된 문자열을 넣어두고 이후 릴리즈 시 깜빡하고 변경하지 못하는 경우가 있을 수 있다.
- 소스코드
- 이번에는 인증을 위한 요청 파라미터의 값을 고정된 문자열과 비교하지 않는다.
- recaptcha_check_answer함수를 DVWA에서 확인할 수는 없지만 High단계 우회방법 적용에 실패하였으니 맞을 것이다.
- 사실 High단계에서 개발자에 의한 실수만 아니였다면 Impossible단계와 큰 다른 점은 없다.