Web Hacking

[WebHacking] XSS Challenges 문제 풀이 (1번 ~ 8번)

Papya_j 2024. 8. 5. 03:55

https://xss-quiz.int21h.jp/

 

XSS Challenges (by yamagata21) - Stage #1

 

xss-quiz.int21h.jp


[1번]

 

 

 정답

<script> alert(document.domain); </script>

 

 

가볍게 script 구문만 치면 정답이 된다.


[2번]

 

TEST : ><scirpt> alert(document.domain) </script><

 

value라는 값에 들어가는 것을 확인할 수 있다.

따라서 value에 들어가는 값이 search를 통해 작성한 문구인데 이것을 script로 실행시키기 위해서는 현재 실행되고 있는 tag를 닫아야 한다. value = "~~"> 이기 때문에 이에 맞게 작성을 해보면 된다.

<input type="text" name="p1" size="50" value="입력값">

 

 정답

"><script>alert(document.domain)</script><"

위 명령어를 입력하면

<input type="text" name="p1" size="50" value=""> <script>alert(document.domain)</script> <""> 

가 돼서 inject에 성공한다.

성공시에 표시되는 부분

 


[편법]

console창에 대놓고 치면 그냥 통과되긴 한다.


[3번]

Serach랑 더불어 옆에 4개의 country를 선택하는 것까지 늘어났다.

 

Test : "</b><script>alert(document.domain)</script><b>"

<b>에 적혀있는 것을 보고 적절히 escape할 수 있을 것 같아서 짜봤는데 당차게 실패했다.

* <b> </b> -> 글자를 굵게 표기하는 테그

 

Hint : The input in text box is properly escaped.

text box가 excaped 되어있는 상태이다. 이것을 어떻게 확인할 수 있을지 찾아보겠다.

 

좀 더 자세히 살펴보니 value =""라는 입력문을 받는 값이 없다. 각각 search 구문과 country를 p1, p2를 통해서만 받고 있어서 위 화면에서는 나타나지 않는다.

결국 세부적인 분석과 보냈을 때의 응답이 필요하다 생각했고 적절한 tool을 사용하여 찾아보기 위해 "Burp Suite" 라는 프로그램을 사용하였다.

 

Burp Suite 내에서 프록시를 통해 intercept를 한 다음 Repeater를 통해 Request와 Response를 분석해보겠다.

검색어 aaa를 입력했을 때의 Response는 사진의 오른쪽과 같이 나타난다. p1, p2에 해당되는 값들이 오른쪽에서 나타나는 것으로 알 수 있다.

 

Search 검색 창에 <script>alert(document.domain)</script> 을 넣어보았더니 필터링이 된 것을 확인할 수 있다.

&lt;script&gt;alert(document.domain)&lt;/script&gt 로 필터링이 되었기 때문에 공격이 실패한 것을 볼 수 있다.

그럼 우리가 건들여 볼 거는 p1이 아닌 p2일 수도 있겠다는 생각을 할 수 있다.

 

p2의 값을 바꿔서 Request를 해보겠다.

p2에 들어갈 부분에 script문이 잘 들어가서 실행이 되는 것을 확인할 수 있었다!

 

Proxy에서 p2에 해당 값을 집어넣고 실행시켰다.

 

정상적으로 됨을 알 수 있었다!

 

✨ 정답

<script>alert(document.domain)</script> #p2에 넣기

 

* Proxy 도구로 Request를 변조하여 XSS 공격하는 것이 포인트

 


[4번]

 

3번과 유사한 것 처럼 보이는데 역시 분석을 해봐야 될 것 같다.

 

이번에 사용할 도구는 Fiddler 라는 도구이다. (Burp Suite로 해봤는데 자꾸 repeater에서 Send를 눌렀을 시에 초기화 되고 아무 정보도 안뜨는 현상이 자주 일어남)

 

<fiddler 사용법>

https://devscb.tistory.com/114

 

fiddler(피들러) 사용법, fiddler classic 사용법, 친절한 fiddler 사용법, fiddler 기본 사용법, fiddler https나

피들러는 네트워크 유틸 프로그램으로, 설치된 사용자의 pc에서 패킷을 확인하고 디버깅을 도우는데 쓰이는 프로그램입니다. 피들러를 다운로드하려면 메일주소를 입력해야합니다. 하지만, 아

devscb.tistory.com

 

입력칸에 script XSS를 공격해봤을 시에 역시 필터링 되어서 들어가는 것을 볼 수 있다. 여기서 숨겨진 것을 발견했는데 p3라는 새로운 입력칸이 보였고, 숨겨진 입력 필드에 심지어 hackme라고 친절하게 나와있다. 저기에 script 구문을 넣어보겠다.

 

실패했다. 그 이유를 보기 위해 자세히 분석해보겠다. 

 

자세히 살펴보니 input filed에 hidden이라는 p3 부분에 value가 이전 2번문제처럼 특정한 형식으로 지정되어 있는 것을 확인할 수 있다. 이러니 그냥 script 구문을 넣어도 공격이 안되었던 것이다.

 

✨ 정답

"><script>alert(document.domain)</script><"  #p3에 넣기

 

정상적으로 출력이 된다. 

+ 패킷 조작하는 방법은 다음 링크를 참고할 것

https://s00m.tistory.com/1

 

[Fiddler] 피들러 패킷 변조 방법

피들러를 이용하여 HTTP 패킷을 변경하는 경우가 있다. 이때 가장 먼저! 해야 하는 것이 있다. 바로 브레이크포인트(Breakpoints) 설정하기 피들러를 많이 사용해보지 않아서 브레이크포인트를 설정

s00m.tistory.com

 


[5번]

5단계이다.

 

역시 input을 아무거나 넣고 f12로 분석해보겠다.

input 부분에서 새로운게 추가 되었다. 바로 maxlength 가 15라는 것.

15를 넘긴 후 그 뒤에는 어떻게 되는지 테스트 해보기로 했다. 그랬더니 그냥 15글자 이상은 안써진다.

 

proxy도구를 똑같이 사용해보겠다.

 

p1의 request에 길이 무시하고 집어 넣었더니 성공했다.

 

* 이거 그냥 사기친거라고 생각이 들었다. maxlength를 이용을 전혀 안하고 무시했다고 생각해서 다른 방법으로 풀어보겠다.

 

maxlength가 15밖에 안돼서 공격구문을 다 못 집어넣는다. 따라서 길이를 조절해보겠다.

 

충분히 들어갈 만큼의 길이로 설정한다.

 

이후 바로 search 창에 script 구문을 입력하면 정상적으로 입력이 되고 클리어 메세지가 뜬다.

 


[6번]

6단계로 왔다.

 

똑같이 script 공격 구문을 넣어봤는데 필터링이 되기 때문에 공격에 실패한 모습을 볼 수 있다.

 

공격 Hint를 보니 event handler attributes라고 나와있다.

Event Handler

 

어떠한 이벤트가 발생했을 때 실행되는 함수

다양한 event handler가 있는데 정보를 보니 < > 와 같은 것들이 필터링되었기 때문에 이걸 안쓰는 공격들로 우회해야 할 것 같다는 생각이 들었다.

 

✨ 정답

" onfocus="alert(document.domain)"

onfocus라는 명령어는 input필드 내에서 input 필드 자체를 클릭하면 alert 구문을 실행하게 하는 command이다.

 

이를 넣고 실행한 후, 검색하는 부분을 클릭만 하게 되면 성공이다.

+ 여기서 확인을 계속 누르면 다음걸로 안넘어가게 된다. esc와 다른 곳 클릭을 하면서 input 필드에 대한 포커스를 취소시켜야 된다. 

 

* XSS 참고용 사이트 (다양한 공격이 있다. 이번 경우는 input에 관련된 것)

https://gist.github.com/kurobeats/9a613c9ab68914312cbb415134795b45

 

XSS Vectors Cheat Sheet

XSS Vectors Cheat Sheet. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 


[7번]

 

7번문제에 그냥 공격 구문을 넣어보았다. 

그냥 value 내부에 들어가 있는 값을 그 값 자체로 인식해버리는 사이트였다.

Hint도 도움이 안되었다.

 

Proxy 도구로 인식해보니

다음과 같이 입력했던 구문이 필터링 되는 것을 볼 수 있었다.

< > 와 더불어 " 까지 필터링을 하는 것을 확인할 수 있었다. 이런 경우는 다른 우회 공격 구문을 써야 했다.

(앞서 썼던 onfocus의 경우 " 를 사용하기 때문)

 

검색해보니 " 를 / 로 대체하면 된다고 한다.

 

✨ 정답

/ onfocus=alert(document.domain)

/ 뒤에 띄어쓰기 필수!!

-> / 뒤에 있는 것들이 그 자체로 명령어로 인식되는 상황이다.

실제로 분석해본 결과 / 가 value 값에 들어가 있는 것을 확인할 수 있다. (다른 문자도 다 가능함. 띄어쓰기를 하게 되면 value를 하나로 인식하지 않는 듯)

 


[8번]

 

조금 다른 형태가 나왔다. URL을 입력하라고 한다.

실제로 입력한 것이 URL로 밑에 생성이 되고, 이걸 클릭하면 사이트로 이어진다.(다만 aaa가 정답은 아니라서 404 Not Found)

 

분석해본 결과 새로운 Type의 "href" 라는게 보인다. 이게 실제로 입력한 값을 도메인으로 연결시켜주는 역할인 것 같다.

 

Hint를 보니 javascript 구문을 쓰라고 한다.

javascript 구문이란?

 

href="javascript:~~~" 가 있다면 이는 실제로 javascript 뒤에 있는 구문을 실행하는 역할을 한다.

 

✨ 정답

javascript:alert(document.domain)

 

입력해보면 정답이 뜨는 것을 확인할 수 있다.

 


오늘은 이렇게 1번부터 8번까지 XSS에 기초가 되는 개념들과 문제들을 공부해보면서 풀어보았다.

중간중간 어려웠던 부분은 참고를 하기도 하고 검색도 많이 해서 도움이 많이 되었다. 

 

참고

https://tech-dailylife.tistory.com/category/%5BTech%5D%20War%20Game/XSS%20Challenges