골때리는 자바스크립트의 세계 6탄

흠. 오랜만에 6탄이 왔군요.

요즘들어서 실무들어 보안에 대한 관심도 높아진 가운데.

오늘 시간에는 그런 부분을 좀 다루고자 합니다.

오늘은 생각할게 많아서 그런지 왜이리 생각할게 많아지는지 모르겠군요.

자바스트립트의 단점부터 알아봅시다.

자바스크립트에서 가장 눈에 띄는 단점이 뭐라고 생각하십니까?

인터프리터 언어?

어디서 굴러떨어진 객체지향?

가장 두드러지는 단점은 아무래도 “소스가 공개되어 있다”는 것이죠.

원하지 않는 정보를 클라이언트상에서 가공하려고 해도 소스 분석 하면은

어떤 데이터를 가공하는지 뽀록나는데.. 막상 하자니..

그러니 서버 언어로 눈을 돌리게 되는거죠.

또한, 자신이 고생해서 만든 자바스크립트를 어떤 이가 훔쳐서 자기 것인양 사용하는 행위.

이거 참 골치가 이만저만이 아닙니다.

그렇다고 저작권을 명시하자니, 누가 배껴서 패킹질하고 지꺼라구 우기면 이거 답도 안나오고..

AJAX에서 가장 두드러진 점은 바로 보안이라는 것이죠.

왜냐하면은 클라이언트에서 정보를 주고받는데. 허점이 드러나 서버 언어를 간파하면 어떡하나 이런 고민들 에젝스 만지는 분들이라면 한번씩 고민해봤을 문제입니다.

거기다가 사용자 아디와 비번을 요구하는 경우에도 이거 그대로 드러나니 이거 참..

이런 고민을 해결하기 위해 dean edwards가 만든 Javascript Packer가 있습니다.

http://dean.edwards.name/packer/

네.. 물론 자바스크립트 압축을 하지만 base62를 통해 당최 뭔소린지 난해한 코드로 패키지화를 시키는 것이죠. 다들 한번씩을 써봤을 겁니다.

이렇게 해서 자신이 만든 스크립트를 좀 알아보기 어렵게 해서 자신의 지적 재산을 지키는 거. 별로 어렵지 않게 되기는 개뿔 어느새 언팩하는 툴도 나왔습니다.

http://jsbeautifier.org/

이녀석은 개행문자와 쓸데없는 스페이스 등등을 제거해서 최적화했지만 보기 난해한 자바스크립트를 보기 쉽게 바꿔주는 역할을 합니다.

하지만 여기서 이녀석은 unpack 기능까지 추가해서 패킹한 자바스크립트가 보안에 좋다고 생각한 로망을 깨버리고 말았습니다. 원망스럽죠?

ㅋㅋ 나온지 좀 된녀석이라 이미 원망은 개뿔이라고 말하는 분도 있겠죠.

아무래도 자바스크립트를 난독화해서 자신의 재산을 지키고 싶은 갈망은 있겠죠.

그래서 자바스크립트를 난독화해서 알아보기 조낸 어렵게 만드는 툴이 생겼죠.

http://javascript-source.com/

http://www.jasob.com/

근데 니네들 상용툴이야 아오……………………………………………

네.. 금전적으로도 이거 참 다가가기 힘든 난독화 툴.

근데 효과는 있다고 하는군요. 저걸 이용한 자바스크립트 도구 중에 이게 있으니까요.

http://www.amplesdk.com/

소스를 들여다보면 패킹질한것처럼 보이지만 한번 풀어보세요 풀리는지.ㅋ

어쨌든, 이렇게 지적 재산권을 지키기 위한 자바스크립트의 몸부림.

하지만 개인적인 재산을 보호하기엔 한계가 있겠죠?

하지만 걱정하지 마세요. 무료로 자바스크립트를 난해하게 만드는 툴은 다음과 같습니다.

YUI Compressor(http://developer.yahoo.com/yui/compressor/)

Dojo ShrinkSafe(http://dojotoolkit.org/docs/shrinksafe)

Open Source Javascript Obfuscator(http://www.usefulsnippets.com/open-source-javascript-obfuscator.html)

셋 다 자바를 사용합니다. 위에 2개는 최적화도 시켜주지만 난독화도 시켜주기 때문에 포함을 시킨거죠. 세번째껀 말 그대로 난독화 기능을 수행하는 도구입니다.

네. 맞습니다. 난독화한다고 해서 아주 징글징글한 해커라면 뚫릴 수도 있겠죠. 세상에 완벽하게 가릴 수 없는 방법은 없습니다. 커텐에 누군지 알 수 없는데 불을 키고 나니 여자라는 것을 알 수 있는 것처럼 말이죠.

마지막으로, 자바스크립트를 난독화하는 테크닉으로 끝을 맺겠습니다.

1. 객체를 동적으로 부여

객체를 정적으로 window.onload 이런 식으로 정의 및 선언도 할수 있겠지만,

window[“onload”] 이런 식으로도 정의 및 선언도 가능합니다.

이 방식을 이용해 이런 식으로 난해하게 만들 수 있습니다.

var aeg2=”sty”;

var wgbe32=”le”;

var aegw3=”back”;

var asgage=”ground”;

element[aeg2*wgbe32][aegw3+asgage]=”black”;

즉, 엘리먼트 스타일 중 배경을 색으로 까맣게 만드는 건데,

이런 식으로 뭔소린지 난해하겠끔 만들 수 있습니다.

2. 괄호 십쇼키.

괄호를 사용한 훼이크를 통해서도 만들 수 있습니다.

var a=(“ㄱ”,”ㄴ”);

이렇게 쉼표로 구분해서 만들 수 있습니다. 거짓말같으면 한번 실행해보세요.

결과는 어떻게 나올까요? 네. “ㄴ”이 나오겠죠?

당최 무슨 식이라고 하기도 난해한데 저렇게 쉼표로 구분한 식을 나와봐야 결국 출력되는건 마지막에 지정된 값 뿐입니다.

이걸 응용해서 이렇게도 만들 수 있습니다.

var where=(odi=”school”,”php”+odi);

그럼 where는 phpschool 이라는 엏헣헣한 결과가 나옵니다.

3. 삼항 연산자의 훼이크다 병맛들아!

삼항 연산자. 이거 그냥 보면 뭐가몬지 좀 힘들겁니다.

var a=b?”a”:”b”;

이걸 이용해서도 훼이크를 만들 수 있겠죠.

var where=((12e9>4e8)?”php”:”asp”+”server”)+”school”;

물론 결과는 phpschool 이 나옵니다.

이걸 응용하면 좀 더 난해한 스크립트를 만드는 기술이 나오겠죠?

그걸 활용해 리팩토리한다음에 여러 언어를 통해 템플릿 만들어서 만들어도 되고…

이렇게 잘만 하면 사용자가 절대적으로 뚫지 않는다는 보장은 없지만

난해하게 만든 코드를 풀다가 중도 포기할 수도 있다는 거죠. 심리전입니다.

정말 힘들긴 하지만, 여러분이 프로그램으로 먹고살고자 한다면,

아무래도 이런 과정도 거쳐야 할 부분이 아닐까 싶습니다.

세상에 그 어떤 것도 뚫는 창도 없고, 세상 어떤 것도 막는 방패는 없지만,

점점 강해지면 뒤따라 점점 강해지듯이 이런 세상에서 우리는 살고있죠?

이렇게 되면 골때려서 돌아가실 것 같은 약속은 한 셈이 되겠습니다. 응?

아차, 그리고 웹딜 PHP 보안 만드신 분께 죄송한데 말씀드려야겠습니다.

클라이언트쪽에서 PHP 암호화 복호화 하려고 만드신 자바스크립트 있죠?

제가 뚫어보니 그냥 뚫리더군요. 좀 더 견고한 난독화가 필요하겠습니다.

링크 #1은 자바스크립트 난독화 기법이 소개된 글이고,

링크 #2는 무료로 즉석에서 자바스크립트를 난독화해주는 툴입니다.

License : 해당 링크에 대한 라이센스에 따릅니다.

composite / 2010년 12월 13일 / 미분류

답글 남기기

Your email address will not be published / Required fields are marked *