[Web_Hacking] Reflected XSS-3

Song·2024년 8월 31일

XSS

목록 보기
4/12

Lab: Reflected XSS into a JavaScript string with angle brackets HTML encoded

이번 LAB에서는 입력 값을 HTML 코드에 작성하는 것이 아닌, JS 코드(<script>내부)에 작성할 때 이를 공격하는 방법을 배웁니다.

문제

꺽쇠 기호(<,>)가 HTML로 인코딩 되고, 사용자가 입력한 문자가 그대로 JS 문자열에 입력된다. 이 LAB을 해결하려면 JS 문자열에서 XSS 취약점을 찾아내고 alert() 함수를 호출하라.


정보 탐색

이번 LAB에도 Blog 검색 기능이 존재합니다.

<script>alert('test');</script> 를 입력해도 아무런 변화가 없습니다.

소스코드를 확인해봤을 때 HTML 인코딩이 잘 수행되어있고 검색창의 value 속성이 삭제되어 있습니다.

그런데 밑에를 보니 이전에 없던 <script></script> 태그가 존재합니다. 그 안에 searchTerms라는 변수에 입력한 값이 저장되어 있고, document.write() 함수와 encodeURIcomponent() 함수로 입력한 값을 인코딩해 <img> 태그의 값으로 넣어 페이지에 삽입하고 있습니다.

document.write()는 입력값을 인코딩하기 때문에 타겟이 되긴 어렵고 변수 값인 searchTerms를 공격해보겠습니다.


공격

양쪽을 따옴표(')로 감싸고 있기 때문에 따옴표를 하나 더 붙여 문자열을 닫아주고 +연산자로 alert() 함수를 연결해 입력해보겠습니다.

JS에서는 ++ 연산자, 템플릿 리터럴(${})을 사용해 문자열과 변수, 함수를 연결할 수 있습니다.

성공적으로 alert() 함수가 호출되었습니다.

코드를 확인해보면 searchTerms라는 변수는 어떠한 보안 대책도 적용되어있지 않기 때문에 alert() 함수가 문자열이 아닌 함수 자체로 해석되는 걸 볼 수 있습니다.

해결 완료.

profile
안녕하세요

0개의 댓글