맨위로가기

JSFuck

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의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
기본 정보
JSFuck 로고
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