SunshineCtf - Search Box Writeup
"This search engine doesn't look very secure.
Or well coded.
Or competent in any way shape or form.
This should be easy.
Note: flag is in /etc/flag.txt
http://search-box.web1.sunshinectf.org"
Dentro da página tinhas um pequeno input para enviarmos uma request para um site que seria algum "qualquer".
Porém, com alguns pequenos testes acabei percebendo que ele estava apenas aceitando o
host
como sendo 'www.google.com'.
Lógicamente uma das primeiras coisas que me veio na cabeça seria tentar acessar algum arquivo via file://
, porem, sem sucesso.
no momento que eu comecei a pensar que o
file://
não teria serventia, pensei em fazer o seguinte, juntar o wrapper mais o domínio que havia funcionado:
"get source failed"
, oops, então quer dizer que o wrapper na verdade funciona, o que não está dando certo é a procura pelo www.google.com nos diretorios, ou seja, aqui temos um filtro de host, e para confirmar isso:
Está sendo usado o
parse_url()
do php, se fizermos alguns pequenos testes, podemos tirar nossas conclusões:
Levando em consideração que o nosso host precisa ser sempre www.google.com, precisamos achar uma forma de conseguir passar uma chamada para algum arquivo interno, ou primeiro, tentar conseguir acessar o localhost.
Neste output acima, estamos passando o 127.0.0.1 como user, porem, o curl nao vai encontrar um user de autenticação igual a
127.0.0.1
, a url será interpretada corretamente:
Podemos tirar nossas conclusões que, se ele retornou "Source Code", ou estamos em
127.0.0.1
e o nosso bypass funcionou, ou estamos em www.google.com
.
Para saber isso, podemos tentar pegar algum arquivo interno, como o index.php que existe no webroot.
Eee... não funcionou.
Fazendo algumas rápidas pesquisas e alguns testes, identifiquei um outro bypass, onde passamos um
user@127.0.0.1
como usuário mais uma porta de destino,www.google.com continua sendo o host, porem a interpretação do curl acaba desvalorizando isso. Então, o parse_url()
praticamente não tem uma serventia de segurança neste código:
Fiz também um teste local, com um código em /var/www/html/x.php
então fui para a aplicação:
Porém a challenge nos dizia que era necessário pegar a flag em
/etc/flag.txt
, mas não havia como eu usar o file://
pois nenhum arquivo estava sendo lido, me pareceu estranho isso.
notei que ao final de cada arquivo passado, estava sendo concatenada à request uma
/
, resolvi testar isso direto pelo curl e comparar os resultados:
VS:
Pensei em colocar uma "#" para travar isso, o curl aceitou:
Mas a aplicação(usando o burp), não aceitou:
Então fiz o simples, o encode de
#
para ser igual a %23
, e funcionou!
Flag: sun{R3quE5t_tyP3S_m4tT3r}
final PoC: file://user@evil.com:80@www.google.com//var/www/html/index.php%23