JSFuck

JSFuck on esoteeriline programmeerimiskeele variant, mis võimaldab kirjutada täielikke JavaScripti programme, kasutades ainult kuut sümbolit: [, ], (, ), ! ja + [1].Inspiratsioon selleks tuli varasematest esoteerilistest programmeerimiskeeltest, näiteks Brainfuckist, mis kasutas samuti minimaalset sümbolite kogumit [2]. Yosuke Hasegawa loodud tööriist jjencode oli üks JSFucki eelkäijatest, mis suutis JavaScripti koodi muuta segaseks, kasutades piiratud hulka sümboleid [3].

JSFucki töötas välja Martin Kleppe, tuntud JavaScripti arendaja ja esoteeriliste programmeerimismeetodite populariseerija [4]. Tänu tema tööle on JSFuck leidnud laialdast kasutust erinevates valdkondades, sealhulgas turvalisuse testimises ja teaduslikes eksperimentides [5].

Andmetüüpide kasutamine

[muuda | muuda lähteteksti]

JSFucki toimimine põhineb JavaScripti dünaamilise andmetüübisüsteemi ja selle konversiooni omadustel. Tüübisüsteem võimaldab mitmeid keerukaid manipulatsioone, mis muudavad JSFucki võimalikuks. Näiteks võimaldab JavaScript konverteerida andmetüüpe automaatselt erinevateks väärtusteks, olenevalt kasutatavast süntaksist [6].

Mõned näited andmetüübikonversioonidest JSFuckis:

[] + []      // "" (tühi string)

+[]          // 0 (numbriline väärtus)

![]          // false (tõeväärtus)

!![]         // true (tõeväärtus)

Need lihtsad näited näitavad, kuidas JavaScripti andmetüübisüsteem teisendab väärtusi erinevateks andmetüüpideks. JSFuck kasutab neid omadusi sümbolite genereerimiseks, mis on vajalikud keerukate väljendite loomiseks.

Projekt JScrewIt on dokumenteerinud selle lähenemise tehnilisi aspekte [7]. Lisaks sellele on OWASP oma juhistes toonud välja, kuidas sellised manipulatsioonid võivad mõjutada veebirakenduste turvalisust [8]. Seda tüüpi esoteerilised meetodid võivad aidata avastada haavatavusi, mida tavalised turvameetodid ei pruugi märgata.

Sümbolite genereerimine

[muuda | muuda lähteteksti]

JSFucki üks keerukamaid aspekte on sümbolite genereerimine, kasutades ainult kuut sümbolit. Näiteks tähe a genereerimiseks kasutatakse järgmist avaldist:

// "false"[1] annab tähe "a"

(![]+[])[+!+[]]

See keerukas konstruktsioon töötab järgmiselt:

  1. ![] annab false
  2. ![] + [] teisendab selle stringiks "false"
  3. +!+[] annab numbri 1
  4. Kogu avaldis võtab stringi "false" teise tähe

Sarnaselt saab luua ka teisi tähti ja sümboleid, kasutades sarnaseid andmetüübikonversioone ja manipuleerimisi. Näiteks tähe b loomiseks võib kasutada järgmist konstruktsiooni:

// "false"[2] annab tähe "b"

(![]+[])[+!+[]+!+[]]

Selline lähenemine tugineb JavaScripti sisseehitatud objektide ja meetodite kasutamisele, et genereerida vajalikud ASCII sümbolid. JSFucki dokumentatsioon selgitab üksikasjalikult, kuidas erinevaid sümboleid luuakse, kasutades erinevaid prototüüpe ja meetodeid [9].

Funktsioonide ja objektide konstrueerimine

[muuda | muuda lähteteksti]

JSFucki keerukamate aspektide hulka kuulub funktsioonide ja objektide konstrueerimine. See on oluline, kuna ilma funktsioonide loomiseta oleks JSFucki kasutamine piiratud. JavaScripti prototüübipõhine pärimismudel võimaldab luua funktsioone ja objekte erinevatel viisidel [4]. Näiteks:

// Function konstruktori loomine

[]['filter']['constructor']

// Funktsioonide dünaamiline loomine

([]+[])[+!+[]+!+[]+!+[]] + // "c"

([]+[])[+!+[]+!+[]]        // "o"

// jne, et luua sõne "constructor"

Funktsioonide loomine on JSFuckis hädavajalik, kuna see võimaldab kirjutada dünaamilisi JavaScripti programme, mis kasutavad ainult piiratud sümbolite kogumit. Selline lähenemine on levinud turvatestimises ja pahatahtliku koodi maskeerimisel, et vältida avastamist [5][8].

Keerukamate funktsioonide loomine nõuab tihti mitme erineva tüübikonversiooni ja prototüübi kasutamist. Näiteks on võimalik luua funktsioon, mis tagastab arvulisi väärtusi või stringe sõltuvalt sisendist [4].

JavaScripti sisseehitatud meetodid nagu toString ja valueOf on olulised tööriistad JSFucki kontekstis. Neid meetodeid kasutatakse sageli tüübikonversioonide manipuleerimiseks ja keerukate konstruktsioonide loomiseks [10].

Turvatestimine

[muuda | muuda lähteteksti]

JSFucki kasutatakse sageli veebirakenduste turvatestimises, et tuvastada haavatavusi, mida tavalised meetodid ei suuda avastada. Selle esoteerilise lähenemise abil saab testida erinevaid turvamehhanisme, sealhulgas:

  1. XSS (Cross-Site Scripting) kaitse
  2. Sisendvalideerimise mehhanismid
  3. Koodianalüsaatorite ja turvafiltirite testimine
  4. Pahatahtliku koodi maskeerimise võimalused

XSS-rünnakud on üks levinumaid rünnakutüüpe, mida saab JSFucki abil testida. Kuna JSFuck muudab koodi raskesti loetavaks, saab seda kasutada XSS-filtirite ja turvamehhanismide tõhususe hindamiseks [11].

Lisaks kasutatakse JSFucki turvafiltirite ja sisendvalideerimise testimiseks. Kui rakendus suudab edukalt ära tunda ja blokeerida JSFuckiga kirjutatud koodi, siis on selle turvameetmed tugevad. Kui aga JSFuckiga kirjutatud kood pääseb läbi, viitab see potentsiaalsetele haavatavustele [12].

Sõltuvus andmetüübi teisendustest

[muuda | muuda lähteteksti]

JSFucki üks põhilisi omadusi on sõltuvus andmetüübi teisendustest. Iga sümbol genereeritakse läbi mitme järjestikuse andmetüübiteisenduse. Näiteks numbri konstrueerimine:

+[]            // 0

+!+[]          // 1

+!+[]+!+[]     // 2

// jne

Andmetüübiteisenduste kasutamine võimaldab JSFuckil luua keerukaid sümboleid ja objekte, kasutades ainult piiratud sümbolite kogumit. See on üks peamisi põhjuseid, miks JSFuck on nii võimas ja paindlik .Lisaks tüübiteisendustele sõltub JSFuck ka JavaScripti sisemistest prototüüpidest ja konstruktoritest [4]. Näiteks:

[].__proto__                // Array.prototype

[].__proto__.__proto__      // Object.prototype

Prototüübiahela kaudu saab JSFuckis kasutada erinevaid sisseehitatud JavaScripti funktsioone ja meetodeid, mis muidu poleks saadaval. See võimaldab luua keerukaid programme ja manipuleerida JavaScripti keskkonnaga ainulaadsel viisil.

  1. "JSFuck - Write any JavaScript with 6 Characters: []()!+". jsfuck.com. Vaadatud 11. jaanuaril 2025.
  2. "brainfuck - Esolang". esolangs.org. Vaadatud 11. jaanuaril 2025.
  3. "jjencode - Encode any JavaScript program using only symbols". utf-8.jp. Vaadatud 11. jaanuaril 2025.
  4. 4,0 4,1 4,2 4,3 Kleppe, Martin (11. jaanuar 2025), aemkei/jsfuck, vaadatud 11. jaanuaril 2025
  5. 5,0 5,1 "XSS and how JSFuck just f*cked my brain – Hung Ngo" (inglise). Vaadatud 11. jaanuaril 2025.
  6. "Type Conversions". javascript.info (inglise). Vaadatud 11. jaanuaril 2025.
  7. Trotta, Francesco (27. november 2024), fasttime/JScrewIt, vaadatud 11. jaanuaril 2025
  8. 8,0 8,1 "Cross Site Scripting (XSS) | OWASP Foundation". owasp.org (inglise). Vaadatud 11. jaanuaril 2025.
  9. "jsfuck/jsfuck.js at main · aemkei/jsfuck". GitHub (inglise). Vaadatud 11. jaanuaril 2025.
  10. Tommy (5. juuli 2023). "Type Conversion || JavaScript || Basics". Medium (inglise). Vaadatud 11. jaanuaril 2025.
  11. "JSFuck - Penetration Testing Tools" (Ameerika inglise). Vaadatud 11. jaanuaril 2025.
  12. Kovacs, Eduard (19. veebruar 2016). "Partially Fixed eBay Flaw Exploited for Phishing, Scams". SecurityWeek (Ameerika inglise). Vaadatud 11. jaanuaril 2025.