8번째 푼 문제이다.

이번 문제 푸느라 눈 빠지는 줄 알았다...
(내가 잘 몰라서 그런거일수있지만..)

8번째 풀이 문제! fly me to the moon



(문제)



아래는 문제 페이지다.



(문제 페이지)



문제 페이지에 들어가면 게임을 하게된다.

그런데 벽이 점점 좁아지면서 깰수 없는... 지경에 이른다. 게다가 점수는 31@@@@ 엄청 많이 이상 받아야 된다고 나온다..

자바스크립트 우회문제구나! 하고 들어가보니.!



(스크립트)



역시! 스크립트는 곱게 줄리 없지!

뷰티하게 정렬해주자.



(스크립트 코드)



이제 좀 사람이 볼만해졌다.

이 코드를 분석하느라 오래걸렸다.. 실은 완벽하게 분석하려다 포기하고
게임에 핵심되는 부분만 골라서 봤다.

내가 원했던 것은 벽에 부딛혀도 안죽게하기!
그런 함수를 뒤지다보니 죽는 함수가 나오는 곳을 발견하였다.



(죽는 함수)



이 조건을보면 벽에 부딛히는 조건을 적어놨다.
나는 요 || (or)연산자를 && (and) 연산자로 바꾸어 죽지 않게 했다.
근데... 난독화되어있는 코드라..
다행이도 || 는 한번쓰인거라서 찾아서 &&로 바꾸어 주기만 하면 됬다.



(|| 사용된곳)



바로 이곳을 && 로 수정해서 다시 스크립트를 입력해주었다.

그랬더니 벽에 아무리 부딛혀도 무적의 전투기가 되었다.



(무적의 전투기)



그런데 또 한가지 문제가 생겼다. 점수가 목표치 31@@@@@ 어쩌구 까지 가는데 오래걸린다...

그래서 점수와 관련된 함수가 이용되는 곳을 공략했다.



(점수가 올라가는 조건)



바로 이 게임에서는 c_s 등 여러 시간에 관련된 시간 변수를 두어 여러가지 동작을 일으켰는데
c_s는 20에 한번씩 0으로 리셋되어 점점 1씩 올라간다. 바로 0으로 리셋될때 점수가 올라가는데
여기서 c_s >20 조건을 c_s>=0 으로 주어 점수가 파파팍 올라가게 했다.

여기서 점수가 하나씩 올라가는 것에 불만을 품고 점수를 한번에 더더 많이 올리기 위해 점수 올리는 함수를 추적하였다.




(점수 상승함수)




(점수 상승함수)



이 곳에 ++로 1씩 증가하게 되어있었는데
이 ++을 여러번 복사 붙여넣기하여 한번에 점수가 1씩이 아닌 팍팍 올라가게 했다.


(점수 팍팍 코드)




이렇게 세팅하고 시작하니 무적의 전투기가 점수가 파파팍 쌓이는 것을 볼 수 있다.



(무적전투기 죽이기)



이렇게 계속 냅둬도 내 전투기는 무적이라 안죽는다.. 그래서 게임이 안끝나는데
내가 죽이는 함수를 이용하여 죽여줘야한다.

31@@@@@ 이상이 될때 전투기를 죽여주면
키가 나온다~!


(문제 해결)


'WarGame > 500 Project' 카테고리의 다른 글

(10/500) Wargame.kr - md5 password  (0) 2017.04.14
(9/500) Wargame.kr - md5_compare  (0) 2017.04.13
(7/500) Wargame.kr - WTF_CODE  (0) 2017.04.12
(6/500) Wargame.kr - flee button  (0) 2017.04.11
(5/500) Wargame.kr - QR Code Puzzle  (0) 2017.04.11



@ 5번문제
스크립트 관련된 문제였다.

난독화되어있는 스크립트에 대한 이해와
스크립트 동작만 할 줄 알면 쉽게 풀수 있는 문제다.



(5번문제)


(문제 화면)



처음에는 인젝션 문제인 줄 알았으나..
소스코드를 보고 잘못된 길에 빠질뻔 했다는 사실을 알았다.






(소스코드)



소스코드를 보면
<script> 태그안에 스크립트 코드가 적혀있는데 도통 무슨말인지 알아먹을 수가 없다.

스크립트 난독화를 이쁘게 정리해주는 사이트의 도움을 받았다.




(정리된 코드)



정리된 코드를 보니
마음이 차분해지고 편안해졌다.

정리된 스크립트 코드를 보니 입력에 대해서 어쩌구 연산을 통해 result를 return하고 있는 모습을 확인 할 수 있었다.

그리고 스크립트에서 정의된 PASS 함수가 어디서 실행되고 있는지 소스코드에서
샅샅이 찾았지만
찾을 수 없었다..
어디에도 없었다. 
그 때 든 생각 중 아래에 힌트가 숫자로 적혀있었는데
이 값을 함수의 입력으로 넣어준 값이 우리가 찾아야하는 결과값이 아닐까하는 
생각에 이르렀다.



(힌트)



바로 관리자 모드를 열어 콘솔에 입력해주었다.
함수 PASS를 바로 입력하니 정의되있지 않은 함수라고 나와서

난독화를 푼 스크립트 코드를 이용해 변수와 함수를 정의해주었다.




(변수, 함수 정의)



그리고 PASS 함수를 힌트를 입력하여 실행하니 코드가 나왔다.






(함수 실행)



그 코드를 입력값에 넣어 체크를 해보니
인증키가 나왔다. :)


(인증키 획득)


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

SuNiNaTaS : Challenge WEB 8  (0) 2017.03.29
SuNiNaTaS : Challenge WEB 6  (0) 2017.03.28
SuNiNaTaS : Challenge WEB 4  (2) 2017.03.23
SuNiNaTaS : Challenge WEB 3  (0) 2017.03.22
SuNiNaTaS : Challenge WEB 2  (0) 2017.03.22


@ 2번 문제이다.



(2번 문제)



(문제 화면)



문제를 보고
음... sql injection을 통한 로그인 우회 문제인가?
라는 생각이 들어 여러 시도를 했다..


(인젝션 시도)



이것저것 인젝션을 해본 뒤
어떻게 된거야 온갖 상상을 해보았다.

그 후 이 페이지의 소스코드를 확인해보았다.
(소스코드를 보는 것이 우선이다..)
소스코드를 보니 스크립트가 적혀져있었다. + 문제의 힌트와 함께




(스크립트)



스크립트의 내용은 id와 비밀번호를 갖게 입력하면
빠꾸 먹는다.
하지만 힌트를 보면 아이디와 비밀번호를 같게 입력해야된다고 알려주고있다.

즉 이 문제는 스크립트 우회 문제이다.

form 문을 하나 만들어서 내가 따로 보내줘야지 라는 생각이 들었다.




(내가 만든 form)



value를 같게 설정해준 뒤
전송버튼을 눌러서 보내줄 생각이다.




(콘솔에 입력!)





(버튼 클릭)



여기서 저 버튼을 클릭하면 된다.
위 캡쳐에서는 못찍었지만 form 태그에 action에 /Part_one/web02/web02.asp를 찍어주든가.
아니면 그 페이지 내에서 콘솔에 입력하여 폼문을 전달해줘야한다.

전달해주면 아래와 같이 답이 나오게 된다.




(정답)






'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 3  (0) 2017.03.22
SuNiNaTaS : Challenge WEB 1  (0) 2017.03.22


XSS 취약점을 공부한 후
이 것에 관해 직접 해보고 싶은 마음에
XSS Wargame을 여기저기 찾아본 결과
구글에서 만든 XSS GAME사이트라는 좋은 사이트를 찾게 되었다.

level1 부터 시작해볼것이다 :)

level1의 화면이다.



(문제 1 화면)



아래의 인터넷 창에서 alert()으로 팝업창을 띄우면 된다는 이야기이다.
스크립트코드로 alert() 코드를 띄운다는 것은
마음만 먹으면 악성 코드도 실행 시킬 수 있다는 것으로
분명 위험한 취약점이다.

먼저 아래 화면에서 Search 버튼을 눌러
사용자의 입력값이 어떻게 전달되는지 확인해보았다.



(전달 방식 확인)



확인해보니
url을 통해 전달되는 GET방식으로 전달 되고 있다.
또 화면에 Enter query here...  는 우리가 기본값으로 전달된 값임을 확인 할 수 있는데

더 정확하게 확인하기 위하여 소스코드를 분석해보았다.



(소스코드 분석)



코드를 보니 query라는 변수에 검색 입력값이 들어가고
화면에 뿌려주는 코드에서 query가 들어간것을 확인 할 수 있다.
이렇게 html코드에 들어가는 변수를 직접 사용자가 건들일 수 있다면
위험한 코드이다.
우리는 이부분을 이용하여 공격할 것이다.

query 변수에 들어가는 검색 입력란에
<script> alert("XSS");</script>
코드를 입력 할 것이다.



(XSS 공격)



검색을 하니 XSS 코드가 삽입되었고
팝업창이 떴다.



(공격 성공)



이렇게 level1은 간단히 넘어갈 수 있었다.



'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 - level3  (0) 2017.03.31
XSS GAME - level2  (0) 2017.03.31


XSS( Cross Site Scripting )
- javascript를 이용한 대표적인 취약점이다.
  스크립트로 작성된 코드는 클라이언트의 웹브라우저에서 실행이 된다.

인터넷 웹 화면이 뜨는 과정은 웹 서버에서 우리 앞의 웹 브라우저로 코드가 날라오고 웹 브라우저는 그 코드를 실행하여 화면에 보여주는 것이다. 이 때 넘어오는 값에 스크립트 코드를 넣는 것이다.
 -> 주 타겟 : 불특정 다수(클라이언트)

ex) 예를 들어 게시판에 아래와 같은 글을 업로드 하는 것이다.
<script>alert("공격성공")</script>
(Enter가 들어가면 안된다.)
-> 공격을 하려면 자바스크립트로 원하는 코드를 만들 수 있어야한다.

스크립트 코드가 실행 되는지 확인하기 위하여 alert() 을 사용하여
코드가 실행 된다면 악의적인 코드가 실행될 가능성이 있다고 판단하여
취약점이라고 간주한다.

우리가 만든 제로보드 게시판에 XSS 공격을 해보겠다.



(스크립트 작성)




(게시판 화면)



게시판에 공격자의 글이 올라온 것을 확인 할 수 있다.

만약 이 글을 클릭한다면



(악성 코드 실행)



공격자가 작성한 스크립트 코드가 실행된다.



(글 화면)



글 내용에는 아무 글도 보이지 않는다.
왜냐하면 스크립트코드로 간주되었기 때문이다.

이런 방식으로 게시판 혹은 서버에 저장해두어 다른 사람들이 열람하여
코드가 실행되게 하는 방식을 Stored XSS 라고 한다.

다른 방법으로는 reflected XSS가 있다.

이 방법은 다음 XSS 취약점을 보면서 확인하겠다.
다음 XSS가 가능한 부분은 많지만
그 중에 회원가입란의 아이디 중복체크하는 페이지다.


(중복 체크 페이지)



이 페이지의 주소를 살펴보면
url을 통해서 값이 전달되고 있는 것을 확인 할 수 있는데
이 변수에 스크립트 코드를 넣어 실행하면
바로 실행이 된다.



(url을 통한 스크립트 코드)





(실행 화면)



실행하게 되면 IE에서
XSS를 발견하여 조치를 취해주었다.

우리는 공격을 확인 할 것이므로 잠시 이 설정을 해제해 주도록 하겠다.



(인터넷 옵션)



인터넷 옵션에서 보안탭을 들어간다.




(사용자 지정 수준 클릭)



사용자 지정 설정 수준에 들어가면
아래 부분에 XSS 필터 사용 항목이 있는데
사용 안 함으로 클릭해 주면 된다.



(사용 안함 클릭)



그런 상태로
아까와의 같은 url로 접속을 하면



(실행 화면)



스크립트 코드가 실행 된것을 확인 할 수 있다.

이 방식이 아까 Stored XSS와 다른 점은
저장되는게 아니라 바로 돌아온다. 입력된 그자리에서 실행된다는 것이다.


<script>alert(" target="_blank">http://100.100.100.129/zboard/check_user_id.php?user_id=<script>alert("xss")</script>
 링크를 활용해서 공격할 수 있다.
바로 이런 방법이 reflected XSS 이다.

이 공격을 더 유용하게 만드는 것은 shorten url 이다.
url을 짧게 만들어준다.



(shorten url)



그렇다면
XSS에 대한 대책은 어떤 것이 있을 까?

<script> 문을 게시 글 이외에
어떤 곳에서도 올리지 못하게 해두어야한다.

제로보드의 코드를 조금 수정해 보겠다.
게시판 글을 쓰는 곳에서 코드를 확인해보니
write_ok.php 파일로 데이터들을 전송하는 것을 확인 할 수 있다.



(보내는 곳 확인)



그렇다면
우리가 손봐야할 파일은
write_ok.php이다.



(write_ok.php 수정)



먼저 게시판 글쓰기의 소스코드를 확인해보면
게시 글이 변수 memo를 통해 넘어오는 것을 확인 할 수 있다.



(게시글 변수)



그러므로 우리는
write_ok.php 파일 맨 앞에
<script> 단어가 있으면 XSS 공격으로 간주하는 코드를 추가할 것이다.



(코드 추가)



코드 추가 후 공격을 해보겠다.



(XSS 공격)




(차단)



차단 된 것을 확인 할 수 있다.

하지만 방어가 있으면 다시 또 다른 공격을 하는 법..

이 코드를 우회할 수 있다면? (아주간단하게..)



(우회? 공격)



아주 간단하게 첫 script 를 대문자로 작성했다.



(우회 XSS 공격)




(공격 성공)



공격이 성공했다..
아주 간단하게 성공됬다.

이는 아까의 코드에서 문자열 검색에서 i를 추가해주면
대소문자 전부 체크해준다.



(코드 수정)



그렇게 되면



(우회 공격)




(차단)



간단한 우회도 차단할 수 있게 된다.

하지만 우회하는 방법은 수없이 많다.
그러므로 시큐어코딩(안전한코딩)이 쉬운 일은 아니다..!




오늘은 스케쥴관리 페이지에서 할일을 추가하는 기능을 만들었다.

쉽게 말하면
todolist table에 데이터를 집어 넣는 기능이다.

페이지를 옮겨다니는 것도 좋지만
팝업창 기능을 이용해서 기능을 구현하고 싶었다.



(스케쥴관리 메인 페이지)



여기서 할 일 추가하기를 누르면 팝업창이 뜨고 입력하게 할 것이다.

팝업창을 뜨게 하는 자바스크립트를 검색했다.
그리고 그냥 추가하고 크기만 조금 수정했다.



(팝업 스크립트)



그 후 [할 일 추가하기] 버튼을 클릭했을 경우 스크립트가 동작하도록 호출한다.



(팝업 호출)



호출된 페이지는 schedule_append.jsp 페이지로 이동하므로
이제 이 페이지를 작성해야한다.
기본적으로 DB에 아이디를 추가할 것이다.
id는 세션값으로 받아왔다.
그리고 그 아이디를 통해 이름을 가져왔다. (지금 생각해보니 왜 가져왔는지 의문)
(삭제해줘야할 불필요한 코드다..!)
(아이디를 통해 todolist를 필터링 할것이다.)
(해당 아이디의 데이터만 화면에 보이게 할것이다.)



(기본정보 받아오는 코드)



그리고 form 태그를 만들어준다.
여기서 입력한 정보를 schedule_append_OK.jsp 페이지로 넘어가서 데이터를 입력시켜줄 것이기 때문이다.



(form 태그 만들기)



이제 여기서 입력한 정보를 schedule_append_OK.jsp 페이지로 넘겨주어
데이터를 입력할 것이다. (MySQL에)



(데이터 입력)



입력 후 이 창은 팝업창이므로 저절로 닫히도록 자바 스크립트를 추가했다.



(스스로 창닫기 코드)



지금 까지 만든 페이지를 확인해보자! :)



(할일 추가하기 클릭)



팝업창이 뜬다!



(팝업창)



여기에 할 일을 적어준다.




(할 일 입력)



그리고 추가하기를 눌러준다.!

메인페이지에 다시 들어가보면!
할 일이 추가된 것을 볼 수 있다.


(할일 추가 된 모습)



+ Recent posts