AceBear Security Contest 2018 BearShare Write up
들어가보면 메시지 입력하는 기능과 해당 메시지를 다운로드하는 기능이 있다.
여기서 처음에 입력값을 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가 나왔다.