Genom att kontrollera innehÄllet i kommentars-texten i ett Python-skript kan man uppnÄ kodens utförande.

En av deltagarna i UIUCTF 2025, gick igenom hur han lyckades lösa uppgiften som krÀvde att han skulle exekvera sin kod pÄ servern genom att endast kunna Àndra innehÄllet i kommentars-texten i koden.

Deltagarna kunde skicka ett nÀtverksanrop till Python-skriptet, som skapade ett nytt Python-skript med ett slumpmÀssigt namn. Det lade till anvÀndardata i kommentars-texten, tog bort tecknen "\n" och "\r", och körde skriptet med kommandot "python3 namn.py". Genom att bara kontrollera innehÄllet i kommentaren skulle deltagaren utvinna en strÀng frÄn filen "/home/ctfuser/flag". Skriptet skapades med följande kod: comment = input("> ").replace("\n", "").replace("\r", "") code = f"""print("hello world!") # Det hÀr Àr en kommentar. HÀr Àr en till: # {comment} print("Thanks for playing!")"""

IstÀllet för "{comment}" ersattes det med de uppgifter som kom frÄn deltagaren, och i slutÀndan kördes följande kod: print("hello world!") # Det hÀr Àr en kommentar. HÀr Àr en till: # Data som kom frÄn tÀvlingens deltagare print("Thanks for playing!")

Uppgiften var baserad pÄ en sÄrbarhet i CPython-parsaren, som behandlade tecknet med nollkod som slutet pÄ en rad (denna sÄrbarhet kunde exempelvis anvÀndas för att dölja skadliga ÄtgÀrder i kommentars-texten). Problemet ÄtgÀrdades i utgÄvorna CPython 3.12.0 och 3.11.4. I den anvÀnda konkurrenshanteraren togs endast tecknen "\n" och "\r" bort, men nÀr den sÄrbara versionen av CPython anvÀndes kunde deltagaren anvÀnda tecknet "\0" som avskiljare. Trots detta fungerade inte tricket, eftersom den fixerade versionen av CPython redan anvÀndes i tÀvlingen, med förutsÀttningen att det fortfarande kunde finnas liknande fel i parsaren som deltagarna kunde upptÀcka.

Deltagaren som lyckades med uppgiften valde att inte söka efter nya sÄrbarheter i parsaren som skulle göra det möjligt att dela upp strÀngen i delar, utan anvÀnde sig istÀllet av hur Python kör filer baserat pÄ deras innehÄll. Till exempel kan en fil med filÀndelsen «.py» innehÄlla cachad bytekod som sparas i filer med filÀndelsen «.pyc», vilket gör att en sÄdan fil kommer att köras. I den aktuella tÀvlingen kunde deltagaren endast kontrollera innehÄllet i mitten av filen, sÄ han kunde inte lÀgga till sin egen rubrik för att förvrÀnga MIME-typen.

Problemet lyckades lösas genom att utnyttja det faktum att Python sedan version 2.6 kan köra innehÄllet i ZIP-arkiv för att leverera Python-paket i komprimerad form. Precis som med bytekodscachen bestÀms förekomsten av ett zip-arkiv utifrÄn innehÄllet och inte filÀndelsen, dvs. man kan lÀgga ett zip-arkiv i «fil.py» och vid körning med kommandot «python fil.py» kommer det att behandlas som ett komprimerat Python-paket. Dessutom indexeras ZIP-arkiv i Python inte baserat pÄ rubriken i början av filen, utan pÄ avsnittet EOCD (End of Central Directory Record) i slutet av filen. Om arkivet innehÄller filen «__main__.py» kommer denna fil att köras automatiskt vid direkt körning av arkivet med kommandot «python arkiv».

TĂ€vlingens uppgift löstes genom att generera ett liknande ZIP-arkiv och införa det i texten av kommentaren. För att bevara strukturens korrekthet i filen mot bakgrund av att det i slutet av den ursprungliga filen finns ett anrop av ‘print(«Thanks for playing!»)’, anvĂ€ndes det faktum att det i EOCD-sektionen finns ett kommentarsomrĂ„de som placeras i slutet.

Genom att kontrollera innehÄllet i kommentars-texten i ett Python-skript kan man uppnÄ kodens utförande.
Genom att kontrollera innehÄllet i kommentars-texten i ett Python-skript kan man uppnÄ kodens utförande.


KĂ€lla: opennet.ru
Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster