HTB{wh3n_l0v3_g3ts_eval3d_sh3lls_st4rt_p0pp1ng}

center

O desafio nos apresenta a um sistema que mostra um tempo aleatório. Ao analisar o código disposto pelo desafio, podemos ver que o objeto de tempo instanciada seguindo o seguinte fluxo:

center

center

center

Podemos observar que, na definição da classe TimeModel, podemos ver que existe a utilização do eval. Essa função pode ser perigosa em diversos contextos pois, em condições específicas, pode levar a Direct Dynamic Code Evaluation - Eval Injection Attack. Entretanto, o parâmetro format, ao qual temos acesso, é passada pela função addslashes, presente no Builtin do PHP. Indo para a definição dessa função, temos que a string passada como parâmetro tem caracteres especiais, tais como: ", ', \ e 0x00 (NULL Byte) são escapados, adicionando uma contrabarra adicional antes de cada um desses caracteres.

Entretanto, na maioria das linguagens de programação de alto nível, existe uma maneira de manipular strings usando formatação. Esse recurso existe em PHP e é conhecido como Simple Syntax. Para isso, precisamos usar os caracteres $, {, }, que não são escapados pela função addslashes

Colocando o payload como:

206.189.28.180:30023/?format=${phpinfo()}

Obtemos a seguinte resposta:

center

Agora, precisamos conseguir uma execução arbitrária de código. Podemos fazer isso da seguinte forma:

206.189.28.180:30023/?format=${system($_GET[1])}&1=ls%20/

Mas porque usar $_GET[1]?

Devido ao fato de que não conseguimos usar " ou ', temos que usar a função _GET[1] que já irá pegar os parâmetros como string do usuário, sem a necessidade de usar aspas (simples ou duplas)

Assim, obtemos a seguinte resposta:

center

Agora basta pegarmos a flag, com

206.189.28.180:30023/?format=${system($_GET[1])}&1=cat%20/flagG2E4L

center