[그림 01] level24시작


client ip와 agent 를 보여줍니다.

그리고 어째 Wrong IP!라면서 저를 다그칩니다.

뭔가 죄송해집니다.

먼저 웹 문제를 푸는 첫단계는 F12(개발자 도구)를 켜는 것이라고 합니다. 꾸욱 눌러줍니다.


[그림 02] 페이지 소스


페이지 소스는 [그림 02]에서처럼 index.phps를 보라고 합니다.

그럼 index.phps를 들어가봅시다.


[그림 03] index.phps로 본 PHP소스


PHP소스에 대한 보충 설명은 아래와 같습니다.

이 PHP소스를 해석해보면, extract한 값들을 모두 나열하고 그 중에 REMOTE_ADDR이라는 변수를 PHP의 $REMOTE_ADDR에 저장한다는 문장이 신경쓰입니다.

값은 COOKIE에서도 가져오고, SERVER에서도 가져온다고 합니다.

그렇다면 REMOTE_ADDR은 COOKIE와 SERVER에서 모두 삽입할 수 있다는 것을 의미합니다.

우리는 Client이기 때문에 COOKIE 값을 변조하거나 더할 수 있게 되는 것입니다.


cookie 값을 확인하니 PHPSESSID만 있고 아무것도 없네요.

그렇다면 REMOTE_ADDR이라는 변수에 우리가 원하는 127.0.0.1을 넣어야 겠네요.

하지만 12, 7., 0.은 모두 널로 바뀌는 것을 알 수 있습니다.


필터링을 걸려도 문제 없도록~

112277..00..00..1

이렇게 넣어주도록 합시다.


[그림 04] cookie 값 삽입


이제 쿠키 값을 [그림 04]와 같이 삽입을 했다면, IP가 바뀌겠지요?

[그림 05] Fiddler 4를 이용하여 풀어보았는데...


Fiddler 4를 이용하여 풀어보았는데(물론 큰 따옴표도 제거해보았습니다.) login plz라는 문자가 뜨게 됩니다.

저런... 이녀석이 session을 받아들이지를 못하는 군요..

아마 제 실수가 아닐까 생각됩니다만...


실험하고 돌아오니, 저기 반점이 아니라 세미콜론이 있어야 했네요 헤헿;


[그림 06] ip 변조 성공


우왕 성공했당!!


[그림 07] 해결!!


'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.28(500) - old  (0) 2019.10.25
Webhacking.kr_No.27(150) - old  (0) 2019.10.25
Webhacking.kr_No.26(100) - old  (0) 2019.10.24
Webhacking.kr_No.25(150) - old  (0) 2016.12.08
Webhacking.kr_No.23(200) - old  (0) 2016.06.28
Webhacking.kr_No.20(200) - old  (0) 2016.06.28
Webhacking.kr_No.18(100) - old  (0) 2016.06.28
Webhacking.kr_No.17(100) - old  (0) 2016.06.28

[그림 01] level23 시작


미션은 쿼리에 <script>alert(1);</script>를 넣으라고 하는 것 같습니다.

호호라, 그럼 한 번 저 문장을 입력해 보도록 해야겠습니다.


[그림 02] no hack


미션을 수행했더니 no hack이라고 뜨는군요.

위의 현상은 싱글 문자면 문제가 없지만 두 글자 이상이 쿼리로 전송되면, no hack이라는 답을 뱉어내는 것 같습니다.

예외 : <s 를 붙여서 쓰면 Your mission is to inject <script>alert(1);</script> 라고 나타나게 됩니다. 이것은 단순 오류현상인 것 같습니다.


[그림 03] 띄어쓰기 가능


쿼리문을 날려보았는데 띄어쓰기를 통해 보내보면 [그림 03] 과 같이 결과가 나오게 됩니다.

그러면 어떠한 방식으로 쿼리가 보내지는지 알아보도록 합시다.

주소창을 보니 [그림 04]와 같군요.

[그림 04] GET 방식 쿼리 전송


GET방식으로 URL 인코딩이 되어 올라가는 것을 확인할 수 있었습니다.

그렇다면, 이제 GET방식(URL 인코딩)을 이용하여 쿼리를 보내고, 우회를 해야 하다는 것을 알 수 있습니다.

하지만 %20(SPACE), %0a(NEXT LINE), %09(TAB)은 띄어쓰기 혹은 다음 라인과 같은 효과이기 때문에 인식이 되지 않을 어떤 문자를 넣어주어야 합니다.

그렇다면, 여기서 %00(NULL)을 사용하는 방법으로 우회를 시도해보는 것이 좋을 것 같습니다.

%00 그러니까 NULL은 어차피 PHP에서도 NULL로 해당되기 때문에 결국 붙여쓰는 게 됩니다.

들어올 때는 s NULL c NULL r NULL i NULL p NULL t NULL 이렇게 전송이 되지만, 결국 script가 된다는 의미입니다.

[그림 05] 결과


[그림 05]는 NULL을 첨부하여 문제를 풀이를 시도해본 결과입니다.

어째 결과가 좀 다릅니다. ㅎㅎ;

변화가 일어난 것을 긍정적인 의미로 나머지를 모두 입력해보았습니다.


?code=<%00s%00c%00r%00i%00p%00t%00>%00a%00l%00e%00r%00t%00(%001%00)%00;%00<%00/%00s%00c%00r%00i%00p%00t%00>

위와 같이 쿼리를 GET 방식으로 넘겨보았는데, [그림 05]와 같은 결과가 또 나타났습니다.

어라 이거 아닌가? 하며 뒤로가기를 해보았는데, 문제는 풀려있다는 것을 확인했습니다. 허허...


'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.27(150) - old  (0) 2019.10.25
Webhacking.kr_No.26(100) - old  (0) 2019.10.24
Webhacking.kr_No.25(150) - old  (0) 2016.12.08
Webhacking.kr_No.24(100) - old  (0) 2016.06.28
Webhacking.kr_No.20(200) - old  (0) 2016.06.28
Webhacking.kr_No.18(100) - old  (0) 2016.06.28
Webhacking.kr_No.17(100) - old  (0) 2016.06.28
Webhacking.kr_No.16(100) - old  (0) 2016.06.28

[그림 01] level20 시작


level20에서는 javascript 도전이라고 합니다.

따라서 console에서 문제풀이를 해야 할 것 같습니다.

먼저 script를 살펴보도록 합시다.


[그림 02] script 소스


스크립트 소스는 lv5frm 밑에 script가 있고, id, cmt, hack, 그리고 attackme가 있습니다.

문제의 풀이는 hack.value와 attackme.value가 같아야 한다는 것을 암시합니다.

그러면 javascript로 이를 빠르게 입력하여 문제를 풀이해야 함을 알 수 있습니다.

문제 풀이는 다음과 같습니다.


<풀이 javascript 문>


lv5frm.id.value=lv5frm.attackme.value;
lv5frm.cmt.value=lv5frm.attackme.value;
lv5frm.hack.value=lv5frm.attackme.value;
lv5frm.submit();


사실 id,cmt는 필요없는 부분이지만 채워주도록 했고, 다음과 같이 채워진 채로 submit하게 되면(제한시간 내에, 그러니까 겁나 빨리)

[그림 03]과 같이 풀리게 됩니다.

이 풀이는 F12(개발자 도구)의 '콘솔'에서 풀 수도 있고, 혹은 javascript문을 주소창에 기입하여 풀이할 수 있습니다.


[그림 03] 해결


'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.26(100) - old  (0) 2019.10.24
Webhacking.kr_No.25(150) - old  (0) 2016.12.08
Webhacking.kr_No.24(100) - old  (0) 2016.06.28
Webhacking.kr_No.23(200) - old  (0) 2016.06.28
Webhacking.kr_No.18(100) - old  (0) 2016.06.28
Webhacking.kr_No.17(100) - old  (0) 2016.06.28
Webhacking.kr_No.16(100) - old  (0) 2016.06.28
Webhacking.kr_No.15(50) - old  (0) 2016.06.28

[그림 01] level18 시작


level18에서는 SQL Injection이라고 합니다.

먼저 phps를 통해 php문을 확인해보도록 합시다.


[그림 02] php문


php에서는 union, select, from, 0x, (띄어쓰기), /, \(, \), \t, \|, &에 대한 필터링이 걸려 있는 것을 볼 수 있습니다.

그럼 우리는 어떤 것이 허용되었는지 확인해야할 필요가 있습니다.


처음 0 or no=1으로 or나 and를 확인해보기 위해 %20대신 %0a를 사용하였습니다.

0%0aor%0ano=1을 GET 으로 넘겨주니 or와 %0a가 먹히는 것으로 보입니다.


이제 %0a와 or를 활용하여 admin을 얻어와야 하는데...


[그림 02]에서 테이블에 있는 admin을 받아와야 하기 때문에 반환값을 조정하기 위해 limit을 이용하여 하는 방법이 가장 옳다고 생각됩니다.

(중간에 저도 깨달음을 얻었습니다.. 시간이 너무 소요가 되었어요..)


즉, q[0]에 반환되는 값을 admin으로 받으려면 Table 내에 있는 admin을 가져와야 한다는 의미입니다.

limit 0,1이 guest일 것이기에, 우리는 limit 1,1로 admin이 있는지 확인해봅시다.


[그림 03] 적중!


다행히 limit 1,1의 위치에 admin이 있었습니다.


'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.25(150) - old  (0) 2016.12.08
Webhacking.kr_No.24(100) - old  (0) 2016.06.28
Webhacking.kr_No.23(200) - old  (0) 2016.06.28
Webhacking.kr_No.20(200) - old  (0) 2016.06.28
Webhacking.kr_No.17(100) - old  (0) 2016.06.28
Webhacking.kr_No.16(100) - old  (0) 2016.06.28
Webhacking.kr_No.15(50) - old  (0) 2016.06.28
Webhacking.kr_No.14(100) - old  (0) 2016.06.28

[그림 01] level17 시작


개발자 도구를 봐야 뭘 알 수 있겠네요.

먼저 F12를 꾹 눌러줍시다.


[그림 02] 자바스크립트로 짜여진 코드


위의 소스를 해석해보면 unlock에는 숫자계산을 하도록 하게 하고, 만약 unlock에 들어간 값을 check에 넣게 되면,

Password를 뱉어내도록 하는 함수라는 걸 알 수 있습니다.


Password는 unlock의 0.1을 곱한 값이라고 합니다.

개발자 콘솔에서 unlock을 확인해보니 '9997809307'이라고 합니다.


[그림 03] 결과


패스워드는 999780930.7입니다.

이를 Auth에서 인증하면 답이 나오게 됩니다.






'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.24(100) - old  (0) 2016.06.28
Webhacking.kr_No.23(200) - old  (0) 2016.06.28
Webhacking.kr_No.20(200) - old  (0) 2016.06.28
Webhacking.kr_No.18(100) - old  (0) 2016.06.28
Webhacking.kr_No.16(100) - old  (0) 2016.06.28
Webhacking.kr_No.15(50) - old  (0) 2016.06.28
Webhacking.kr_No.14(100) - old  (0) 2016.06.28
Webhacking.kr_No.12(250) - old  (0) 2016.06.28

[그림 01] level16 시작


level16을 들어가면 [그림 01]처럼 별 몇개만 보여줍니다.

개발자 도구를 통해 소스를 확인해봅시다.


[그림 02] 소스 함수


mv함수와 kk함수가 있는데, 함수들의 설명은 다음과 같습니다.

mv(cd) 함수는 cd에 따라 기능이 결정되는데, cd가 124일 때 password를 보여주는 page로 넘어가게 됩니다.

kk(x,y) 함수는 랜덤 색깔로 별을 그리는 함수입니다.


우리는 콘솔 창에서 mv(124)를 입력하고 [그림 03]처럼 답을 얻어봅시다.

[그림 03] 패스워드



'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.23(200) - old  (0) 2016.06.28
Webhacking.kr_No.20(200) - old  (0) 2016.06.28
Webhacking.kr_No.18(100) - old  (0) 2016.06.28
Webhacking.kr_No.17(100) - old  (0) 2016.06.28
Webhacking.kr_No.15(50) - old  (0) 2016.06.28
Webhacking.kr_No.14(100) - old  (0) 2016.06.28
Webhacking.kr_No.12(250) - old  (0) 2016.06.28
Webhacking.kr_No.10(250) - old  (0) 2016.06.28

[그림 01] level15 시작


시작하자마자 Access_Denied를 뱉어냅니다.

우리는 Fiddler로 캡처를 해보도록 합시다.

참고로 Fiddler는 Internet Explorer 혹은 Edge가 잘 캡처됩니다.

[그림 02] 얼레.. 해결됐당


document.write("password is off_script")라고 패스워드가 적혀 있네요.


'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.20(200) - old  (0) 2016.06.28
Webhacking.kr_No.18(100) - old  (0) 2016.06.28
Webhacking.kr_No.17(100) - old  (0) 2016.06.28
Webhacking.kr_No.16(100) - old  (0) 2016.06.28
Webhacking.kr_No.14(100) - old  (0) 2016.06.28
Webhacking.kr_No.12(250) - old  (0) 2016.06.28
Webhacking.kr_No.10(250) - old  (0) 2016.06.28
Webhacking.kr_No.06(100) - old  (0) 2016.06.28

[그림 01] level14 시작화면


level14에 들어가면 다짜고짜 아무거나 입력해서 check하라고 합니다.

우리는 사뿐히 admin을 입력하고 check를 시도한 후 wrong!!이라는 퇴짜를 맞아봅니다.

먼저 페이지 소스를 확인해야겠습니다.


[그림 02] 페이지 소스의 script


페이지에서 function ch()라는 함수가 스크립트로 정의가 되어 있는 것을 볼 수 있습니다.

document.URL 즉, 지금 입력된 URL을 ul에 저장한다는 의미이고,

ul.indexOf(".kr")은 .kr이 있는 위치를 숫자로 저장한다는 의미입니다.

그리고 이 위치(숫자)에 30을 곱한 값을 check에 넣게 되면 비밀번호를 뱉어낸다는 것을 알 수 있습니다.

alert에서도 (ul의 위치 * 30)*(ul의 위치 * 30)를 Password로 주는 것을 알 수 있습니다.

해보지 않고서도 이러한 공식을 얻을 수 있습니다.


(document.URL.indexOf(".kr") * 30)^2 == password

[그림 03] 콘솔을 이용한 풀이


콘솔을 이용하여 풀이를 진행하면 [그림 03]과 같이 진행할 수 있습니다.

510을 check에 넣고 submit하면 [그림 04]와 같은 값을 얻을 수 있습니다.


[그림 04] Password


이제 이 값을 Auth에서 인증하면 풀리게 됩니다.


'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.18(100) - old  (0) 2016.06.28
Webhacking.kr_No.17(100) - old  (0) 2016.06.28
Webhacking.kr_No.16(100) - old  (0) 2016.06.28
Webhacking.kr_No.15(50) - old  (0) 2016.06.28
Webhacking.kr_No.12(250) - old  (0) 2016.06.28
Webhacking.kr_No.10(250) - old  (0) 2016.06.28
Webhacking.kr_No.06(100) - old  (0) 2016.06.28
Webhacking.kr_No.05(300) - old  (0) 2016.06.26

[그림 01] level12 시작


단도직입적으로 javascript 문제라는 것을 말해줍니다.


[그림 02] javascript 난독화


자바 스크립트에서 [그림 02]와 같이 난독화가 되어 있는 모습을 볼 수 있습니다.

그렇다면 우리는 이를 다시 문자로 변환하여 어떤 script문인지 파악을 해야 할 필요가 있습니다.

Python으로 코드를 작성해보도록 합시다.

(Python 버전 2.7.12)

Worktime = """118,97,114,32,101,110,99,111,61,39,39,59,13,10,118,97,114,32,101,110,99,111,50,61,49,50,54,59,13,10,118,97,114,32,101,110,99,111,51,61,51,51,59,13,10,118,97,114,32,99,107,61,100,111,99,117,109,101,110,116,46,85,82,76,46,115,117,98,115,116,114,40,100,111,99,117,109,101,110,116,46,85,82,76,46,105,110,100,101,120,79,102,40,39,61,39,41,41,59,13,10,32,13,10,32,13,10,102,111,114,40,105,61,49,59,105,60,49,50,50,59,105,43,43,41,13,10,123,13,10,101,110,99,111,61,101,110,99,111,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,105,44,48,41,59,13,10,125,13,10,32,13,10,102,117,110,99,116,105,111,110,32,101,110,99,111,95,40,120,41,13,10,123,13,10,114,101,116,117,114,110,32,101,110,99,111,46,99,104,97,114,67,111,100,101,65,116,40,120,41,59,13,10,125,13,10,32,13,10,105,102,40,99,107,61,61,34,61,34,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,52,48,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,50,48,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,51,50,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,49,57,50,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,50,54,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,48,48,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,48,52,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,50,50,45,50,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,49,57,56,41,41,43,34,126,126,126,126,126,126,34,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,50,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,51,41,41,13,10,123,13,10,97,108,101,114,116,40,34,80,97,115,115,119,111,114,100,32,105,115,32,34,43,99,107,46,114,101,112,108,97,99,101,40,34,61,34,44,34,34,41,41,59,13,10,125,13,10"""
WorkList = list()
Worktime = Worktime.split(',')

for i in range(len(Worktime)):
	WorkList += chr(int(Worktime[i]))

print "".join(WorkList)

실행 결과는 [그림 03]과 같습니다.


[그림 03] 파이썬 소스 결과


위의 소스를 차근차근 해석해봅시다.

enco는 초기화 변수

enco2는 126이 저장

enco3는 33을 저장

ck는 document.URL.substr(document.URL.indexOf('='));을 저장함


첫번째 for문 : CharCode를 (1,0)~(121,0)Rkwl enco에 저장합니다.

enco_함수 : enco에 저장된 CharCode를 반환해주는 소스입니다.


if문에 enco와 enco_함수를 통해 만들어진 문자열이 ck와 같다면 패스워드를 뱉어내는 구조입니다.


if문 안의 String을 개발자 도구에서 붙여넣게 되면 [그림 04]와 같은 문자를 뱉어내게 됩니다.


[그림 04] if문 결과


ck에는 현재 아무런 값도 붙어 있지 않았기 때문에, 맨 뒤에 =youaregod~~~~~~~!를 넣게 되면 답을 얻을 수 있게 된다.


[그림 05] 해답 구하기


'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.17(100) - old  (0) 2016.06.28
Webhacking.kr_No.16(100) - old  (0) 2016.06.28
Webhacking.kr_No.15(50) - old  (0) 2016.06.28
Webhacking.kr_No.14(100) - old  (0) 2016.06.28
Webhacking.kr_No.10(250) - old  (0) 2016.06.28
Webhacking.kr_No.06(100) - old  (0) 2016.06.28
Webhacking.kr_No.05(300) - old  (0) 2016.06.26
Webhacking.kr_No.04(150) - old  (0) 2016.06.22

+ Recent posts