CSPT
Client Side Path Traversal (CSPT), é um tipo de vulnerabilidade que ocorre quando o valor do input controlado pelo usuário é concatenado diretamente no path da URL e o JS code da aplicação utiliza esse valor para realizar fetch em algum endpoint arbitrário.
Exemplo de código vulnerável abaixo:
const post_name = new URLSearchParams(location.search).get("p");
const blog_post_response = await fetch("/api/posts/get_content/" + post_name);
const post_content = await blog_post_response.text();
display_post_html(post_content);
CSPT é um dos melhores gadgets para ter em seu arsenal !!! Recomendo essa extensão chamada gecko, foi criada pelo busfactor, um grande mentor/amigo em particular!
depois desse pequeno resumo vamos ao que interessa, muitas vezes existem certos tipos de restrições no valor do input que controlamos, incontáveis vezes já fui bloqueado ao tentar usar a famosa sequência: ../ ou ..\, mas existem alguns truques na manga para tentar contornar esses “pequenos” empecilhos
URL parsing
segundo as especificações, caso a URL contenha os seguintes caracteres \n, \t ou \r eles serão removidos do input antes da URL iniciar o parser básico
- \n = %0A
- \t = %09
- \r = %0D
ta, do que isso nos interessa? pra responder vamos testar na prática
CSPT The Ruler
CTF web MUITO bom, criado pelo Kevin Mizu, na plataforma root-me chamado CSPT The Ruler - não posso dar spoilers da solução então vou focar apenas na parte do CSPT mas é basicamente uma chain de vulnerabilidades client-side
dentro do desafio existe esse seguinte trecho de código:
<script>
// peguei só a parte importante para a explicação
// CSPT
const ruleId = new URLSearchParams(location.search).get('q');
async function fetchPostContent() {
try {
const response = await fetch(`/api/rules/${ruleId}`,{
headers: {
"X-CSRF-Token":"wmOe270P-nieJB29X3teBIcC7Nmqfm-UplRQ"
}
});
// tinha mais código aqui mas removi o.O
// como ces podem ver não podemos utilizar a sequencia .. :(
if (ruleId !== null) {
const sanitized = UrlSanitize(ruleId);
if (sanitized.includes('..')) {
document.getElementById('content').innerText = 'Danger detected !';
} else {
fetchPostContent();
}
}
</script>
o valor do nosso input está sendo concatenado diretamente no path da URL e está sendo utiliza para realizar uma requisição para um endpoint arbitrário:

poreeeeeeem, como vimos no código, existe uma pequena restrição:

ao colocar a sequencia .. o nosso input é filtrado, então é o fim? se desistir agora o caioluders fica triste
vamos utilizar alguns dos três mosqueteiros - \n, \t, \r - para ver se conseguimos bypass… e o pokemon escolhido dessa vez fooooooiiiiiii \t:

notem a diferença entre o valor do nosso input no parâmetro -> .%09.padi e o valor que a aplicação está utilizando no path -> ..padi
é isso, temos um CSPT e agora podemos controlar para qual endpoint a aplicação vai fazer a requisição:

o resto do desafio envolve uma chain client-side, recomendo tentar fazer
fim
sinto que o post ficou um pouquinho maior do deveria, então os próximos serão um tiquin mais curtos e objetivos. obrigado !!!
sintam-se a vontade para postar qualquer coisa relacionada a webhacking nessa comunidade! juntos somos bem mais fortes!
Uma vez TRAMOIA, Sempre TRAMOIA alguns podem falar que é plágio do hino do Flamengo, outros vão falar que é homenagem !!!
ref
🚀 🚀🚀
😎


