JSFuck
JSFuck är en esoterisk delmängd av JavaScript , där koden skrivs med endast sex tecken : [
, ]
, (
, )
, !
, och +
. Namnet kommer från Brainfuck , ett esoteriskt programmeringsspråk som också använder ett minimalistiskt alfabet med endast skiljetecken . Till skillnad från Brainfuck, som kräver sin egen kompilator eller tolk , är JSFuck giltig JavaScript-kod, vilket innebär att JSFuck-program kan köras i vilken webbläsare eller motor som helst som tolkar JavaScript. JSFuck kan återskapa all JavaScript-funktionalitet med en så begränsad uppsättning tecken eftersom JavaScript är ett svagt skrivet programmeringsspråk, och det tillåter utvärdering av alla uttryck som alla typer.
Historia
I juli 2009 skapade Yosuke Hasegawa en webbapplikation som heter jjencode som kunde koda godtycklig JavaScript till en obfuskerad form med endast de 18 symbolerna []( )!+,\"$.:;_{}~= .
I januari 2010, en informell tävling hölls i "Obfuscation"-forumet på sla.ckers.orgs säkerhetswebbplats för webbapplikationer för att komma på ett sätt att få ner det minsta antalet tecken som krävs till mindre än åtta: []()!+, /
. Bidragsgivare till tråden lyckades eliminera behovet av tecknen ,
och /
. Från och med mars 2010 fanns en onlinekodare vid namn JS-NoAlnum tillgänglig som endast använde den sista uppsättningen av sex tecken. I slutet av 2010 gjorde Hasegawa en ny tillgänglig kodare med namnet JSF*ck som också endast använde de minst sex tecknen. 2012 skapade Martin Kleppe ett "jsfuck"-projekt på GitHub och en JSFuck.com-webbplats med en webbapp som använder den implementeringen av kodaren.
JSFuck kan användas för att kringgå upptäckt av skadlig kod som skickas in på webbplatser , t.ex. i cross-site scripting (XSS) attacker. En annan potentiell användning av JSFuck ligger i kodobfuskering . En optimerad version av JSFuck har använts för att koda jQuery , ett JavaScript-bibliotek , till en fullt fungerande version skriven med bara de sex tecknen.
Kodningsmetoder
JSFuck-koden är extremt "omfattande": I JavaScript är kodvarningen (" Hello World! ")
, som gör att ett popup- fönster öppnas med texten "Hello world", 21 tecken långt. I JSFuck har samma kod en längd på 4325 tecken. Vissa enstaka tecken kräver mycket mer än 1000 tecken när de expanderas som JSFuck. Det här avsnittet ger en översikt över hur denna expansion fungerar.
Tal
Talet 0 skapas av +[]
, där []
är den tomma arrayen och +
är det unära pluset , som används för att omvandla den högra sidan till ett numeriskt värde (noll här). Talet 1 bildas som +!![]
eller +!+[]
, där det booleska värdet sant
(uttryckt som !![]
eller !+[]
i JSFuck) omvandlas till det numeriska värdet 1 med plustecknet. . Siffrorna 2 till 9 bildas genom att summera sant
ett lämpligt antal gånger. T.ex. i JavaScript true + true
= 2 och true
= !![]
= !+[]
, därför kan 2 skrivas som !![]+!![]
eller !+[]+!+[]
. Andra siffror följer ett liknande mönster. Heltal som består av två eller flera siffror skrivs som en sträng genom att sammanfoga ensiffriga arrayer med plusoperatorn. Till exempel kan strängen "10"
uttryckas i JavaScript som [1] + [0]
. Genom att ersätta siffrorna med respektive JSFuck-expansion ger detta [+!+[]]+[+[]]
. För att få ett numeriskt värde istället för en sträng, skulle man inkludera det föregående uttrycket inom parentes eller hakparenteser och lägga ett plus framför, vilket ger 10
= +([+!+[]]+[+[]])
.
Brev
Vissa bokstäver kan erhållas i JSFuck genom att komma åt enstaka tecken i strängrepresentationer av enkla booleska eller numeriska värden som "false"
, "true"
, "NaN"
, "odefinierad"
med en indexerare (ett tal inom hakparenteser). Det behövs andra knep för att få fram andra bokstäver – till exempel genom att gjuta strängen 1e1000
till en siffra, vilket ger Infinity
, vilket i sin tur gör bokstaven y
tillgänglig.
Följande är en lista över primitiva värden som används som byggstenar för att producera de enklaste bokstäverna.
Värde JSFuck falsk
![]
Sann
!![]
eller!+[]
NaN
+[![]]
odefinierad
[][[]]
Oändlighet
+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+ []]+[+[]])
Exempel: Skapa bokstaven "a"
"a"
: Taget från strängen "false"
. Det andra tecknet i "false" är a, som kan nås med:
-
"falskt"[1]
."false"
kan göras frånfalse+[]
, dvs. den booleska konstanten false plus en tom array. -
(false+[])[1]
: Vi skriver false som![]
(negation tillämpas på en tom array). -
(![]+[])[1]
: 1 är ett tal, vi kan skriva det som+sant
. -
(![]+[])[+true]
: Eftersom falskt är![]
är sant!![]
. -
(![]+[])[+!![]]
– som utvärderas till "a".
Bevis: I JavaScript gör alert((![]+[])[+!![]])
samma sak som alert("a")
.
Andra konstruktioner
Funktionskonstruktorn kan användas för att utlösa exekvering av JavaScript-kod som finns i en sträng som om det vore inbyggt JavaScript
. Så, till exempel, uttalandet alert(1)
är ekvivalent med Function("alert(1)")()
. Funktionskonstruktorn kan hämtas i JSFuck genom att komma åt konstruktoregenskapen för en välkänd funktion, såsom []["filter"]
( Array.prototype.filter
) eller [
]["flat"]
( Array.prototype.flat
) i moderna webbläsare. Och då blir alert(1)
[]["flat"]["constructor"]("alert(1)")()
.
Karaktärstabell
Karaktärerna med de kortaste JSFuck-expansionerna listas nedan. Andra UTF-8- tecken kan också uttryckas men kommer att generera betydligt längre kod.
Karaktär JSFuck +
(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[ +[]])+[])[!+[]+!+[]]
.
(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+! +[]]+[+[]])+[])[+!+[]]
0
+[]
1
+!![]
eller+!+[]
2
!![]+!![]
eller!+[]+!+[]
3
!![]+!![]+!![]
eller!+[]+!+[]+!+[]
4
!![]+!![]+!![]+!![]
eller!+[]+!+[]+!+[]+!+[]
5
!![]+!![]+!![]+!![]+!![]
eller!+[]+!+[]+!+[]+!+[]+!+[]
6
!![]+!![]+!![]+!![]+!![]+!![]
eller!+[]+!+[]+!+[]+!+[]+ !+[]+!+[]
7
!![]+!![]+!![]+!![]+!![]+!![]+!![] eller !+[]+!+
[]+!+[]+ !+[]+!+[]+!+[]+!+[]
8
!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![] eller !+[]+!+[
]+ !+[]+!+[]+!+[]+!+[]+!+[]+!+[]
9
!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![] eller !+[
]+ !+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
a
(![]+[])[+!+[]]
c
([]+[][(![]+[])[+!![]]+(!![]+[])[+[]]])[!![]+!![]+ !![]]
d
([][[]]+[])[!+[]+!+[]]
e
(!![]+[])[!+[]+!+[]+!+[]]
f
(![]+[])[+[]]
i
([![]]+[][[]])[+!+[]+[+[]]]
jag
(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+( +[])+(+[]))+[])[+[]]
l
(![]+[])[!+[]+!+[]]
N
(+[![]]+[])[+[]]
n
([][[]]+[])[+!+[]]
o
(!![]+[][(![]+[])[+!![]]+(!![]+[])[+[]]])[+!![]+[+ []]]
r
(!+[]+[])[+!+[]]
s
(![]+[])[!+[]+!+[]+!+[]]
t
(!+[]+[])[+[]]
u
([][[]]+[])[+[]]
y
(+[![]]+[+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[]) +(+[])+(+[])+(+[]))])[+!+[]+[+[]]]
säkerhet
I brist på de distinkta egenskaperna hos "vanligt" JavaScript, kan obfuskeringstekniker som JSFuck hjälpa skadlig JavaScript-kod att kringgå system för förebyggande av intrång eller innehållsfilter. Till exempel, avsaknaden av alfanumeriska tecken i JSFuck och ett felaktigt innehållsfilter gjorde det möjligt för säljare att bädda in godtyckliga JSFuck-skript på sina eBay-auktionssidor.
Se även
- Brainfuck - ett esoteriskt programmeringsspråk skapat 1993 av Urban Müller.
externa länkar
- JSFuck - Skriv valfritt JavaScript med 6 tecken: []()!+ - webbapplikation för att koda JavaScript till JSFuck
- JavaScript-kod för ovannämnda omvandlare
- JScrewIt - Ett annat verktyg för att konvertera JavaScript till JSFuck, med miljöspecifika optimeringar