문제에 접근하면 위와 같이 3개를 입력받을 수 있다.
First Name에 a를 Last Name에 b를 넣고 [Get Wrestler Name]를 클릭하면 아래와 같이 a와 b가 응답에 출력된다.
몇가지 공격 기법이 생각났는데 일단 요청이 어떻게 날아갔는지 봤다.
input에 base64로 된 형태로 날아가길래 decode 해보았더니 XML 형태로 날아갔다. 이를 통해 XXE를 하는 것이구나 하여 해당 공격을 진행하였다.
URL 디코딩 후 base64로 디코딩하였고 값을 바꿔준 뒤에 다시 base64로 인코딩 진행 후 URL encoding 해주었다.
그 결과 아래와 같이 XXE에 성공함을 볼 수 있었다.
소스코드를 얻기 위해 php의 convert 필터를 이용하였다.
그 결과 나온 base64로 인코딩된 값을 디코딩해주면 generate.php의 소스코드를 볼 수 있다.
그런데 원하는 FLAG 값은 존재하지 않았고 대신 이러한 코드가 들어있었다.
$whitelist = array(
'127.0.0.1',
'::1'
);
// if this page is accessed from the web server, the flag is returned
// flag is in env variable to avoid people using XXE to read the flag
// REMOTE_ADDR field is able to be spoofed (unless you already are on the server)
if(in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
echo $_ENV["FLAG"];
return;
여기서 난 막혔다 ㅠㅠ
REMOTE_ADDR을 127.0.0.1로 spoof 하기 위해 X-Forwarded-For 헤더를 이용해보았는데 되지 않았다 ㅠㅠ
해당 기법을 이용하는게 아닐까? 시간나면 더 풀어봐야겠다.
대회가 끝났지만 더 진행해보았다.
xxe를 통해 file:// , php:// 뿐만 아니라 http:// 도 가능하다는 것을 생각하였고 이를 이용해 localhost에서 접근하듯 하면 될 것이라 생각하였다.
그래서 <!DOCTYPE rootable[<!ENTITY xxe SYSETM "http://localhost/generate.php">]>를 시도해보았고 이를 통해 Flag를 획득할 수 있었다.
'Hacking Contest' 카테고리의 다른 글
[2019 Encrypt CTF] Sweeeeeet (0) | 2019.04.03 |
---|---|
[2019 Encrypt CTF] repeaaaaaat (0) | 2019.04.03 |
[Sunshine CTF 2019] WrestlerBook (0) | 2019.03.31 |
2019 TAMUctf Write-Up (0) | 2019.02.26 |
[35c3ctf.ccc.ac]sanity check (0) | 2018.12.28 |