9주차 CTF
XSS 1
![]() |
![]() |
해당 실습 페이지에 접속하여 XSS 취약점 여부와 전체적인 구조를 확인해 보겠습니다.
게시판으로 이동해 글을 작성한 뒤, 홈으로 나와 작성한 게시글이 표시되는지 확인했습니다.
Burp Suite를 통해 요청과 응답을 분석해 보니
닉네임과 제목이 HTML로 출력되는 것을 확인했습니다. 이를 통해 특수문자를 입력해 Stored XSS가 가능한지 테스트하겠습니다.
특수문자를 입력한 결과, 초록색 박스에서 특수문자 출력값이 인코딩 처리되어 꺾쇠(<, >)를 사용할 수 없게 되어 있음을 확인했습니다.
그렇다면, 해당 게시글을 클릭하여 자세히 살펴보겠습니다.
게시글을 클릭하니 제목 부분에서는 특수문자가 제대로 출력되지만, 내용 부분에서는 여전히 인코딩 처리가 되어 있음을 확인했습니다.
이번에는 제목에 스크립트를 삽입해 보았습니다.
![]() |
![]() |
제목을 hype <script> alert(1)</script>로 적어주고 게시글을 클릭한 결과, 스크립트가 실행되며 알림 창이 표시되는 것을 확인했습니다.
XSS 2
이전 문제와 유사한 방법으로 접근해 보겠습니다.
이번에는 입력된 데이터 값이 모두 인코딩 처리되어 있어 XSS가 차단된 것을 확인했습니다. 이 부분은 추가적인 공격이 불가능합니다
다른 취약점을 찾아보기 위해 검색창에 실수로 a를 입력하고 검색하니 오류 스크립트가 출력되는 것을 확인했습니다.
Burp Suite를 통해 요청을 분석하니
alert로 출력되는 것으로 보이며 예상문법은
board_result=<script> alert('___')</script>;라고 예상이 갑니다 sql처럼 해당 스크립트를 조작해 보도록 하겠습니다
1'); // 입력을 해주면 다음과 같이 나오는 것을 확인할 수 있습니다
![]() |
![]() |
alert(1)이 출력되는 것을 확인할 수 있습니다 해당 값을 URL로 만들면
버프스위트에서 자체적으로 메서드를 바꿀 수 있는 기능이 있습니다 이 기능을 이용하여 url을 만들어 보면
http://ctf.segfaulthub.com:4343/xss_2/notice_list.php?option_val=title&board_result=1');//&board_search=%f0% 9f%94% 8d&
다음과 같이 만들어지는 것을 볼 수 있습니다
XSS 3
이전 문제와 동일한 루트를 시도했지만
이번에는 문단을 닫는 방식이 차단된 것을 확인했습니다.
다시 돌아와 마이페이지로 이동해 보겠습니다.
마이페이지에서 아이디 값을 변경해 보니
아이디 값이 실제로 바뀌는 것을 확인했습니다. 특수문자를 입력해 테스트를 진행해 보았습니다.
![]() |
![]() |
앞 열은 문자로 인식이 됐으며 뒤에는 아직 처리되지 않은 문법이 남아 있는 현상이 나타납니다 특수문자를 테스트하는 과정에서 [ "> ] 해당 문법이 input을 받아 버려서 뒤에 [ "/> ]가 화면에 남아 있는 것으로 보이네요 그렇다면 input을 먼저 닫아버리고 스크립트를 넣어보도록 하겠습니다
문자열이 닫아지고 특수문자가 출력되는 것을 확인할 수 있습니다 이제 스크립트를 넣어주고 URL을 뽑아보도록 합시다
![]() |
![]() |
Reflected XSS의 취약점을 발견할 수 있었습니다 해당 코드로 다음과 가은 URL을 만들 수 있게 됩니다
http://ctf.segfaulthub.com:4343/xss_3/mypage.php?user=hype"><script> alert(1)</script> HTTP/1.1
XSS 4
이전 문제와 동일한 방법으로 접근해 보았습니다
네 역시 닫혀 있는 것을 볼 수 있습니다
이곳저곳을 뒤적이다가
게시글 창에서 특정 특수문자 조합이 동작하는 것을 발견했습니다
<script> alert(1)</script>를 입력해 주도록 합시다
![]() |
![]() |
제목과 내용에 똑같이 <script> alert(1)</script> 입력해 주었지만
<>(1)</> 이렇게 딸랑 특수문자랑 숫자만 남아있는 것을 확인할 수 있었습니다 음...... 문자열을 자체 필터링을 하고 있는 걸까요?... 혹시나 몰라서
![]() |
![]() |
<asdASD123> asdASD123 <asdASD123>를 입력해 주니 브라우저에서는 괄호 안에 값이 사라졌지만 버프스위트의 리스폰값에는 발현된 것을 확인할 수 있습니다 이것은 문법의 오류로 브라우저에서는 출력이 안된 것으로 판단됩니다 그렇다면 이번에는 <scRIPt> alert(1)</scRIPt>로 작성하고 실행해 보도록 하겠습니다
이제는 alert가 출력이 되는 것으로 판단되고 필터링에 걸러졌을 것으로 판단됩니다 그러면
그래서 prompt로 다시 입력해서 팝업창을 띄워보도록 하겠습니다
prompt가 적용되어 스크립트가 잘 실행된 것으로 볼 수 있습니다
XSS 5
이전 문제 처럼 같은 루트로 찾아봐도 문제가 없어 다른 곳을 찾아보기로 했습니다 글을 쓰는 페이지 "notice_write.php"에 뭔가 이상한 함수가 추가된 것을 확인할 수 있습니다 Comparer를 활용하여 이전 문제 XSS4의 notice_write.php와 대조하여 어떤 코드가 바뀐 지 명확하게 확인해보도록 하겠습니다
function checkContent(data) {
data = data.replace(/\</g, "<");
data = data.replace(/\>/g, ">");
writeFrhttp://m.create_body.value = data;
return true;
}
해당 함수가 새롭게 추가된 것을 볼 수 있습니다 [create_body]의 특수문자들을 치환해시 켜주는 역할인 것으로 보이며 해당값이 어떤 값인지 확인해보죠
[create_title] 값에 "haha"가 들어가야 하는데 [create_body]에 제목으로 "haha"가 들어가는 것을 볼 수 있습니다 왜 그렇게 유추를 했냐면 밑에 내용칸에 "haha"가 따로 표기되어 있기 때문에 그렇게 판단했습니다
나아가 아까 저희가 발견한 함수에 [create_body] 부분만 특수문자가 치환된다고 했던 거 기억하시나요? 그것을 바탕으로 create_body 부분에는 스크립트가 안될 것으로 보입니다 한번 확인해보도록 합시다
[create_body] 부분에 "<script> alert(1)</script>"가 잘 표기 돼 있어도 서버에 들어갈 때는 아래처럼 "<script>alert(1)</script>" 이런 값을 치환돼서 저장돼 있을 가능성이 매우 높으며 아래는 클라이언트 측 자바에서
치환했을 가능성이 있기에 밑에 데이터를 intercept로 한번 조작해 보도록 하겠습니다
![]() |
![]() |
"<script>alert(1)</script>" ➡ "<script> alert(1)</script>" 바꿔주고 forward를 눌러줍니다 그리고 해당 게시글을 다시 들어가면'
스크립트가 서버에 저장되고 또 실행도 가능한 것을 확인할 수 있습니다