[Webhacking.kr] 24번 문제풀이


오늘은 "Webhacking" 24번 문제를 풀었다. 밖의 날씨도 비가 오고 늦잠도 자버려서 점수 배점이 낮은 문제를 풀었다. 

(Webhacking 24번문제)

 

 

24번 문제에 들어가면 아래의 화면처럼 'client ip'와 'agent'가 보인다. 'agent' 옆을 보니 사용자의 환경을 뜻하는 것 같았고, 'client ip'는 난수가 들어가 있는 것처럼 보였다. 그리고 'Wrong IP!'까지 현 화면에서는 문제를 풀 수 없는 것들만 보였다. 

(24번 문제)

 

 

처음 화면에서는 아무것도 발견할 수 없어서 'view-source'에 들어가서 소스코드를 확인해보기로 했다. 아래 화면은 24번 문제의 소스코드이다.

(24번 소스코드)

 

 

문제를 풀기 위해선 소스코드를 해석해야한다.

 

소스코드 해석


1. extract 함수

해당 함수는 배열 속의 키의 값들을 변수화 시키는 것이다.

 

예를 들어 

$a[x] = "Hello";

$a[y] = "World";

extract($a);

 

echo $x;

echo $y;

 

결과 값은 "Hello World"가 출력되는 것이다.

 

사실 extract() 함수를 사용하지 않고 배열을 이용해서 출력할 수 있다. 

$a[x] = "Hello";

$a[y] = "World";

 

echo $a[x];

echo $a[y];

 

결과 값은 위와 같이 "Hello World"가 출력될 것이다.

  extract($_SERVER);
  extract($_COOKIE);

 

 

2. htmlspecialchars() 함수

해당 함수는 HTML 코드가 들어가는 특수 문자를 일반 문자로 인식되어 출력되게 하는 것이다.

 

'&' -> '&'

'"(큰 따옴표)' -> '&quit;'

''(작은따옴표)' -> '&#039'

'<' -> '&ltl'

'>' -> '&gt'

 

위에 써놓은 것처럼 HTML 코드가 들어오면 우리가 일반 문자로 바꿔주는 함수인데, 문제를 풀 때는 사용하지 않는 것 같다.

(문제에 풀 때 필요한 것이면 댓글로 알려주시겠어요?)

    $ip = htmlspecialchars($REMOTE_ADDR);

 

 

3. str_replace("1번","2번","3번") 함수

1번째 인수 : 변경 대상 문자

2번째 인수 : 변경하려는 문자

3번째 인수 : 변수 또는 문자열

 

즉, str_replce("노랭이", "키큰", "노랭이 라바")라고 할시 

'노랭이 라바' -> '키큰 라바'로 바뀌게 된다.

 

그러면  해당 소스코드는 아래와 같이 "ip" 값이 아래와 같이 바뀔 것이다.

'..' -> '.'

'12' -> ''

'7' -> ''

'0' -> ''

    $ip = str_replace("..",".",$ip);
    $ip = str_replace("12","",$ip);
    $ip = str_replace("7.","",$ip);
    $ip = str_replace("0.","",$ip);

 

 

4. 'ip'값이 127.0.0.1 일 경우 문제가 풀리게 된다.

  if($ip=="127.0.0.1"){
    solve(24);
    exit();
  }

 

 

 

문제 풀이


이제 본격적으로 문제를 풀기 위해서는 (나 같은 경우는 크롬을 사용했다.) 쿠키 하나를 추가시켜줘야 한다.

 

저는 "EditThisCookie"라는 확장 프로그램을 이용해서 'REMOTE_ADDR'를 추가시켰다.

 

추가시키는 방법은 아래와 같다. 일단 오른쪽 위에 있는 쿠키 모양의 아이콘을 클릭한다. 그다음 '+' 모양을 클릭한다. 그리고 추가하고 싶은 이름의 쿠키를 작성하면 끝이다.

'쿠키 아이콘 클릭' -> '+' 클릭 -> 추가하고 싶은 쿠키 이름 설정 후 '체크 표시' 클릭 

 

 

REMOTE_ADDR에 값을 넣어서 ip 값을 127.0.0.1이 출력되게 하려면 "112277...00...00...1"을 넣어주면 된다.

112277...00...00...1

빨간색으로 된 글자는 지워지게 되고, 회색 바탕으로 된 것은 '..' -> '.'로 바뀌게 된다. 그래서 아까 만들었던 REMOTE_ADDR 값에 112277...00...00...1 넣어주면 끝이다.

 

 

쿠키 값에 값을 넣고 'F5'을 눌러주면 아래와 같은 팝업창이 뜨게 된다.

(문제 해결)

 

'client ip' 값에는 127.0.0.1 이 출력되면서 100 point을 얻었다는 문장과 함께 문제를 풀었다.

(문제 해결)

 

 

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

'공부 > Webhacking' 카테고리의 다른 글

[Webhacking.kr] 26번 문제풀이  (6) 2020.03.08
[webhacking.kr] 6번 문제풀이  (4) 2020.03.04
[Webhacking.kr] 1번 문제풀이  (2) 2020.03.03

[Webhacking.kr] 26번 문제풀이


오늘은 "Webhacking" 26번 문제를 풀었다. 이 문제를 풀게 된 계기는 점수 배점도 낮고, 단순히 가운데 정도에 위치해 있기에 풀게 되었다.

("Webhacking"26번)

 

 

26번 문제에 들어가보면 검은색 바탕화면에 달랑 'View-source'만 존재한다.

(26번 문제)

 

 

그래서 'F12' 버튼을 눌러 'html'을 확인해봤지만, 아무것도 발견할 수 없었다.

(html 화면)

 

 

그러면 26번 문제를 풀려면 'view-source'를 확인해봐야 할 것이다. 바로 소스코드를 확인해봤다. 아래의 화면은 문제의 소스코드이다.

(26번 문제의 소스코드)

 

 

소스코드를 한번 해석해보았다.

<?php
  if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
  // id값에 admin이 발견되면 "no"가 출력된다.
  
  $_GET['id'] = urldecode($_GET['id']);
  // id의 값을 'urldecode' 한 값을 id에 넣는다.
  
  if($_GET['id'] == "admin"){ // 만약 id의 값이 'admin' 일 경우 실행한다.
    solve(26);  // 문제해결
  }
?>

 

 

"id"에 'urldecode' 하기 위해 인코딩 한 바이트 값을 넣어주면 되는 것이다. 

즉, 디코딩해서 'admin'이라는 단어를 출력하기 위한 인코딩 값을 넣어주면 되는 것이다.

 

 

소스해석이 끝나서 "id"에 인코딩한 값을 넣어주면 문제가 풀리게 되는데, 중요한 것은 "id"에 값을 어떻게 넣는 가? 였다.

 

 

id에 값 넣는 방법


소스코드를 전부 해석해서 답만 넣으면 끝인 줄 알았지만, 어떻게 넣는 지 모르니 난감했다. 어떻게 문제를 푸는지 고민을 하고 있을 때, 'view-source'를 보고 해결 방안을 찾았다.

 

 

아래의 소스코드도 'view-source'를 "GET"함수로 입력받는 것이다.

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?>

 

 

소스코드가 들어있는 'URL'을 확인해 보니, 아래의 화면처럼 "?view-source=1" 값을 넣어주면 되는 것이었다.

(GET 함수 이용한 방법)

 

 

그러면 나는 "?id=인코딩한값"을 넣어주면 문제를 풀 수 있다.

 

 

[해결]


id 값에 'URL-decode'을 해서 "admin"이 나오기 위한 인코딩 값은 "%61%64%6d%69%6e"이다. 아래의 'URL-encode 표'를 보면 쉽게 "admin"을 추출할 수 있을 것이다.

("URL-encode" 표)

 

 

그래서 id값에 ''%61%64%6d%69%6e"을 넣었다.

('id'에 %61%64%6d%69%6e 인코딩 값을 넣은 화면)

 

 

문제가 풀릴 줄 알았지만, 돌아오는 것은 답이 아닌 'no!' 였다.

("no!" 출력 화면)

 

 

소스코드를 정확하게 해석해서 문제를 풀었는데, 왜 "no!" 출력 됐는지 의아했다. 그래서 이번에는 인코딩 값을 넣은 것이 아닌 문자 그대로 'admin'을 넣어봤다.

('id'에 admin 문자 넣은 화면)

 

 

결과는 동일하게 'no!' 값이 출력되었다.

("no!" 출력 화면)

 

 

그래서 내 개인적인 생각으로는 브라우저(Browser)에서 자동으로 한번 디코딩을 해주는 것 같다.

다시말해서, 나는 ''%61%64%6d%69%6e"을 php에서 함수(URL-decode)를 통해 "admin" 으로 바뀌는 줄 알았지만,

동으로 ''%61%64%6d%69%6e"을 "admin"으로 바꿔서 함수(URL-decode)는 "admin" 값만 받게 돼 'no!'가 출력되는 것이다.

 

그러면 자동으로 한번 디코딩 해준다면 인코딩을 2번 한 값을 넣어주면 되는 것이다. 아래의 화면처럼 인코딩을 2번 한 값을 넣어주면 문제가 해결되는 것이다.

(두번 인코딩을 'id'에 값을 넣은 화면)

 

 

문제해결!

(문제 해결 화면)

 

문제해결!!

(문제 해결 문제)

 

 

 

[문제 풀이 도움]


인코딩을 두번하기 위해서는 사이트의 힘을 빌렸다.

아래의 사이트는 URL 인코딩, 디코딩을 자동으로 해주는 사이트이다!

https://www.convertstring.com/ko/EncodeDecode/UrlEncode

 

URL 인코딩 - 온라인 URL 인코더

 

www.convertstring.com

 

 

 

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

'공부 > Webhacking' 카테고리의 다른 글

[Webhacking.kr] 24번 문제풀이  (6) 2020.03.10
[webhacking.kr] 6번 문제풀이  (4) 2020.03.04
[Webhacking.kr] 1번 문제풀이  (2) 2020.03.03

[Webhacking.kr] 6번 문제풀이

webhacking 6번 문제의 배점이 100점이어서 한번 풀어보기로 했다.

(old-06 100점 문제)

 

6번 문제를 들어가 보면 아래의 화면이 보인다.

(Webhacking.kr 6번 문제)

ID와 PW 값이 있는 거 보니, 이것을 이용하는 문제일 것 같았다.

화면에 'view-source' 링크가 있어서 들어가 보았다.

아래의 화면은 'view-source'의 소스코드이다.

('view-source'의 소스코드)

소스코드가 한눈에 들어오지 않고 엄청 길다. 간단하게 해석해보자면 오른쪽 화면에 보이는 소스코드에서 decode_id의 값이 admin이고 decode_pw의 값이 nimda일때 문제가 해결되는 문제인 것 같다. 그러면 나는 Cookie에서 id와 pw 값에 정확한 값을 입력하면 문제를 풀 수 있을 것 같았다.

 

아래의 화면에서 for문을 보게 되면 id와 pw를 20번씩 base64_decode을 하는 것을 알 수 있다.

(for문)

그러면 나는 반대로 생각해봐야 할 것이다. base64_decode를 이용하지 않고 base64_encode를 20번 돌려야 할 것이다. 

id에는 "admin"을, pw에는 "nimda" 값을 입력해서 base64_encode를 20번 하면 될 것이다.

 

나는 PHPTester 사이트를 이용하여 php 구문을 실행시켜 보았다. 아래 PHPTester를 이용하면 php 구문을 쉽게 동작시켜 볼 수 있다.

http://phptester.net/

 

PHPTESTER - Test PHP code online

Lorem Ipsum alternative : gaddafipsum.com       This application is free so please don't break it ! Contact :phptester.net@gmail.com Result

phptester.net

 

아래의 화면은 id에 "admin"의 값을, pw에 "nimda"의 값을 넣어 base64_encode를 20번 한 것이다. 문제의 소스코드를 보면 !,@,$,^,&,*,(,) 와 같은 문자를 치환할 수 있기에 base64_encode이 끝나면 곧바로 치환 할 수 있게 코드를 수정했다. 

(왼쪽화면 id를 20번 encode, 오른쪽 화면 pw를 20번 encode)

php 구문의 코드를 돌리고 화면에서 보이는 'Click to test your php code'를 누르면 내가 짠 코드가 실행된다. 출력된 값을 Cookie 값에 'user' 값과 'password' 값에 넣으면 된다.

 

('admin'을 20번 base64_encode 한 값)
('nimda'을 20번 base64_encode 한 값)

 

위의 화면 처럼 Cookie 값에 base64_encode 한 값을 넣으면 아래의 화면처럼 문제가 해결됐다고 출력된다.

(old-06 Pwned 화면)
(100point 획득 화면)

 

[시행착오]

처음에는 100점짜리 문제여서 가볍게 생각하고 접근했다. 소스 코드에서 'user'값에 admin이을 'password'값이 nimda을 넣으면 쉽게 풀 수 있을 줄 알았다.

(잘못된 값을 넣었을 때 화면)

잘못된 값을 넣으니 위의 세번째 화면처럼 ID와 PW에는 아무런 변화가 없었다. 이번 문제는 어제 풀었던 문제보다 쉽게 생각해서 접근을 했더니, 문제의 접근 방법이 잘 못 되었던 것 같다. 또한 이번 기회에 'PHPTester'라는 사이트를 알게 되어서, 간단한 php 구문을 어렵지 않게 동작시킬 수 있었다. 

아무리 배점이 낮은 문제일지라도 가볍게 생각하면서 문제를 풀면 안되는 것일 이번 기회에 알게 되었다.

 

 

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

'공부 > Webhacking' 카테고리의 다른 글

[Webhacking.kr] 24번 문제풀이  (6) 2020.03.10
[Webhacking.kr] 26번 문제풀이  (6) 2020.03.08
[Webhacking.kr] 1번 문제풀이  (2) 2020.03.03

[Webhacking.kr] 1번 문제풀이

Webhacking 문제를 처음 들어가면 아래와 같은 화면이다. 처음에 보이는 화면은 'level : 1'과 'view-source' 밖에 없다. 1번 문제에서 특이한 점은 링크로 연결되어 있는 'view-source'를 클릭해보기로 했다.

(1번 문제 화면)

'view-source'를 들어가보면 아래와 같은 소스코드를 볼 수 있다.

('view-source' 소스코드)

 

php로 구성되어있는 해당 소스코드는 php구문을 잘 모르지만 알고 있는 선에서 해석해보기로 했다. 

 

(첫번째 문장)

php 아래에 있는 부분에서 첫번째 문장인 is_numeric()은 숫자형 데이터 값인 경우 'true'를 반환하고, 숫자형 데이터 값이 아닌 경우 'false'를 반환하는 함수이다. 그래서 Cookie 값을 숫자를 넣어야지만 문제를 풀 수 있을 것 같았다. 

 

(두번째 문장)

두번째 세번째 문장에서는 Cookie 값에 'user_lv' 값이 6보다 크거나 같을 경우 'user_lv'값을 1을 반환하고, 5보다 큰 값을 넣을 때 문제가 해결된다는 것을 알 수 있다. 

 

(세번째 문장)

마지막 문장에서는 level 옆에 있는 값은 Cookie에서 'user_lv' 값을 넣어준 값을 출력해주는 것을 알 수 있다.

그래서 나는 Cookie 값에 'user_lv'에 4,5,6 이라는 값을 넣어보기로 했다.

(Cookie에서 'user_lv'에다가 4를 넣었을 때)

'user_lv'에 4를 넣었을 때, level 옆 값이 4로 바뀌는 것을 알 수 있다.

 

(Cookie에서 'user_lv'에다가 5를 넣었을 때)

'user_lv'에 5를 넣었을 때, level 옆 값이 5로 바뀌는 것을 알 수 있다.

 

(Cookie에서 'user_lv'에다가 6를 넣었을 때)

'user_lv'에 6를 넣었을 때, level 옆 값이 1로 바뀌는 것을 알 수 있다. 왜냐하면 php 첫번째 문장에서 'user_lv' 값에 6을 넣을 시 'user_lv' 값이 1로 바뀌도록 소스 코드가 짜여있기 때문이다.

 

소스코드에서 5보다 큰 값을 넣었을 때, 문제가 해결된다고 했는 데, 정수로는 문제가 풀리지 않았다. 그래서 Cookie 값에 5.1이라는 실수 값을 넣었더니 아래의 화면처럼 200point를 얻으면서 문제가 해결됐다.

(문제 해결 화면)

 

 

[해결방안]

[webhacking] 1번 문제를 풀기 위해서는 Cookie 값을 임의로 설정 할 수 있는 툴을 이용해야한다. 나는 크롬에서 사용할 수 있는 "Edit This Cookie" 툴을 이용했다. 아래의 링크를 통해 Cookie 툴을 다운받아서 설치 할 수 있다.

https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ko

 

EditThisCookie

EditThisCookie는 쿠키 관리자입니다. 이것을 이용하여 쿠키를 추가하고, 삭제하고, 편집하고, 찾고, 보호하거나 막을 수 있습니다!

chrome.google.com

해당 툴을 다운받으면 쿠키 모양의 아이콘이 크롬 오른쪽 위에 생성이 된다. 아래의 화면 처럼 쿠키 모양의 아이콘이 생성된 것을 확인 할 수 있다.

(Cookie 아이콘 생성 화면)

처음에 문제를 해결할 때 'user_lv' 값에 정수값만 넣는 것을 생각했다. 하지만 해당 문제는 실수의 범위까지 생각하게끔 만들었다. 단순하게 생각해서 문제를 풀었던 나에게 좋은 경험을 안겨주었다. 다음에 문제를 풀때 넓은 방면에서 접근해서 풀어야겠다.

 

*해당 블로그는 개인적인 공부와 정보 공유를 위해 만들었습니다.

'공부 > Webhacking' 카테고리의 다른 글

[Webhacking.kr] 24번 문제풀이  (6) 2020.03.10
[Webhacking.kr] 26번 문제풀이  (6) 2020.03.08
[webhacking.kr] 6번 문제풀이  (4) 2020.03.04

+ Recent posts