Reflected XSS : LAB [3]
DATE : 2024/1/3
❗Reflected XSS into a JavaScript string with angle brackets HTML encoded

이번 LAB은 Reflected XSS : LAB [2]와 마찬가지로 ANGLE BRACKET이 필터링 되고 있기 때문에
직접적으로 <script> tag를 삽입하는 건 불가능하다.
따라서 스크립트를 삽입할 만한 다른 포인트를 찾아내야 한다..!

LAB에서 제공하는 검색 기능을 활용해보니, 검색 내용과 부합하는 블로그가 없는 경우
출력 되는 문구 형태는 동일하다는 걸 알 수 있다.

Packet으로 그 내용을 확인해보면 사용자가 입력한 값을 그대로 가져다가
문구로 사용하고 있음을 볼 수 있는데
이때 주목할 부분은 여기가 아니다..!

Packet을 주르륵 읽다 보면 중간에 <script> tag로 작성된 내용이 나오는데
코드를 분석해보면 사용자가 입력한 search parameter를 가져다 변수로 선언한 뒤
var searchTerms = 'hanhxx';
document.write(
'<img src="/resources/images/tracker.gif?searchTerms='+
encodeURIComponent(earchTerms)+'">');
그 변수를 source로 취하는 <img> tag를 만드는 내용이다.
이때 사용자가 입력한 값이 들어가는 첫 번째 포인트는 변수 searchTerms로
var searchTerms = '___';
검색 내용이 빈칸에 그대-로 들어가는 듯했다.
사용자가 입력한 값이 parameter로 전달되고 parameter 값이 응답 페이지에서 사용된다??
누가 봐도 Reflected XSS 조건을 만족한다.
공격 포인트를 찾았으니 위치에 알맞은 스크립트를 작성해보도록 하자.
/?search=hanhxx'; alert(1);
> var searchTerms = 'hanhxx'; alert(1);'
검색 내용이 따옴표 사이로 들어가긴 하지만 상관없다!
삽입할 스크립트에 따옴표를 넣어 마감하면 간단히 해결된다.
이렇게 스크립트를 넣게 되면 searchTerms 변수를 선언 & 할당하고 나서
alert(1)를 실행하는 흐름의 코드가 완성된다.

브라우저로 돌아와 준비한 스크립트를 삽입하고 Packet을 확인해보면

의도했던 대로 alert() 함수가 잘 삽입된 걸 볼 수 있다.

저번 LAB은 이미 갖추어져 있던 태그를 이용해 속성을 추가함으로써 스크립트를 실행했다면
이번 LAB은 이미 작성되어 있는 <script> tag로 사용자의 parameter가 들어가면서
태그를 삽입할 수고 없이 문제를 해결할 수 있었다. 👍
Last updated