"이 내용은 절대로 악의적인 목적으로 사용돼서는 안됩니다. 발생되는 모든 책임은 자신에게 있습니다."
지난 시간에 배운 XSS 개념을 가지고 XSS GAME 사이트에 문제를 풀어봅시다
[ ↓ XSS GAME 사이트 ↓ ]
해당 사이트에 접속하면 XSS Game 사이트에 온 걸 환영한다는 문구가 표시됩니다 [Let me at 'em!] 버튼을 눌러 게임을 진행해 봅시다
✅ Level 1 : Hello, world of XSS
Level 1 단계는 해당 웹 페이지에 alert이라는 자바스크립트를 주입하라고 합니다
웹 페이지에 기능을 살펴보면 현재 FourOrFour 로고 밑에 검색 정보를 입력하고 Search 버튼을 누르면 데이터를 전송해 주는 기능입니다 여기서 alert 스크립트르 넣고 Search 버튼을 눌러 스크립트를 작동시켜 봅시다
자바스크립트는 <script>대입할 내용</script>으로 주입시킬 수 있습니다
이제 Search 버튼을 눌러봅시다
성공적으로 alert 스크립트가 작동된 걸 알 수 있습니다 이제 다음 레벨로 넘어갈 수 있습니다
✅ Level 2 : Persistence is key
Level 2는 게시물에 alert 스크립트를 주입시켜야 합니다
하지만 alert 스크립트를 주입시켜도 해당 페이지에 alert이 작동되지 않는 걸 알 수 있습니다
Level 1과 다른 방법으로 접근해야 할 필요성이 있습니다
페이지 하단 힌트를 참고해 보면 img 태그를 이용하라고 알려줍니다 img 태그에서 해당 이미지를 불러올 수 없는 경우 onerror 부분을 이용하여 대체 이미지를 불러올 수 있는데 이 기능을 사용해서 alert을 작동시켜 봅시다
이런 식으로 "없는이미지경로"의 이미지 경로가 없다면 onerror 부분이 작동되게 됩니다
Share status! 버튼을 누르니 정상적으로 작동됩니다 다음 레벨로 넘어갑시다
✅ Level 3 : That sinking feeling...
Level 3 문제도 alert 스크립트를 작동시키면 됩니다 하지만 현재 페이로드를 입력할 수 없어 아래 URL 표시줄에 주소를 수동으로 편집해야 한다고 합니다
페이로드 : 사용에 있어서 전송되는 순수한 데이터 ( 보내고자 하는 데이터 자체를 뜻함 )
아래 URL에서 1~3번까지는 Image 1~3으로 표시되는 걸 알 수 있습니다
여기서 4를 입력하면 이미지 부분에 이미지 경로가 없다고 표시됩니다 즉 이전 문제와 동일하게 onerror를 이용해서 alert을 작동시키면 됩니다
F12를 눌러 개발자 모드를 키고 1번 영역을 클릭하여 2번 부분을 수정하면 됩니다
수정 후 성공적으로 alert 스크립트가 작동되었습니다
✅ Level 4 : Contxt matters
Level 4 문제는 timer 입력란에 원하는 초를 입력하고 [Create timer] 버튼을 누르면 원하는 초만큼 기다렸다가 alert 창이 나오는 걸 알 수 있습니다 여기에 alert 스크립트를 주입시켜야 다음 레벨로 넘어갈 수 있습니다
우선 힌트를 보니 startTimer 함수를 살펴보라고 합니다 이 함수는 [Create timer] 버튼을 클릭하면 호출되는 함수입니다
타켓 코드에서 startTimer 함수 내부를 보면 timer 입력란을 가져와서 입력값이 없으면 3을 반환합니다 이때 반환한 초만큼 기다렸다가 window.confirm 확인창이 나오게 됩니다 소스 코드만 봤을 때 여기에 alert 스크립트를 주입시킬 방법이 없고, 개발자 모드에서 따로 콘솔 부분에 원하는 스크립트를 만들어서 작동시킬 수는 있지만 실질적으로 사이트에 적용되는 게 아니기 때문에 다른 방법을 찾아봅시다
다른 방법을 찾다가 [Create timer] 버튼도 img 태그처럼 onerror와 비슷한 기능이 있지 않을까 싶어 input 태그와 관련된 속성을 찾아봤습니다
결국 input 태그에서는 onclick 속성을 추가하여 alert 스크립트를 작동시킬 수 있었습니다
다음 레벨로 넘어갑시다
✅ Level 5 : Breaking protocol
Level 5 문제는 Sign up 링크를 클릭하면 이메일 입력란과 Next >> 링크가 보이는데 Next >> 링크를 클릭하면 다시 Sign up 부분으로 넘어가게 됩니다 이 페이지에 동작 방식을 살펴보니 이것도 Level 4 문제와 동일하게 Next >> 링크 내부에 alert 스크립트를 주입시키면 다음 레벨로 넘어갈 수 있어 보입니다
링크 태그도 마찬가지로 onclick 속성을 추가하여 alert 스크립트를 주입시키고 Next >> 링크를 클릭하면 됩니다
다음 레벨로 넘어갑시다
✅ Level 6 : Follow the 🐇
Level 6 문제는 상당히 까다로운 문제입니다 해당 페이지의 동작을 확인하면 URL의 입력된 경로에서 js 파일을 로드시키는 페이지인데 여기에 alert 스크립트를 주입시켜야 합니다
아래 URL 위치에 alert 스크립트를 주입시켜봤는데 전부 인코딩 돼서 스크립트가 작동되지 않는 모습을 알 수 있습니다
다른 방법으로 [Go] 버튼도 이전 레벨과 동일하게 onclick 속성에 alert 스크립트를 주입시켜도 alert 창만 나올 뿐 문제를 해결하지 못했습니다
URL에 이것저것 넣어보다가 .. 기호가 인코딩 되지 않는 것을 알아냈습니다 찾아보니 .,/: 기호도 인코딩 없이 출력되었습니다 즉 Data URL Schema를 이용하여 외부 데이터를 URL로 표현할 수 있습니다
인코딩 : 코드를 암호화하는 것을 말함
data:javascript, alert()은 URL에 작은 파일을 문서 내에 인라인으로 삽입할 수 있게 하는 Data URL Schema입니다
결국 javascript 태그의 alert 기능을 수행할 수 있습니다
사용법 : data:[<mediatype>][;base64],<data>
mediatype : MINE type으로 'image/png'와 같이 작성됩니다
base64 : 데이터를 인코딩하여 출력합니다
여기서 mediatype과 base64는 사용하지 않았습니다
해당 문제는 다른 웹 서버에 악의적인 스크립트를 올려두고 그 스크립트를 불러오는 방식인데 따로 Data URL Schema 기능을 이용하여 웹 서버 없이 외부 데이터를 URL로 표시하여 작동시켰습니다
이렇게 XSS GAME의 모든 문제를 해결했습니다
[ 선수 학습 내용 ]
[ 참고 자료 ]