> For the complete documentation index, see [llms.txt](https://vida03.gitbook.io/redteam/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://vida03.gitbook.io/redteam/web/ruby-regex-authentication-bypass.md).

# Ruby: regex authentication bypass

## Introdução

Vamos começar analisando o ambiente que iremos atacar:

<figure><img src="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2FLQ4TLPEkqlp6EmIouYjk%2Fcode%20ruby.png?alt=media&amp;token=c6c319ba-d43e-42b2-9172-04072fe86796" alt=""><figcaption></figcaption></figure>

Esse código irá verificar se a entrada do usuário não possui caracteres especiais, os caracteres permitidos são: **caracteres numéricos** e **letras**

Se digitarmos outro valor por exemplo "**<**" a aplicação irá retornar "Malicious Input Detected".

Após entender o comportamento da aplicação precisamos bypassar esse filtro pra conseguirmos obter SSTI (pressumi que seria isso por estar usando um sistema de templates)

## Bypass Time

Em regex o ^ e $ indicam respectivamente início e fim de linha, ou seja, esa expressão regular está verificando o início e fim de cada linha, então se uma linha for suficiente conseguimos bypassar o filtro, podemos utilizar o **\n** para isso, para explorar podemos utilizar o **Burp** ou o **curl**

Com o **Burp** eu tive que acrescenter um **\n** para conseguir bypassar, depois vi outras soluções na internet e vi que com o curl conseguimos explorar apenas com um **\n**, vamos ver os dois exemplos

<figure><img src="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2FF2F5Ns3KYwclbkzcjNfm%2Fbypass%20burp.png?alt=media&amp;token=455c1b3e-2a47-41c8-8275-15e235d465bb" alt=""><figcaption></figcaption></figure>

Agora vamos ver o exemplo com o curl:

<figure><img src="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2Fy5wwSgfnYWDsUbBgU37G%2Fbypass%20curl.png?alt=media&amp;token=83b18f45-4cfd-4d7d-ab7b-b89de1a74c34" alt=""><figcaption></figcaption></figure>

Podemos copiar o **\n** do Burp e colar na linha de comando do curl

## **Considerações**

Esse ataque é exclusivo (até onde eu testei) do ruby, para conseguirmos o mesmo resultado em outras linguagens precisaria de outras opções no filtro, por exemplo em python se pareceria com isso:

```
if re.match(r'^[0-9a-z]+$', my_input, re.MULTILINE):
    print('Matches...')
```

## Links de apoio

{% embed url="<https://davidhamann.de/2022/05/14/bypassing-regular-expression-checks/>" %}

{% embed url="<https://youtu.be/ClF8sit8a-U>" %}
