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].
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.
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:
![]
annab false
![] + []
teisendab selle stringiks "false"
+!+[]
annab numbri 1
"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].
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].
JSFucki kasutatakse sageli veebirakenduste turvatestimises, et tuvastada haavatavusi, mida tavalised meetodid ei suuda avastada. Selle esoteerilise lähenemise abil saab testida erinevaid turvamehhanisme, sealhulgas:
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].
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.