PHP Tricks
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Pata mtazamo wa hacker kuhusu programu zako za wavuti, mtandao, na wingu
Pata na ripoti mapungufu makubwa, yanayoweza kutumiwa ambayo yana athari halisi za kibiashara. Tumia zana zetu zaidi ya 20 za kawaida kupanga uso wa shambulio, pata masuala ya usalama yanayokuruhusu kupandisha mamlaka, na tumia matumizi ya moja kwa moja kukusanya ushahidi muhimu, ukigeuza kazi yako ngumu kuwa ripoti za kushawishi.
Hii pia inatumika kwa cookies za phpMyAdmin.
Cookies:
Mahali:
Ikiwa ==
inatumika katika PHP, basi kuna kesi zisizotarajiwa ambapo kulinganisha hakufanyi kazi kama inavyotarajiwa. Hii ni kwa sababu "==" inalinganisha tu thamani zilizobadilishwa kuwa aina sawa, ikiwa unataka pia kulinganisha kwamba aina ya data inayolinganishwa ni sawa unahitaji kutumia ===
.
Meza za kulinganisha za PHP: https://www.php.net/manual/en/types.comparisons.php
"string" == 0 -> True
Mfuatano ambao hauanzishi na nambari ni sawa na nambari
"0xAAAA" == "43690" -> True
Mfuatano ulio na nambari katika muundo wa dec au hex unaweza kulinganishwa na nambari/mfuatano mwingine na True kama matokeo ikiwa nambari zilikuwa sawa (nambari katika mfuatano zinatafsiriwa kama nambari)
"0e3264578" == 0 --> True
Mfuatano unaoanzishwa na "0e" na kufuatwa na chochote kitakuwa sawa na 0
"0X3264578" == 0X --> True
Mfuatano unaoanzishwa na "0" na kufuatwa na herufi yoyote (X inaweza kuwa herufi yoyote) na kufuatwa na chochote kitakuwa sawa na 0
"0e12334" == "0" --> True
Hii ni ya kuvutia sana kwa sababu katika baadhi ya kesi unaweza kudhibiti mfuatano wa "0" na baadhi ya maudhui yanayohesabiwa na kulinganishwa nayo. Hivyo, ikiwa unaweza kutoa thamani itakayounda hash inayooanza na "0e" na bila herufi yoyote, unaweza kupita kulinganisha. Unaweza kupata mfuatano ambao tayari umehesabiwa kwa muundo huu hapa: https://github.com/spaze/hashes
"X" == 0 --> True
Herufi yoyote katika mfuatano ni sawa na int 0
Maelezo zaidi katika https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09
Kupindisha Aina pia inaathiri kazi ya in_array()
kwa kawaida (unahitaji kuweka kuwa kweli hoja ya tatu ili kufanya kulinganisha kwa ukali):
Ikiwa kazi hii inatumika kwa ukaguzi wowote wa uthibitishaji (kama vile kuangalia nenosiri) na mtumiaji anadhibiti upande mmoja wa kulinganisha, anaweza kutuma array tupu badala ya string kama thamani ya nenosiri (https://example.com/login.php/?username=admin&password[]=
) na kupita ukaguzi huu:
The same error occurs with strcasecmp()
Hata kama ===
inatumika kunaweza kuwa na makosa yanayofanya kulinganisha kuwa hatarini kwa type juggling. Kwa mfano, ikiwa kulinganisha kuna kubadilisha data kuwa aina tofauti ya kitu kabla ya kulinganisha:
preg_match()
inaweza kutumika kuhakiki ingizo la mtumiaji (ina angalia kama neno lolote/regex kutoka kwa blacklist lipo kwenye ingizo la mtumiaji na kama halipo, msimbo unaweza kuendelea na utekelezaji wake).
Hata hivyo, wakati wa kuweka mipaka ya mwanzo wa regexppreg_match()
inaangalia tu mstari wa kwanza wa ingizo la mtumiaji, kisha ikiwa kwa namna fulani unaweza kutuma ingizo katika mistari kadhaa, unaweza kuwa na uwezo wa kupita ukaguzi huu. Mfano:
Ili kupita kipimo hiki unaweza kutuma thamani yenye mistari mipya iliyopangwa (%0A
) au ikiwa unaweza kutuma data za JSON, zitume katika mistari kadhaa:
Find an example here: https://ramadistra.dev/fbctf-2019-rceservice
(Hii bypass ilijaribiwa waziwazi kwenye PHP 5.2.5 na sikuweza kuifanya ifanye kazi kwenye PHP 7.3.15)
Ikiwa unaweza kutuma kwa preg_match()
ingizo halali kubwa sana, haitaweza kulipitia na utaweza kuepuka ukaguzi. Kwa mfano, ikiwa inakataa JSON unaweza kutuma:
From: https://medium.com/bugbountywriteup/solving-each-and-every-fb-ctf-challenge-part-1-4bce03e2ecb0
Trick from: https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223 and https://mizu.re/post/pong
Kwa kifupi, tatizo linatokea kwa sababu ya preg_*
functions katika PHP inategemea PCRE library. Katika PCRE, baadhi ya regular expressions zinapatikana kwa kutumia wito mwingi wa recursive, ambayo inatumia nafasi kubwa ya stack. Inawezekana kuweka kikomo juu ya idadi ya recursions zinazoruhusiwa, lakini katika PHP kikomo hiki kimewekwa kuwa 100.000 ambacho ni zaidi ya kinachoweza kutoshea kwenye stack.
Thread hii ya Stackoverflow pia ilihusishwa katika chapisho ambapo inazungumziwa kwa undani zaidi kuhusu tatizo hili. Kazi yetu sasa ilikuwa wazi:
Tuma input ambayo itafanya regex ifanye 100_000+ recursions, ikisababisha SIGSEGV, na kufanya preg_match()
function irudishe false
hivyo kufanya programu ifikirie kwamba input yetu si mbaya, ikitupa mshangao mwishoni mwa payload kama {system(<verybadcommand>)}
ili kupata SSTI --> RCE --> flag :).
Vizuri, katika maneno ya regex, hatufanyi kweli 100k "recursions", bali tunahesabu "backtracking steps", ambayo kama nyaraka za PHP inavyosema inarudiwa kuwa 1_000_000 (1M) katika variable pcre.backtrack_limit
.\ Ili kufikia hiyo, 'X'*500_001
itasababisha hatua milioni moja za backtracking (500k mbele na 500k nyuma):
Ikiwa PHP inarejelea kwenye ukurasa mwingine lakini hakuna die
au exit
kazi inayofanywa baada ya kichwa Location
kuwekwa, PHP inaendelea kutekeleza na kuongezea data kwenye mwili:
Check:
File Inclusion/Path traversalregister_globals: Katika PHP < 4.1.1.1 au ikiwa imewekwa vibaya, register_globals inaweza kuwa hai (au tabia zao zinaweza kuigwa). Hii ina maana kwamba katika mabadiliko ya kimataifa kama $_GET ikiwa yana thamani e.g. $_GET["param"]="1234", unaweza kuyafikia kupitia $param. Kwa hivyo, kwa kutuma vigezo vya HTTP unaweza kuandika upya mabadiliko yanayotumika ndani ya msimbo.
Cookies za PHPSESSION za eneo moja zinahifadhiwa mahali pamoja, kwa hivyo ikiwa ndani ya eneo cookies tofauti zinatumika katika njia tofauti unaweza kufanya njia hiyo ifikie cookie ya njia kwa kuweka thamani ya cookie ya njia nyingine. Kwa njia hii ikiwa njia zote mbili zinapata mabadiliko yenye jina sawa unaweza kufanya thamani ya mabadiliko hayo katika path1 itumike kwa path2. Na kisha path2 itachukulia kama halali mabadiliko ya path1 (kwa kutoa cookie jina linalolingana nayo katika path2).
Unapokuwa na majina ya watumiaji wa mashine. Angalia anwani: /~<USERNAME> ili kuona ikiwa saraka za php zimewezeshwa.
Hizi kazi hutumiwa kawaida katika PHP ili kuunda hash kutoka kwa nywila na kuangalia ikiwa nywila ni sahihi ikilinganishwa na hash.
Mifumo inayoungwa mkono ni: PASSWORD_DEFAULT
na PASSWORD_BCRYPT
(inaanza na $2y$
). Kumbuka kwamba PASSWORD_DEFAULT mara nyingi ni sawa na PASSWORD_BCRYPT. Na kwa sasa, PASSWORD_BCRYPT ina kikomo cha ukubwa katika ingizo cha 72bytes. Kwa hivyo, unapojaribu kuunda hash ya kitu kikubwa zaidi ya 72bytes kwa kutumia algorithimu hii, ni zile 72B za kwanza pekee zitakazotumika:
From this twitter thread you can see that sending more than 1000 GET params or 1000 POST params or 20 files, PHP haitakuwa kuweka vichwa katika jibu.
Allowing to bypass for example CSP headers being set in codes like:
Ikiwa ukurasa wa PHP unachapisha makosa na kurudisha baadhi ya maoni yaliyotolewa na mtumiaji, mtumiaji anaweza kufanya seva ya PHP irudishe maudhui marefu kiasi kwamba inapojaribu kuongeza vichwa kwenye jibu, seva itatupa kosa. Katika hali ifuatayo, mshambuliaji alifanya seva itupe makosa makubwa, na kama unavyoona kwenye skrini wakati php ilijaribu kubadilisha taarifa za kichwa, haikuweza (kwa hivyo kwa mfano kichwa cha CSP hakikutumwa kwa mtumiaji):
Angalia ukurasa:
PHP SSRFsystem("ls"); &#xNAN;`ls`; shell_exec("ls");
Angalia hii kwa kazi za PHP zenye manufaa zaidi
Ili kutekeleza msimbo katika "replace" hoja inahitaji angalau mechi moja. Chaguo hili la preg_replace limekuwa lililopitwa na wakati tangu PHP 5.5.0.
Hii kazi ndani ya php inakuwezesha kutekeleza msimbo ulioandikwa katika mfuatano ili kurudisha kweli au uongo (na kulingana na hii kubadilisha utekelezaji). Kawaida, kigezo cha mtumiaji kitaingizwa katikati ya mfuatano. Kwa mfano:
assert("strpos($_GET['page']),'..') === false")
--> Katika kesi hii ili kupata RCE unaweza kufanya:
You will need to break the code syntax, add your payload, and then fix it again. You can use logic operations such as "and" or "%26%26" or "|". Note that "or", "||" doesn't work because if the first condition is true our payload won't get executed. The same way ";" doesn't work as our payload won't be executed.
Other option is to add to the string the execution of the command: '.highlight_file('.passwd').'
Other option (if you have the internal code) is to modify some variable to alter the execution: $file = "hola"
This function is used to sort an array of items using an specific function. To abuse this function:
You can also use // to comment the rest of the code.
To discover the number of parenthesis that you need to close:
?order=id;}//
: tunapata ujumbe wa kosa (Parse error: syntax error, unexpected ';'
). Huenda tunakosa moja au zaidi ya mabano.
?order=id);}//
: tunapata onyo. Hii inaonekana kuwa sawa.
?order=id));}//
: tunapata ujumbe wa kosa (Parse error: syntax error, unexpected ')' i
). Huenda tuna mabano ya kufunga mengi kupita kiasi.
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
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
: Hii env variable inaruhusu upakue maktaba zisizo na mpangilio unapoendesha binaries nyingine (ingawa katika kesi hii huenda isifanye kazi).
PHPRC
: Inatoa maagizo kwa PHP kuhusu mahali pa kupata faili yake ya usanidi, ambayo kwa kawaida inaitwa php.ini
. Ikiwa unaweza kupakia faili yako ya usanidi, basi, tumia PHPRC
kuonyesha PHP kwa hiyo. Ongeza auto_prepend_file
kuingiza ikielekeza faili ya pili iliyopakiwa. Faili hii ya pili ina PHP code ya kawaida, ambayo kisha inatekelezwa na PHP runtime kabla ya msimbo mwingine wowote.
Pakia faili ya PHP inayoshikilia shellcode yetu
Pakia faili ya pili, inayoshikilia maagizo ya auto_prepend_file
ikielekeza preprocessor ya PHP kutekeleza faili tulilopakia katika hatua ya 1
Weka variable ya PHPRC
kwa faili tulilopakia katika hatua ya 2.
Pata maelezo zaidi kuhusu jinsi ya kutekeleza mnyororo huu kutoka kwa ripoti ya asili.
PHPRC - chaguo jingine
Ikiwa huwezi kupakia faili, unaweza kutumia katika FreeBSD "faili" /dev/fd/0
ambayo ina stdin
, ikiwa ni mwili wa ombi lililotumwa kwa stdin
:
curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'
Au kupata RCE, wezesha allow_url_include
na uongeze faili yenye base64 PHP code:
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=="'
Technique from this report.
The webserver parses HTTP requests and passes them to a PHP script executing a request such as as http://host/cgi.php?foo=bar
as php.exe cgi.php foo=bar
, which allows a parameter injection. This would allow to inject the following parameters to load the PHP code from the body:
Zaidi ya hayo, inawezekana kuingiza param "- " kwa kutumia herufi 0xAD kutokana na urekebishaji wa baadaye wa PHP. Angalia mfano wa exploit kutoka hiki chapisho:
Katika chapisho hili inawezekana kupata mawazo mazuri ya kuunda msimbo wa PHP wa brain fuck ukiwa na herufi chache sana zinazoruhusiwa. Zaidi ya hayo, pia inashauriwa njia ya kuvutia ya kutekeleza kazi ambazo ziliruhusu kupita ukaguzi kadhaa:
Angalia kama unaweza kuingiza msimbo katika wito wa hizi kazi (kutoka hapa):
Ikiwa unarekebisha programu ya PHP unaweza kuweka wazi uchapishaji wa makosa kwa kuongeza display_errors = On
katika /etc/php5/apache2/php.ini
na kuanzisha upya apache: sudo systemctl restart apache2
Unaweza kutumia web www.unphp.net kuondoa ufichaji wa msimbo wa php.
PHP Wrappers na protokali zinaweza kukuruhusu kupita ulinzi wa kuandika na kusoma katika mfumo na kuathiri. Kwa maelezo zaidi angalia ukurasa huu.
Ikiwa unaona kwamba Xdebug ime wezeshwa katika matokeo ya phpconfig()
unapaswa kujaribu kupata RCE kupitia https://github.com/nqxcode/xdebug-exploit
Ikiwa katika ukurasa unaweza kuunda kitu kipya cha darasa lolote unaweza kuwa na uwezo wa kupata RCE, angalia ukurasa ufuatao kujifunza jinsi:
PHP - RCE abusing object creation: new $_GET["a"]($_GET["b"])https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/
Kulingana na hii andiko ifuatayo inawezekana kuzalisha shellcode rahisi kwa njia hii:
Hivyo, ikiwa unaweza kutekeleza PHP isiyo na mpangilio bila nambari na herufi unaweza kutuma ombi kama ifuatavyo ukitumia mzigo huo kutekeleza PHP isiyo na mpangilio:
Kwa maelezo ya kina zaidi angalia https://ctf-wiki.org/web/php/php/#preg_match
Pata mtazamo wa hacker kuhusu programu zako za wavuti, mtandao, na wingu
Pata na ripoti kuhusu udhaifu muhimu, unaoweza kutumiwa kwa faida. Tumia zana zetu zaidi ya 20 za kawaida kubaini uso wa shambulio, pata masuala ya usalama yanayokuwezesha kupandisha mamlaka, na tumia mashambulizi ya kiotomatiki kukusanya ushahidi muhimu, ukigeuza kazi yako ngumu kuwa ripoti za kushawishi.
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)