들어가보면 메시지 입력하는 기능과 해당 메시지를 다운로드하는 기능이 있다.

 

 

 

여기서 처음에 입력값을 xml형태로 보내면 파싱해서 뿌려주길래 xxe겠네 하면서 계속 시도를해봤는데

external Entitiy가 활성화가 안되있어서 뭐 어쩔수가 없었다.

 

여기서 한참 멘붕에 빠져있다가 혹시몰라서 robots.txt들어가봐더니 그냥 소스를 볼수있었다. ㅡㅡ

ctf풀때는 무조건 한번은 그냥 접근해봐야 될것같다.

 

 

 

 

download.txt 소스를 보면 다음과 같은데 처음에 shell_exec부분에서 escapeshellarg가 취약점을 터질것 같아서

시도해봤는데 버전이 5.2점대가 아니라 취약점이 안터졌었다.

 

 

그래서 storagesy 파라미터 부분을 gimmeflag로 만들어야 했는데 위의 validate_hash함수에서 차단을 당하고

있었다. nonce 파라미터로 인해 만들어진 key값으로 storagesy 파라미터값이 동적으로 계속 세팅되기 때문에

마지막 if($final_hash !== $_POST['hash']){ die('Cannot verify server');} 요영역에서 계속 필터링이 걸릴 수

밖에 없었다.

 

이걸 우회를 해야하는데 hash_hmac함수에서 뭔가 터져줘야할것같았다. php함수들은 인자로 문자열대신

배열이 오는경우 예상하지못한 결과가 자주나와서 일단 $S_KEY = hash_hmac('sha256',$_POST['nonce'],$S_KEY);

요 부분에서 2번째 파라미터값을 배열로 주게되며 어떻게되는지 로컬에서 테스트를 해봤다.

 

 

두번째 인자로 배열이 들어오면 에러가터지면서 함수가 제대로 동작안하는걸 볼 수 있었고 에러가터질경우

리턴값이 NULL로 떨어지는걸 확인할 수 있었다.

 

그렇다면 KEY값이 NULL값이기때문에 storagepy 파라미터값이 gimmeflag일때의 hash값이 고정되어진

상황이었고 해당값을 구해서 넘겨주니 flag가 나왔다.

 

 

 

 

 

 

 

 

 

 

 

블로그 이미지

JeonYoungSin

메모 기록용 공간

,