JS푸크

JSFuck

JSFuckJavaScriptesotericsubset이며, 여기서 코드는 다음 6자만 사용하여 작성된다.[,],(,),!그리고+그 이름은 또한 구두점만을 사용하는 난해한 프로그래밍 언어인 Brainfuck에서 유래되었다.자체 컴파일러통역사가 필요한 브레인 푸크와 달리 JSFuck은 유효한 자바스크립트 코드로서, JSFuck 프로그램은 자바스크립트를 해석하는 어떤 웹 브라우저엔진에서도 실행할 수 있다는 것을 의미한다.JSFuck은 JavaScript가 약하게 타이핑된 프로그래밍 언어이기 때문에 이러한 제한된 문자 집합을 사용하여 모든 JavaScript 기능을 재생성할 수 있으며, 어떤 표현도 어떤 유형으로든 평가할 수 있기 때문이다.[1]

역사

2009년 7월, 하세가와 요스케는 18개의 기호만을 이용하여 임의의 자바스크립트를 난독화된 형태로 인코딩할 수 있는 jyjencode라는 웹 어플리케이션을 만들었다.[]()!+,\"$.:;_{}~=2010년 1월, sla.ckers.org 웹 애플리케이션 보안 사이트의 "Obfuscation" 포럼에서 다음과 같은 비공식적인 대회가 개최되어 필요한 최소 문자 수를 8자 미만으로 줄일 수 있는 방법을 고안했다.[2][3][]()!+,/. 그 실에 대한 기여자들은 그 실의 필요를 간신히 없앴다.,그리고/등장인물들[4]2010년 3월 현재, 최종 6자 세트만을 사용하는 온라인 인코더 JS-NoAlnum을 이용할 수 있었다.[5]2010년 말까지 하세가와는 JSF*ck라는 새로운 인코더를 사용할 수 있게 만들었는데, 이 인코더는 또한 최소 6자만을 사용했다.[6][7]2012년 마틴 클렙은 GitHub에 "jsfuck" 프로젝트를 만들었고,[8] 인코더의 구현을 이용한 웹 앱이 있는 JSFuck.com 웹사이트를 만들었다.[9]

JSFuck은 웹사이트에 제출된 악의적인 코드(예: 사이트스크립팅(XSS) 공격)의 탐지를 우회하는 데 사용될 수 있다.[10]JSFuck의 또 다른 잠재적인 용도는 코드 난독화에 있다.JSFuck의 최적화된 버전은 JavaScript 라이브러리jQuery를 단지 6개의 문자로 작성된 완전한 기능 버전으로 인코딩하는 데 사용되었다.[11]

인코딩 메서

JSFuck 코드는 극단적으로 "버보스(verbose)"이다.JavaScript에서 코드alert("Hello World!")"Hello world"라는 텍스트로 팝업 창이 열리게 하는 의 길이는 21자 입니다.JSFuck에서 동일한 코드의 길이는 4325자 입니다.[12]특정 단일 문자는 JSFuck으로 확장될 때 1000자를 훨씬 초과해야 한다.이 절에서는 이러한 확장의 작동 방식을 개괄적으로 설명한다.

숫자

숫자 0은 다음에 의해 생성된다.+[], where[]배열이고+오른쪽을 숫자 값(여기서는 0)으로 변환하는 데 사용되는 단항 플러스 값이다.숫자 1은 다음과 같이 형성된다.+!![]또는+!+[], 여기서 부울true(로 간주됨)!![]또는!+[]in JSFuck)는 앞에 더하기 기호에 의해 숫자 값 1로 변환된다.2에서 9까지의 숫자는 합계로 형성된다.true적절한 횟수예: 자바스크립트true + true= 2 및true=!![]=!+[], 그러므로 2는 다음과 같이 쓰여질 수 있다.!![]+!![]또는!+[]+!+[]다른 숫자들은 비슷한 패턴을 따른다.두 자리 이상의 숫자로 구성된 정수는 플러스 연산자와 1자리 배열을 연결하여 문자열로 쓴다.예를 들어, 문자열"10"로 자바스크립트로 표현할 수 있다.[1] + [0]. 숫자를 각각의 JSFuck 확장으로 대체하면, 이 결과는 다음과 같다.[+!+[]]+[+[]]. 문자열 대신 숫자 값을 얻으려면 이전 식을 괄호나 대괄호로 묶고 플러스를 앞에 붙여서 표시한다.10=+([+!+[]]+[+[]]).

편지들

일부 문자는 JSFuck에서 간단한 부울 또는 다음과 같은 숫자 값의 문자열 표현에서 단일 문자에 액세스하여 얻을 수 있다."false","true","NaN","undefined"인덱서 포함(대괄호 안의 숫자).다른 문자를 생성하기 위해 다른 속임수가 필요하다. 예를 들어, 줄을 주조하는 것1e1000어떤 숫자로, 그것이 주는 것이다.Infinity, 그리고 다시 편지를 만든다.y접근하기 [13]쉬운

다음은 가장 간단한 글자를 만들기 위해 건물 블록으로 사용되는 원시적 가치들의 목록이다.

가치 JS푸크
false ![]
true !![]또는!+[]
NaN +[![]]
undefined [][[]]
Infinity +(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])

예: 문자 "a" 작성

"a": 문자열에서 가져옴"false". "거짓말"의 두 번째 문자는 a로, 다음과 같이 접근할 수 있다.

  1. "false"[1]."false"로 만들 수 있다false+[], 즉, 부울 상수 false + 빈 배열.
  2. (false+[])[1]: 우리는 로서 거짓을 쓴다.![](빈 배열에 적용되는 부정).
  3. (![]+[])[1]: 1은 숫자다, 라고 쓰면 된다.+true.
  4. (![]+[])[+true]: 거짓이므로![], true is!![].
  5. (![]+[])[+!![]]- "a"로 평가한다.

증명: JavaScript에서,alert((![]+[])[+!![]])와 같은 일을 하다alert("a").[14]

기타 구성 요소

Function 생성자를 사용하여 문자열에 포함된 JavaScript 코드의 실행을 기본 JavaScript인 것처럼 트리거할 수 있다.그래서 예를 들어, 그 진술은alert(1)와 같다Function("alert(1)")(). TheFunction다음과 같이 잘 알려진 함수의 생성자 속성에 액세스하여 JSFuck에서 생성자를 검색할 수 있다.[]["filter"](Array.prototype.filter) 또는[]["fill"](Array.prototype.fill최신 브라우저에서 입니다.그리고 나서alert(1)된다[]["fill"]["constructor"]("alert(1)")().

문자표

JSFuck 확장명이 가장 짧은 문자는 아래에 나열되어 있다.다른 문자도 표현할 수 있지만 상당히 긴 코드를 생성할 것이다.

캐릭터. JS푸크
+ (+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[!+[]+!+[]]
. (+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]
0 +[]
1 +!![]
또는+!+[]
2 !![]+!![]
또는!+[]+!+[]
3 !![]+!![]+!![]
또는!+[]+!+[]+!+[]
4 !![]+!![]+!![]+!![]
또는!+[]+!+[]+!+[]+!+[]
5 !![]+!![]+!![]+!![]+!![]
또는!+[]+!+[]+!+[]+!+[]+!+[]
6 !![]+!![]+!![]+!![]+!![]+!![]
또는!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
7 !![]+!![]+!![]+!![]+!![]+!![]+!![]
또는!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
8 !![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]
또는!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
9 !![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]
또는!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
a (![]+[])[+!+[]]
d ([][[]]+[])[!+[]+!+[]]
e (!![]+[])[!+[]+!+[]+!+[]]
f (![]+[])[+[]]
i ([![]]+[][[]])[+!+[]+[+[]]]
I (+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))+[])[+[]]
l (![]+[])[!+[]+!+[]]
N (+[![]]+[])[+[]]
n ([][[]]+[])[+!+[]]
r (!+[]+[])[+!+[]]
s (![]+[])[!+[]+!+[]+!+[]]
t (!+[]+[])[+[]]
u ([][[]]+[])[+[]]
y (+[![]]+[+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))])[+!+[]+[+[]]]

보안

JSFuck과 같은 난독화 기법은 "실제" 자바스크립트의 뚜렷한 특징이 없기 때문에 악의적인 자바스크립트 코드가 침입 방지[15] 시스템이나 콘텐츠 필터를 우회하는 데 도움을 줄 수 있다.예를 들어, 한편으로는 JSFuck에 영숫자가 없고, 다른 한편으로는 결함이 있는 내용 필터가 없어서, 판매자들은 그들의 eBay 경매 페이지에 임의의 JSFuck 스크립트를 삽입할 수 있었다.[16]

참조

  1. ^ 제인 베일리/ 데일리 WTF : "보안 입찰"http://thedailywtf.com/articles/bidding-on-security
  2. ^ Hasegawa, Yosuke (2009-07-10). "jjencode - Encode any JavaScript program using only symbols". utf-8.jp. Archived from the original on 2009-07-15. Retrieved 2017-10-25.
  3. ^ Hasegawa, Yosuke (July 2009). "UTF-8.jp [2009-07-28]". utf-8.jp. Archived from the original on 2009-07-28. Retrieved 2017-10-25.
  4. ^ "Yet Another Useless Contest (but fun!) Less chars needed to run arbitrary JS code". sla.ckers.org. 2010-01-14. Archived from the original on 2011-03-01. Retrieved 2017-10-25.
  5. ^ "js-noalnum_com.php". discogscounter.getfreehosting.co.uk. Archived from the original on 2010-03-01. Retrieved 2017-10-25.
  6. ^ Aiko, Kenji (November 2010). "JSF*ck - []()!+". utf-8.jp. Archived from the original on 2010-12-01. Retrieved 2017-10-25.
  7. ^ Hasegawa, Yosuke (November 2010). "UTF-8.jp [2010-11-30]". utf-8.jp. Archived from the original on 2010-11-30. Retrieved 2017-10-25.
  8. ^ Kleppe, Martin (2012-07-16). "Commits · aemkei/jsfuck". github.com. Retrieved 2017-10-25.
  9. ^ Kleppe, Martin (September 2012). "Site report for www.jsfuck.com". toolbar.netcraft.com. Retrieved 2017-10-25.
  10. ^ https://arstechnica.com/security/2016/02/ebay-has-no-plans-to-fix-severe-bug-that-allows-malware-distribution/ Ars Technica: Ebay는 악성코드를 배포할 수 있는 심각한 버그를 고칠 계획이 없다.
  11. ^ https://github.com/fasttime/jquery-screwed jQuery JavaScript 라이브러리: ! ( ) + [ ]의 6개 문자로만 구성됨
  12. ^ "JScrewIt". JScrewIt. Retrieved 13 June 2021.
  13. ^ http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html "Brainbuck 주의: 자바스크립트가 당신을 쫓는다!"
  14. ^ 적응 대상: https://esolangs.org/wiki/JSFuck
  15. ^ 마티아스 A. 레 메디나(2012-09)영숫자가 아닌 XSS를 사용하여 WAF 바이패스http://blog.infobytesec.com/2012/09/bypassing-wafs-with-non-alphanumeric-xss.html에서 검색됨.
  16. ^ Dan Goodin (3 February 2016). "eBay has no plans to fix "severe" bug that allows malware distribution [Updated]". Ars Technica.

외부 링크