@6번문제
이 사이트 XSS문제들 중 마지막 문제이다.
조금 많이 찾아보고 공부하던 계기가 되었던 문제이다.




(문제 화면)



먼저 페이지가 어떻게 동작하는지 확인해보는게 우선이다.
url 주소를 보니 # 뒤에 있는 경로가 화면에 보이는 것을 확인할 수 있다.



(문제 페이지)



코드를 살펴보니 url을 입력받는데, 여기서 url을 #뒤에 있는 부분을 따로 받아서
아래와 같은 코드에 붙여주어 출력해주고 있는 것을 확인 할 수 있다.



(문제 페이지 코드)



예를들어 #뒤에 abc 라고 입력하면
페이지 화면에 abc가 나올 것이다.



(동작 확인)



abc에서 가져오고 있다 이런 말로 # 뒤에 있는 경로에서 스크립트를 가져와 실행하고 있는 것을 알 수 있다.
문제 힌트를 확인해 보겠다.



(문제 힌트)



문제 힌트를 보니 스크립트 파일을 직접 서버에 올리고 그 경로를 적어주어 해결할 수 없다면 google.com/jsapi?~~~ 페이지를 이용하라고 나와있다.
이 문제를 해결하기 위해 서버까지 올리는건 부담스러우므로 다른 방법을 이용해보자.

찾아본 방법 중 Data Url Scheme라는 방법이 있었다.
데이터를 url 표현으로 바꾸어 주는 것이다.
사용 방법은 data:[자료타입], [데이터] 이렇게 들어간다.
우리는 javascript를 이용할 것이므로 자료타입은 text/javascript 이다.
예를들어 test 라는 문자로 테스트해보자.



(테스트)



test라는 데이터를 표현한 것이다.

스크립트 alert를 표현하면



(script 표현)



위와 같이 된다.
이 데이터를 # 뒤에 붙여주기만 하면 된다.




(스크립트 데이터 전달)





(문제 해결)



이렇게 되면 페이지에서 스크립트가 실행되고 문제를 해결할 수 있다.

문제에서 준 힌트를 살펴보면 스크립트는 아래와 같다.



(스크립트)


callback에 foo라는 값이 전달되어 foo 라는 함수가 스크립트 아래에서 실행되고 있는 것을 확인해 볼 수 있다.
예를들어 내가 abc라고 입력을 하면



(abc 입력)



abc() 라는 함수가 실행된다.

이를 이용해보면 callback에 alert라고 입력을 하게되면


(alert() 함수 실행)



alert() 함수가 실행된다.

이 소스스크립트를 이용하면 위 경로의 주소를 복사해서 #뒤 경로로 적어주면 된다.
http://는 필터링 하고있으므로 Http:// 이렇게 대소문자를 섞어 써주면 필터링을 못하게 되어있으므로 우회할 수 있다.



(문제 해결)




6번문제 까지 모두 푸니 마지막으로 아래와 같이 축하(?)의 페이지가 뜬다.


(축하의 페이지)

'WarGame > XSS Game' 카테고리의 다른 글

XSS GAME - level 5  (0) 2017.04.03
XSS GAME - level4  (1) 2017.04.01
XSS GAME - level3  (0) 2017.03.31
XSS GAME - level2  (0) 2017.03.31
XSS GAME - level1  (0) 2017.02.15



@5번 문제

DOM에 스크립트를 삽입하지 않고 XSS 공격을 하는 문제이다.



(문제 화면)



여기서 Sign up 을 클릭해보면
아래와 같이 나온다.




(Sign up 화면)



여기서 URL을 잘 보면 next라는 변수에 confirm이라는 값이 들어가 있는 것을 확인 할 수 있다.
이따 코드를 보면서 이 부분이 어떤 역할을 하는지 확인 할 필요가 있다.
우선 이 페이지가 어떻게 동작하는지 확인해보자 이메일을 적고 Next를 눌러준다.



(Next 눌러준 화면)



그 다음 페이지 화면으로 시간이 조금 있으면 다시 원래 페이지로 돌아간다.
코드로 signup 페이지를 확인해본다.



(signup 페이지 코드)



코드를 보면 우리가 클릭하는 Next 버튼이 링크 태그로 걸려있는 것을 확인 할 수 있다.
또 링크 주소가 next 변수의 값으로 전달되고 있는 것을 확인 할 수 있다!
즉, 우리가 next변수 값으로 스크립트를 전달해 줄 수 있으면 된다.

그렇다면 URL로 스크립트를 전달하는 방법은?



(스크립트)



위와같이 주소창에 javascript: 입력 후 스크립트 코드를 입력해주면


(스크립트 동작)



스크립트가 동작한다.

우리는 이것을 이용하여 문제를 해결할 것이다.
next변수에 javascript:alert('attack'); 값을 전달하여 링크 주소를 세팅한다.





(링크 주소 세팅)



그 후 Next 버튼을 클릭해주면 스크립트가 실행되고
문제를 풀 수 있다.




(문제 해결)






'WarGame > XSS Game' 카테고리의 다른 글

XSS GAME - level 6  (1) 2017.04.03
XSS GAME - level4  (1) 2017.04.01
XSS GAME - level3  (0) 2017.03.31
XSS GAME - level2  (0) 2017.03.31
XSS GAME - level1  (0) 2017.02.15




@ 4번 문제

인젝션 처럼 값을 조작해서 스크립트를 실행하게 하는 문제였다.




(문제 화면)



버튼을 클릭하면 타이머가 동작한다.



(타이머 동작)



3초가 지나고 다시 돌아온다.
잘보면 URL에 timer변수로 3이라는 값이 전달되고 있는것이 보인다.

GET방식으로 변수가 넘어가고있는데 코드를 보면 확인 할 수 있다.




(페이지 코드)



코드를 보면 GET방식으로 timer 변수가 넘어간다.
그래서 URL에 timer=3으로 입력하고 전달해도




(타이머 동작)



타이머가 동작한다.

이제 타이머 페이지의 코드를 보겠다.



(타이머 페이지 코드)



여기서 이미지 태그를 보면 바로 눈치챌수 있다.
바로 onload 부분에 우리가 입력한 timer 값이 들어가게 되니 여기를 잘 조작해서 입력하면
스크립트가 실행되게 할 수 있는 것이다.
{{ timer }} 이렇게가 변수로 입력이 되므로
timer=1');alert('attack
이라고 값을 전달하게 되면
onclick="startTimer('1');alert('attack');" 이렇게 완성되어 스크립트 코드가 실행 될 것이다.



(인젝션)



하지만 동작하지 않았다..
실행된 초 앞에 {{timer}} 값을 보면 1') 까지만 들어갔는데..
; (세미콜론)부터가 입력되지 않은것이다.

문제는 ; (세미콜론)을 URL 인코딩 해서 보내줘야한다. 세미콜론 퍼센트 앤퍼센드 등등
가끔 URL인코딩으로 보내줘야할 때가 있다.
; -> %3B로 바꿔서 입력해주니 아래와 같이
;(세미콜론)으로 잘 전달이 되어 우리가 원하는 {{ timer }} 값이 되었다.



(문제 해결)



그리고 스크립트 코드가 실행되었다.
문제 해결!



'WarGame > XSS Game' 카테고리의 다른 글

XSS GAME - level 6  (1) 2017.04.03
XSS GAME - level 5  (0) 2017.04.03
XSS GAME - level3  (0) 2017.03.31
XSS GAME - level2  (0) 2017.03.31
XSS GAME - level1  (0) 2017.02.15


@3번문제

코드를 잘 살펴봐야했던 문제였다.



(문제화면)





(문제 페이지)



문제 페이지를 보면 이미지 1, 2, 3 버튼을 클릭하면 이미지가 바뀌었다.



(그림변경)



여기서 눈치 챌수 있었던 부분은 url을 잘보면
/frame#2 -> 2번클릭
/frame#3 -> 3번클릭
이런식으로 넘어가고 있다는 것이다.
즉, url에 /frame#3으로 입력을하면



(3번그림)



3번그림이 화면에 나온다.

이제 코드를 들여다볼 차례이다.
코드를보면 html태그를 입력하는 부분이 있다..



(html 코드 추가부분)



이 부분에서 바로 눈치챘다.
Injection에서 늘 하던 거서럼 num 변수에 우리가 원하는 값을 입력하면 된다.
나는 여기서 onerror를 이용할 것이다.
<img src='없는파일.jpg' onerror='onerror("attack")'>를 이용한다.
그러기 위해 frame# 뒤에
5.jpg' onerror='onerror("attack")'>
를 입력해주었다.




(Injection)



그 결과 이미지5는 없으므로 에러가 나고
내가 원하던 스크립트가 실행되게 되었다.




(문제 해결)



이 문제에서는 스크립트 실행이 url로 전달되는 인자에 의해
실행될수 있다는 가능성을 알려주고있다.



'WarGame > XSS Game' 카테고리의 다른 글

XSS GAME - level 6  (1) 2017.04.03
XSS GAME - level 5  (0) 2017.04.03
XSS GAME - level4  (1) 2017.04.01
XSS GAME - level2  (0) 2017.03.31
XSS GAME - level1  (0) 2017.02.15



@ 3번문제!


(3번 문제)


아래는 문제화면이다.




(문제화면)



..?
게시판 관련 문제인가 해서 이 페이지 어딘가에 게시판이 숨겨진 줄 알았다..

소스코드로 확인해보니



(소스코드)



그런 거 같지도 않다..

페이지 문구는 공지사항에 글을 올려보라고 되어있다.
공지사항에 글을?

공지사항 게시판에 들어갔다.




(공지사항 페이지)



역시나! 글쓰기 버튼이 없다.

혹시 소스코드에 글쓰기 페이지가 숨겨져있을까?
소스코드를 확인했다.



(게시판 url)



확인해보니 건진건 위에 url 이었다.

divi라는 변수에 notice라고 누가봐도 공지사항을 나타내기 위한 변수였다.
divi라는 변수에 notice라고 되있으면 되고.. list 페이지가 있으니
write 어쩌구 페이지도 있지 않을까?
그 페이지에서 변수를 notice로 주면 공지사항에 글을 올릴 수 있지 않을까?
하는게 나의 생각이었다.

먼저 글을 쓸수 있는 페이지를 확인하기 위하여
자유게시판에 들어갔다.





(글쓰기 클릭)



글쓰기를 클릭하고 url을 확인해 보았다.




(글쓰기 페이지 url)



역시! :)

write.asp 페이지다.
게다가 변수 divi가 보인다.
divi 변수에 Free 라고 자유게시판 DB로 넘겨주는 작업을 하는 코드가
write.asp 페이지에 적혀있지 않을까하는 생각이 든다.

그렇다면 나는 divi변수에 notice를 입력하여 다시 접속!




(divi=notice)



공지사항 글쓰기로 바뀌었다.. ㅎㅎ

여기서 글을 쓰면 공지사항에 글이 올라가려나?..




(공지사항 글쓰기)



테스트 해본다!




(테스트)



글쓰기!

??


(인증코드 등장)



인증코드가 나왔다.

확인해보니 역시 공지사항에 글이 올라가진 않고
다만 저렇게 문제를 풀 수 있도록 인증키만 제공하는 듯 했다.


'WarGame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS : Challenge WEB 6  (0) 2017.03.28
SuNiNaTaS : Challenge WEB 5  (0) 2017.03.27
SuNiNaTaS : Challenge WEB 4  (2) 2017.03.23
SuNiNaTaS : Challenge WEB 2  (0) 2017.03.22
SuNiNaTaS : Challenge WEB 1  (0) 2017.03.22


4번 문제또한
새로운 문법을 공부할 수 있는 좋은(?) 계기가.. 되었다.

문제 화면이다.




(4번 문제 화면)




(사진을 클릭한 화면)



44827을 url 끝에 입력하고 들어가니 비슷한 패턴의 숫자가 또 나와서
입력하였다.

세번째(?) 인가..



(손이 아플꺼야 화면)



정확히 이게 맞나 싶은 생각이 들때
이 문구가 나왔다.

이런식으로 계속 들어가야 정답이 나오는데
손으로는 힘들겠다.. 라는 생각이 들었다.

새로운 방법이 필요했고
파이썬에서 제공하는 url 관련 기능을 이용하기로 했다.




(파이썬 문서 참조)



여기 에 있는 것들 중에 urllib.request를 사용할 것이다.

먼저 url 내용을 가져오는 작업을 (실험? 을 통해) 하였다.




(문구가 나오는 화면)



내용을 가져오는 것은 read() 인것 같다.
이 내용을 보니 byte 형식이길래
decode를 해야겠다고 생각이 들었고

decode를 하였다.



(decode 화면)



decode 한 순간
내용이 사라졌다..
이 문제로 굉장히 난감하고 힘든 나날들을 보냈다.

데이터 내용을 접근만 하면 사라져서..

그리고 해결책을 찾아냈다.
urlopen으로 바로 여는게 아니라 그렇게 하면 안됬다.
request.Request로 얻어온 내용으로 open을 하고 그 내용을 read로 읽어 들인 후
decode를 하면 내용을 뽑아 올 수 있었다.

문서를 찾은것이라기보다 이것저것 노가다의 시도 끝에...



(24번째가 숫자이다.)



(뒤에 입력해야할 값을 뽑아냈다.)



이제 뒤에 입력할 내용까지 뽑아내는데 성공했다.

이제 이 값을 url주소에 입력하면서 반복적인 작업을 해줘야한다.

while 문으로 코드의 길이가 없으면 중지되게 계속 반복문을 돌렸다.



(처음 시도)



(결과화면)



아.. 3번째는 팔아프다는 어쩌구 문구 때문에 24번째가 아니었다.

고민없이 뒤에 94485를 수동으로 입력 후 다시 진행



(다른 문구)



2를 나누어서 다시 계속 진행하라고 했다.

음.. 16044를 2 나누어서 8022로 다시 진행




(8022 다시 진행)



(이번엔 또 다른...)



뭔가 착오가 있다고 나왔다.

일단 지금까지 규칙대로 nothing 뒤에 있는 저 숫자
63579를 입력했다.



(63579 입력)



(??! 정답?)



마지막에
peak.html이 나왔다.

내가 보던 정답 유형과 비슷해서 정답이라는게 느껴졌다.



(정답 입력)



(정답!)



정답이다.! :)

뒷걸음치다 소잡은 느낌이긴 하지만..

url 파이썬을 공부하게 된.. 계기가 되었다.

4번 해결..!



'WarGame > Python Challenge' 카테고리의 다른 글

Python Challenge - 5  (0) 2017.01.18
Python Challenge - 3번  (0) 2017.01.02
Python Challenge - 2  (0) 2017.01.01
Python Challenge - 1  (0) 2017.01.01

+ Recent posts