websec - level 19

 

 

index.php
random.php
anti_csrf.php

 

 

 

해당 index.php에 접속하게 되면 token과 captcha이 생성된다.

 

Input에 captcha 값을 넣고  anti_csrf.php로 인해 POST로 받은 token 값이 달라졌는지 검증한 후 captcha와 token이 일치하면 지정된 email_addr로 메일이 보내지게 된다.

 

따라서 우리는 captcha값을 구하는 것과 email을 우회할 방법을 찾으면 된다.

 

 

 

 


 

 

1. captcha 구하기

 

 

 

우선 random으로 생성되는 captcha 값을 구해야한다. captcha는 generate_random_text함수로 생성된다.

 

 

이 함수가 있는 random.php를 살펴보면 srand() 매개변수에 microtime(true)을 시드로 받는다. 이 안의 microtime(true)는 정수로서 이 부분을 이용하여 captcha값을 구할 수 있다고 생각했다.

 

php에 똑같이 generate_random_text 함수를 구현한 후 token과 captcha를 생성한다. 이때 이 php를 실행 시킨 후 바로 index.php를 실행하면 microtime으로 1, 2 초 정도 차이가 날 수 있지만 이는 token과 captcha를 여러개 생성해주면 index.php에 생성되는 token값과 같은 값을 찾을 수 있다.

 

 

 

- 위의 아이디어를 가지고 token값을 생성하였으나, websec의 token과 같은 값을 찾을 수가 없었다.

 

 

  이 때의 원인으로 서버시간의 차이, php버전의 차이정도로 생각하였다.

 

 

  1. 서버시간의 차이

     첫번째로 의심한 것은 서버시간의 차이가 있어서 microtime이 리턴하는 값이 다를 것이라 예상하였는데 실제로 해       보니 별 차이가 없었다.

 

  2. php 버전의 차이

     php버전에 따라서 rand가 반환하는 값의 차이가 있을 것이라 생각하였다. 처음에 내부함수를 사용할 수 있는 다른       문제에 들어가서 phpinfo를 통해 php 버전이 7.2 버전임을 확인하고 값을 찾았지만 별 차이가 없었다. 그래서 버전       차이가 아니라 다른 문제인 것으로 생각하였으나 문제마다 버전이 다르다는 것을 알고 php 버전을 줄이면서 값을         확인한 결과 7.0 버전에서 token 값을 찾을 수 있었다.

 

 

token 값과 captcha가 생성될 때 시간 차이가 1초이내이므로 같은 시간에 생성된 captcha로 값을 구할 수 있다.

 

 

 

 

 

 

 

2. email_addr 우회

 

 

 

email_addr를 어떻게 우회할지 고민하다가 그냥 header에 host명을 아무거나 바꿔서 값을 보냈더니 그냥 문제가 풀렸다. 따로 email 전체를 바꾸지 않아도 host만 바꿔도 해결되게 문제를 만들어 놓아서 쉽게 풀었다.

'Web hacking > Websec' 카테고리의 다른 글

Websec - level9  (1) 2020.03.24
websec - level 24  (0) 2020.02.25
Websec - level 22  (0) 2020.02.22
Websec - level 14  (0) 2020.02.19
Websec - level 17  (0) 2020.01.05

+ Recent posts