JSFuck
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
JSFuck은 2010년 하세가와 요스케가 개발한, 자바스크립트 코드를 `[]()!+`의 6개의 문자만 사용하여 난독화하는 기술이다. 자바스크립트의 타입 변환, 연산자, 배열 인덱싱 등의 특징을 활용하여, 문자열을 생성하고, 이를 조합하여 코드를 구성한다. JSFuck은 악성 자바스크립트 코드가 보안 시스템을 우회하는 데 악용될 수 있으며, 이베이 경매 페이지에 스크립트 삽입에 사용된 사례가 있다.
더 읽어볼만한 페이지
- 난해한 프로그래밍 언어 - HQ9+
HQ9+는 간단한 인터프리터 구현이 가능한 난해한 프로그래밍 언어로, 'Hello, world!' 출력, 소스 코드 출력, "99 Bottles of Beer" 가사 출력, 누산기 값 증가의 네 가지 명령을 제공한다. - 난해한 프로그래밍 언어 - FRACTRAN
FRACTRAN은 정수의 소인수 지수를 레지스터로 활용하여 분수 목록을 곱하는 과정을 반복하며 다양한 계산을 수행하는 계산 모델이다. - 자바스크립트 - HTML
HTML은 웹 페이지 제작을 위한 표준 마크업 언어로서, 팀 버너스리가 제안하고 구현한 후 인터넷 발전과 함께 널리 사용되며, SGML에 기반하여 하이퍼텍스트 기능으로 다양한 콘텐츠를 표현하고 연결하며, W3C와 WHATWG에서 표준화를 진행하고 최신 버전은 HTML Living Standard이다. - 자바스크립트 - 비주얼 스튜디오
비주얼 스튜디오는 마이크로소프트가 개발한 통합 개발 환경(IDE)으로, 다양한 프로그래밍 언어와 플랫폼을 지원하며 소프트웨어 개발에 필요한 도구와 기능을 제공한다.
| JSFuck | |
|---|---|
| 기본 정보 | |
![]() | |
| 유형 | 난해한 프로그래밍 언어 |
| 고안자 | 스테판 에세르 |
| 첫 공개 | 2010년 |
| 설계 방식 | 함수형 프로그래밍, 난해한 프로그래밍 언어 |
2. 역사
2009년 7월, 하세가와 요스케는 18개의 기호만으로 자바스크립트 코드를 난독화하는 jjencode를 개발했다.[2][3] 2010년 1월, sla.ckers.org에서 열린 비공식 대회에서 사용되는 기호의 수를 줄이기 위한 경쟁이 벌어졌고, 참가자들은 `,`와 `/` 기호를 제거하는 데 성공했다.[4] 그 후 2010년 3월에는 6개의 문자만 사용하는 JS-NoAlnum이라는 온라인 인코더가 등장했으며,[5] 같은 해 말, 하세가와는 6개의 문자만 사용하는 JSF*ck 인코더를 출시했다.[6][7] 2012년에는 마틴 클레페가 깃허브(GitHub)에 "jsfuck" 프로젝트를 만들고, JSFuck.com 웹사이트를 통해 인코더를 공개했다.[8][9]
2. 1. jjencode (2009)
2009년 7월, 하세가와 요스케는 `[]()!+,\"$.:;_{}~=`의 18개 기호만 사용하여 임의의 자바스크립트를 난독화된 형태로 인코딩할 수 있는 jjencode라는 웹 애플리케이션을 만들었다.[2][3]2. 2. 온라인 포럼 경쟁 (2010)
2010년 1월, 웹 애플리케이션 보안 사이트 sla.ckers.org의 "Obfuscation(난독화)" 포럼에서 `[]()!+,/`의 8개 문자 미만으로 줄이는 방법을 찾기 위한 비공식적인 대회가 열렸다.[4] 스레드 참가자들은 `,`와 `/` 문자를 제거하는 데 성공했다.[4]2. 3. JS-NoAlnum (2010)
2010년 1월, sla.ckers.org 웹 애플리케이션 보안 사이트의 "Obfuscation(난독화)" 포럼에서 필요한 최소 문자 수를 `[]()!+,/`의 8개 미만으로 줄이는 방법을 찾기 위한 비공식적인 대회가 열렸다.[4] 스레드 참가자들은 `,`와 `/` 문자의 필요성을 제거하는 데 성공했다.[4] 2010년 3월 기준으로, 최종 6개 문자만 사용하는 JS-NoAlnum이라는 온라인 인코더가 등장했다.[5]2. 4. JSF*ck (2010)
2010년 말, 하세가와 요스케는 단 6개의 문자만을 사용하는 JSF*ck이라는 새로운 인코더를 출시했다.[6][7]2. 5. JSFuck 프로젝트 (2012)
2012년, 마틴 클레페는 깃허브(GitHub)에 "jsfuck" 프로젝트를 만들었고,[8] JSFuck.com 웹사이트를 개설하여 해당 인코더를 구현한 웹 앱을 공개했다.[9]3. 작동 원리
JSFuck 코드는 매우 길다. 자바스크립트에서 `alert("Hello World!")` 코드는 텍스트 "Hello world"가 포함된 팝업 창을 여는 데 21자가 필요하지만, JSFuck에서는 동일한 코드가 4325자나 된다.[12] 심지어 특정 단일 문자는 JSFuck으로 표현하면 1000자 이상이 필요할 때도 있다.
JSFuck은 자바스크립트의 타입 변환, 연산자, 배열 인덱싱 등의 특징을 활용하여 6개의 문자(`[`, `]`, `(`, `)`, `!`, `+`)만으로 코드를 표현한다.
3. 1. 숫자 생성
JSFuck에서 숫자는 몇 가지 기본 요소를 조합하여 만든다. 0은 `+[]`로 표현하는데, 여기서 `[]`는 빈 배열을 나타내고, `+`는 이 빈 배열을 숫자 0으로 형 변환하는 단항 플러스 연산자이다.[1]1은 `+!![]` 또는 `+!+[]`로 표현한다. 여기서 `!![]` 또는 `!+[]`는 부울 값 `true`를 나타내며, 앞에 붙은 `+` 연산자에 의해 숫자 1로 변환된다.[2]
2부터 9까지의 숫자는 `true` (즉, `!![]` 또는 `!+[]`)를 해당 숫자만큼 더해서 만든다. 예를 들어, 2는 `!![]+!![]` 또는 `!+[]+!+[]`로 표현할 수 있다. 자바스크립트에서 `true + true`는 2가 되기 때문이다.
| 숫자 | JSFuck 표현 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | `+[]` | |||||||||
| 1 | `+ | []` 또는 `+!+[]` | ||||||||
| 2 | ` | []+ | []` 또는 `!+[]+!+[]` | |||||||
| 3 | ` | []+ | []+ | []` 또는 `!+[]+!+[]+!+[]` | ||||||
| 4 | ` | []+ | []+ | []+ | []` 또는 `!+[]+!+[]+!+[]+!+[]` | |||||
| 5 | ` | []+ | []+ | []+ | []+ | []` 또는 `!+[]+!+[]+!+[]+!+[]+!+[]` | ||||
| 6 | ` | []+ | []+ | []+ | []+ | []+ | []` 또는 `!+[]+!+[]+!+[]+!+[]+!+[]+!+[]` | |||
| 7 | ` | []+ | []+ | []+ | []+ | []+ | []+ | []` 또는 `!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]` | ||
| 8 | ` | []+ | []+ | []+ | []+ | []+ | []+ | []+ | []` 또는 `!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]` | |
| 9 | ` | []+ | []+ | []+ | []+ | []+ | []+ | []+ | []+ | []` 또는 `!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]` |
두 자리 이상의 숫자는 각 자리의 숫자를 배열로 만든 후, 문자열로 연결하여 표현한다. 예를 들어, "10"은 `[1]+[0]`으로 표현할 수 있고, 이를 JSFuck 코드로 바꾸면 `[+!+[]]+[+[]]`가 된다. 이 문자열을 숫자로 바꾸려면 앞에 `+`를 붙여 `+([+!+[]]+[+[]])`와 같이 쓴다.
3. 2. 문자 생성
JSFuck에서는 `"false"`, `"true"`, `"NaN"`, `"undefined"`와 같은 간단한 불린(boolean)이나 숫자 값의 문자열 표현에서 '인덱서'(대괄호 안의 숫자)를 사용하여 단일 문자에 접근하는 방식으로 일부 문자를 얻을 수 있다. 예를 들어 `"false"`의 두 번째 문자인 "a"는 `(![]+[])[+!![]]`와 같이 표현할 수 있다.다음은 가장 간단한 문자를 생성하기 위해 사용되는 기본 값 목록이다.
| 값 | JSFuck | |||||
|---|---|---|---|---|---|---|
| `false` | `![]` | |||||
| `true` | ` | []` | ||||
| `NaN` | `+[![]]` | |||||
| `undefined` | `[]` | |||||
| `Infinity` | +(+ | []+( | []+[])[ | []+ | []+ | []]+[+!![]]+[+[]]+[+[]]+[+[]]) |
이러한 기본 값들을 조합하고 인덱서를 활용하여 다른 문자들을 생성할 수 있다. 예를 들어, 문자 'y'는 `1e1000`을 숫자로 변환하여 얻는 `Infinity`를 통해 생성할 수 있다.[13]
다음 표는 숫자 및 일부 문자의 JSFuck 표현식을 보여준다.
| 문자 | JSFuck | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
+ | (+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[!+[]+!+[]] | |||||||||
. | (+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]] | |||||||||
0 | +[] | |||||||||
1 | + | [] | ||||||||
2 | | []+ | [] | |||||||
3 | | []+ | []+ | [] | ||||||
4 | | []+ | []+ | []+ | [] | |||||
5 | | []+ | []+ | []+ | []+ | [] | ||||
6 | | []+ | []+ | []+ | []+ | []+ | [] | |||
7 | | []+ | []+ | []+ | []+ | []+ | []+ | [] | ||
8 | | []+ | []+ | []+ | []+ | []+ | []+ | []+ | [] | |
9 | | []+ | []+ | []+ | []+ | []+ | []+ | []+ | []+ | [] |
a | (![]+[])[+!+[]] | |||||||||
d | ([]+[])[!+[]+!+[]] | |||||||||
e | ( | []+[])[!+[]+!+[]+!+[]] | ||||||||
f | (![]+[])[+[]] | |||||||||
i | ([![]]+[])[+!+[]+[+[]]] | |||||||||
I | (+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))+[])[+[]] | |||||||||
l | (![]+[])[!+[]+!+[]] | |||||||||
N | (+[![]]+[])[+[]] | |||||||||
n | ([]+[])[+!+[]] | |||||||||
r | (!+[]+[])[+!+[]] | |||||||||
s | (![]+[])[!+[]+!+[]+!+[]] | |||||||||
t | ( | +[]+[])[+[]] | ||||||||
u | ([]+[])[+[]] | |||||||||
y | (+[![]]+[+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))])[+!+[]+[+[]]] |
3. 2. 1. "a" 생성 예시
`"false"`의 두 번째 문자인 "a"를 추출하기 위해 `(![]+[])[+!![]]`와 같은 코드를 사용한다.[14]- `"false"[1]`: `"false"`는 `false+[]`, 즉 부울 상수 `false`에 빈 배열을 더하여 만들 수 있다.
- `(false+[])[1]`: `false`는 `![]`(빈 배열에 부정 적용)로 작성한다.
- `(![]+[])[1]`: 1은 숫자이며, `+true`로 쓸 수 있다.
- `(![]+[])[+true]`: `false`가 `![]`이므로 `true`는 `!![]`이다.
- `(![]+[])[+!![]]` – 이는 "a"로 평가된다.
자바스크립트에서 `alert((![]+[])[+!![]])`는 `alert("a")`와 동일한 작업을 수행한다.[14]
3. 3. 기타 기능 생성
`Function` 생성자는 문자열에 포함된 JavaScript 코드를 네이티브 JavaScript처럼 실행하는 데 사용될 수 있다. 예를 들어, `alert(1)` 문은 `Function("alert(1)")()`과 동일하다. `Function` 생성자는 JSFuck에서 `[]["filter"]` ( `Array.prototype.filter` ) 또는 최신 브라우저의 `[]["flat"]` ( `Array.prototype.flat` )과 같은 잘 알려진 함수의 ''constructor'' 속성에 접근하여 검색할 수 있다. 그러면 `alert(1)`은 `[]["flat"]["constructor"]("alert(1)")()`이 된다.[29]`Function`의 생성자는 자바스크립트로서 유효한 코드를 실행할 수 있으므로, `alert(1)`은 `Function("alert(1)")()`과 동일하다. `Function`의 생성자는 `[]["filter"]` ( `Array.prototype.filter` )와 같이 표준 함수의 `constructor` 프로퍼티에서 가져올 수 있다. 이 점을 고려하면, `alert(1)`은 `[]["filter"]["constructor"]("alert(1)")()`로 바꿔 쓸 수 있다.[29]
4. 문자표
JSFuck에서 사용되는 각 문자의 최소 표현식은 다음과 같다.
| 문자 | JSFuck | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
+ | (+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[!+[]+!+[]] | |||||||||
. | (+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]] | |||||||||
0 | +[] | |||||||||
1 | + | [] 또는 +!+[] | ||||||||
2 | | []+ | [] 또는 !+[]+!+[] | |||||||
3 | | []+ | []+ | [] 또는 !+[]+!+[]+!+[] | ||||||
4 | | []+ | []+ | []+ | [] 또는 !+[]+!+[]+!+[]+!+[] | |||||
5 | | []+ | []+ | []+ | []+ | [] 또는 !+[]+!+[]+!+[]+!+[]+!+[] | ||||
6 | | []+ | []+ | []+ | []+ | []+ | [] 또는 !+[]+!+[]+!+[]+!+[]+!+[]+!+[] | |||
7 | | []+ | []+ | []+ | []+ | []+ | []+ | [] 또는 !+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[] | ||
8 | | []+ | []+ | []+ | []+ | []+ | []+ | []+ | [] 또는 !+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[] | |
9 | | []+ | []+ | []+ | []+ | []+ | []+ | []+ | []+ | [] 또는 !+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[] |
a | (![]+[])[+!+[]] | |||||||||
d | ([]+[])[!+[]+!+[]] | |||||||||
e | ( | []+[])[!+[]+!+[]+!+[]] | ||||||||
f | (![]+[])[+[]] | |||||||||
i | ([![]]+[])[+!+[]+[+[]]] | |||||||||
I | (+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))+[])[+[]] | |||||||||
l | (![]+[])[!+[]+!+[]] | |||||||||
N | (+[![]]+[])[+[]] | |||||||||
n | ([]+[])[+!+[]] | |||||||||
r | (!+[]+[])[+!+[]] | |||||||||
s | (![]+[])[!+[]+!+[]+!+[]] | |||||||||
t | ( | +[]+[])[+[]] | ||||||||
u | ([]+[])[+[]] | |||||||||
y | (+[![]]+[+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))])[+!+[]+[+[]]] |
예를 들어, "a"는 문자열 "false"에서 가져온다. "false"의 두 번째 문자가 "a"이며, 이는 `false[1]`로 접근할 수 있다. "false"는 `false+[]`로 만들 수 있는데, 이는 false와 빈 배열을 더하는 것이다. `false`는 `![]`(논리 부정을 빈 배열에 적용)로 생성할 수 있으므로, `(![]+[])[1]`이 된다. 1은 숫자이므로 `+true`로 대체할 수 있으며, `true`는 `!![]`이므로, 최종적으로 `(![]+[])[+!![]]`로 "a"를 반환한다.
`alert((![]+[])[+!![]])`와 `alert("a")`는 JavaScript에서 같은 출력을 낸다.[29]
5. 보안 문제
JSFuck과 같이 일반적인 자바스크립트와 구별되는 특징이 부족한 암호화 기술은 악성 자바스크립트 코드가 침입 방지 시스템[36]이나 콘텐츠 필터를 우회하도록 돕는다.[37]
5. 1. 악성 코드 삽입
JSFuck과 같이 일반적인 자바스크립트에서 잘 쓰이지 않는 기능을 활용하는 난독화 기술은 악성 자바스크립트 코드가 침입 방지 시스템[36]이나 콘텐츠 필터를 우회하는 데 사용될 수 있다. 예를 들어, 콘텐츠 필터에 결함이 있고 JSFuck에 영숫자 문자가 없는 점을 악용하여 판매자들이 이베이 경매 페이지에 임의의 JSFuck 스크립트를 삽입할 수 있었다.[37]5. 2. 이베이 취약점
JSFuck과 같이 일반적인 자바스크립트와 구별되는 특징이 부족한 암호화 기술은 악성 자바스크립트 코드가 침입 방지 시스템[36]이나 콘텐츠 필터를 우회하도록 돕는다. 예를 들어, JSFuck은 영숫자 문자가 없고 콘텐츠 필터에 결함이 있으면, 판매자들이 이베이 경매 페이지에 임의의 JSFuck 스크립트를 삽입할 수 있었다.[37]참조
[1]
웹사이트
"Bidding on Security"
http://thedailywtf.c[...]
[2]
웹사이트
jjencode - Encode any JavaScript program using only symbols
http://utf-8.jp/publ[...]
2009-07-10
[3]
웹사이트
UTF-8.jp
http://utf-8.jp/
2009-07
[4]
웹사이트
Yet Another Useless Contest (but fun!) Less chars needed to run arbitrary JS code
http://sla.ckers.org[...]
2010-01-14
[5]
웹사이트
js-noalnum_com.php
http://discogscounte[...]
[6]
웹사이트
JSF*ck - []()!+
http://utf-8.jp/publ[...]
2010-11
[7]
웹사이트
UTF-8.jp
http://utf-8.jp/
2010-11
[8]
웹사이트
Commits · aemkei/jsfuck
https://github.com/a[...]
2017-10-25
[9]
웹사이트
Site report for www.jsfuck.com
http://toolbar.netcr[...]
2017-10-25
[10]
웹사이트
eBay has no plans to fix "severe" bug that allows malware distribution [Updated]
https://arstechnica.[...]
2016-02-03
[11]
Github
jQuery JavaScript library made of only six different characters: ! ( ) + [ ]
https://github.com/f[...]
[12]
웹사이트
JScrewIt
https://jscrew.it/
2021-06-13
[13]
블로그
"Brainfuck Beware: JavaScript is after you!"
http://patriciopalla[...]
[14]
문서
Adapted from: https://esolangs.org/wiki/JSFuck
[15]
웹사이트
Bypassing WAFs with non-alphanumeric XSS
http://blog.infobyte[...]
2012-09
[16]
간행물
Fully Human, Fully Machine: Rhetorics of Digital Disembodiment in Programming
2020-04-02
[17]
웹사이트
"Bidding on Security"
http://thedailywtf.c[...]
[18]
웹사이트
jjencode - Encode any JavaScript program using only symbols
http://utf-8.jp/publ[...]
2009-07-10
[19]
웹사이트
UTF-8.jp
http://utf-8.jp/
2009-07
[20]
웹사이트
Yet Another Useless Contest (but fun!) Less chars needed to run arbitrary JS code
http://sla.ckers.org[...]
2010-01-14
[21]
웹사이트
js-noalnum_com.php
http://discogscounte[...]
[22]
웹사이트
JSF*ck - []()!+
http://utf-8.jp/publ[...]
2010-11
[23]
웹사이트
UTF-8.jp
http://utf-8.jp/
2010-11
[24]
웹사이트
Commits · aemkei/jsfuck
https://github.com/a[...]
2017-10-25
[25]
웹사이트
Site report for www.jsfuck.com
http://toolbar.netcr[...]
2017-10-25
[26]
뉴스
Ebay has no plans to fix severe bug that allows malware distribution
https://arstechnica.[...]
Ars Technica
[27]
Github
jQuery JavaScript library made of only six different characters: ! ( ) + [ ]
https://github.com/f[...]
[28]
블로그
"Brainfuck Beware: JavaScript is after you!"
http://patriciopalla[...]
[29]
문서
Adapted from: https://esolangs.org/wiki/JSFuck
[30]
웹사이트
Bypassing WAFs with non-alphanumeric XSS
http://blog.infobyte[...]
2012-09
[31]
웹사이트
eBay has no plans to fix "severe" bug that allows malware distribution [Updated]
https://arstechnica.[...]
2018-09-08
[32]
웹사이트
"Bidding on Security"
http://thedailywtf.c[...]
[33]
웹사이트
Yet Another Useless Contest (but fun!) Less chars needed to run arbitrary JS code
https://web.archive.[...]
[34]
뉴스
Ebay has no plans to fix severe bugs that allows malware distribution
https://arstechnica.[...]
Ars Technica
[35]
Github
jQuery JavaScript library made of only six different characters: ! ( ) + [ ]
https://github.com/f[...]
[36]
웹사이트
Bypassing WAFs with non-alphanumeric XSS
http://blog.infobyte[...]
2012-09
[37]
웹인용
eBay has no plans to fix "severe" bug that allows malware distribution [Updated]
https://arstechnica.[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com
