[TryHackMe] Cross-site Scripting - 2

코준·2025년 6월 10일

TryHackMe

목록 보기
15/32

페이로드는 다른 사용자의 브라우저에서 실행하거나 웹 사이트의 취약점을 증명하기 위한 방법 Proof of Concept(PoC)로 실행하는 JS 코드이다.

JS 코드를 타겟 웹 사이트에서 실행할 수 있음을 증명하기 위해서 JS alert를 띄우는 것부터 세션에서 정보를 추출해내는 것까지 다양하다.

JS 페이로드가 타겟 웹 사이트 코드에 어떻게 반영되는지에 따라서 사용할 페이로드는 바뀐다.
각 시나리오를 담은 레벨에서 <script>alert('THM');</script>같은 THM 문자열을 JS alert로 띄우는 함수를 실행하도록 한다.

Level 1

이름을 입력하도록 하고 있다. 위에서 예시로 든 코드를 입력에 넣어보자.

이름이 코드에 반영되는데 스크립트를 넣었더니 코드가 실행된 것이다.

Level 2

이름이 input 태그에 반사돼서 나타나고 있다.
script 태그를 넣으면 input 태그 내의 값으로 들어가기 때문에 ">를 추가해 input 태그를 닫아버리자.

반사되는 칸에 value가 없기 때문에 비어있지만 alert와 함께 다음 레벨로 넘어갈 수 있게 됐다.

Level 3

이번엔 textarea라는 태그를 통해 이름을 나타내는데, 마찬가지로 태그를 닫아보자.

</textarea>를 앞에 삽입해서 태그를 닫아버릴 수 있다.

이번에는 span이라는 태그를 통해 name을 반사하는데, text라고 적었는데 name클래스를 반환했다. 그렇다면 name 클래스를 저장하는 무엇인가가 있다는 소리다.

물론 document의 형태로 name을 저장하고 있다.
여기서는 기존 JS 코드를 이스케이프 처리할 필요가 있다. name에 저장될 스트링에 ';alert('THM');//'을 입력한다면
앞선 ';는 이름을 지정해 필드를 닫고 명령을 끝낸다.
그리고 alert를 띄운 다음 //를 통해서 이후 내용을 코드가 아닌 주석으로 처리할 수 있겠다.

span 태그에는 name으로 빈 문자열이 나오고 잘 저장된 것을 볼 수 있다.

Level 5

이름이 아무런 태그도 없이 그냥 달려있어서 Level 1과 같아보인다.

하지만 <script>alert('THM');</script>의 script 태그가 나타나지 않는다.
개발자가 입력에 script 태그가 들어가는 것은 위험하다고 판단했는지 필터를 걸어놓은 모양이다.

하지만 <script>라는 태그를 금지한게 아니라 문자열만을 금지한 것으로 보아 script문자열만 나타낼 수 있다면 정상적인 페이로드로 필터를 우회할 수 있을 것 같다.

그저 입력하는 페이로드의 태그를 <sscriptcript>로 달면 된다. 그러면 <s (script) cript> 에서 script 문자열만 필터링되고 남은 s .. cript가 합쳐져 태그를 완성할 수 있게 된다.

Level 6

갑자기 이미지 경로를 입력하라고 하고 img 태그로 이미지를 반사했다. img 태그를 닫기 위해서 "><script>alert('THM');</script>를 삽입해보자.

이번에는 <> 문자가 필터링됐다. 그렇다면 img 태그 안에서 해당 태그를 이스케이프하고 script태그 없이 alert를 띄울 수 있는 방법을 찾아야 한다.

onload 속성은 html의 로딩이 끝나고 마지막에 나타나는 이벤트이다.
화면에 올라오는 모든 요소가 웹 브라우저 메모리에 올라오고나서 마지막에 실행되는 속성이다.

때문에 이미지를 띄우고 onload 속성을 통해 alert를 띄울 수 있다.

/images/cat.jpg" onload"=alert('THM'); 입력으로 alert를 띄울 수 있었다 !
-> ("")를 정확히 입력하는 순간 velog의 파서는 img 태그의 onload 속성을 지우고 아래에 존재하는 url을 src값으로 인식하고 끼워맞추는 것 같다..)

Polyglot

XSS Polyglot은 blind XSS에서 여러번의 리퀘스트를 보내 추측해야할 경우에 많은 경우의 수를 한 번에 해결해주는 공격 구문을 말한다.

OWASP 홈페이지에 나온 Polyglot 코드는 다음과 같다.

입력이 JS 코드에 들어가느냐, HTML 태그에 들어가느냐, context로 들어가느냐에 따라서 구문이 달라지지만, 위 구문은 모든 경우에 사용 가능하다는 것이다.

실제로 앞선 예제에서는
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */onerror=alert('THM') )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert('THM')//>\x3e
를 입력한다면 모두 통과할 수 있었을 것이다.

profile
Hi !

0개의 댓글