다음과 같이 나와서 페이지 소스를 먼저 보았다.

   

   

unlock 계산한 10 나눈 것이 정답이다.

   

콘솔을 통해 계산해 주자.

   

   

이것을 10으로 나눈 999780930.7 답이다.

   

다음과 같이 문제가 풀렸다.

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 26번  (0) 2016.09.01
webhacking.kr 6번  (0) 2016.09.01
webhacking.kr 14번  (0) 2016.09.01
webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01

다음과 같은 창이 나와 눌러보았다.

   

다음과 같이 코드가 나왔다.

   

이것을 해석해 보면 먼저 get방식으로 받은 id변수값이 admin인지 검사하여 참이면 no! 출력한 종료되게 한다. - (1

   

그리고 id변수값을 urldecode 주어 id변수에 다시 저장한다.

   

urlencode url 통해 데이터를 전송하고자 인코딩을 해야 하는 경우에 사용된다. urlencode()함수는 인자로 전달받은 문자열 데이터를 16진수 ASCII코드로 변환하고 앞에 %기호를 붙인 형식으로 인코딩하여 반환한다.

   

값이 "admin" 같으면 문제가 해결된다.

   

   

문제를 풀기 위해서는 admin urlencode 놓는다면 (1 걸리지 않고 $_GET[id] 값이 admin 되어 문제가 풀린다.

   

   

다음 표에 맞춰서 url인코딩을 하였다.

   

admin -> %61%64%6d%69%6e

   

이때 주의해야 점은 url 인코딩 값을 적어 넣을 웹브라우저에서 디코딩 상태로 인식되므로 인코딩 주어야 문제가 풀린다.

   

admin -> %61%64%6d%69%6e -> %2561%2564%256d%2569%256e

   

다음과 같이 문제가 풀렸다.

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 17번  (0) 2016.09.01
webhacking.kr 6번  (0) 2016.09.01
webhacking.kr 14번  (0) 2016.09.01
webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01

이미 문제를 풀어 다음과 같이 나와 있지만 원래

ID : guest

PW : 123qwe

였다.

   

index.phps 눌러 보자.

   

php문에서는, guest 123qwe $val_id 변수와 $val_pw 변수에 넣었다.

   

그리고 base64 20 encode 다시 변수에 저장하였다.

   

변수에 저장된 문자들을 다음과 같이 치환하였다.

   

   

값을 쿠키에 저장하고 php문이 끝나게 된다.

   

   

2번째 php문에서는 첫번째 php문에서 수행한 코드를 반대로 수행하게 된다.

   

쿠키의 값을 변수에 담아 첫번째 php에서 치환한 것과 반대로 치환한 base64 20 디코딩하였다.

   

값이 admin이면 문제가 해결된다.

   

   

문제를 풀기 위해 쿠키에 저장되어 있는 값을 guest 아닌 admin으로 변조해 주어야 한다.

   

그러기 위해서는 번째 php문에서 $val_id, $val_pw 들어간 문자열이 admin이라고 생각한 그곳에서 실행된 코드를 수행한 결과값을 쿠키에 저장해야 한다.

   

   

먼저 admin base64 20 인코딩 했다.

   

그리고 나온 값을 문자열 치환해 주기 위해 c언어로 스크립트를 작성하였다.

   

   

다음 코드로 문자열 치환한 결과값을 쿠키에 넣어주었다.

   

결과 다음과 같이 문제가 풀렸다.

   

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 17번  (0) 2016.09.01
webhacking.kr 26번  (0) 2016.09.01
webhacking.kr 14번  (0) 2016.09.01
webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01

다음과 같은 창이 나왔다. 코드를 살펴보자.

   

   

다음 코드에서, 우리가 눈여겨 보아야 부분은 javascript 쓰여진 function문이다.

   

function 문을 해석해 보면 페이지의 url 변수에 저장한 ".kr" 인덱스 값을 ul변수에 넣어, 30 곱한다.

   

그리고 값과 입력한 값이 일치한다면 Password 출력하는 형식인데, Password ul변수와 우리가 입력한 값의 곱인 것을 있다.

   

그렇다면, 일단 ul변수 값에 들어간 값이 몇인지 알아보자.

   

크롬의 개발자 도구 콘솔창을 사용한다면 변수 값을 쉽게 사용할 있다.

   

변수 ul 510 들어가 있는 것을 있다.

   

따라서 password 260100 것이다.

   

문제가 풀린 것을 있다.

   

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 26번  (0) 2016.09.01
webhacking.kr 6번  (0) 2016.09.01
webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01
webhacking.kr 4번  (0) 2016.09.01

다음과 같은 창이 나와 index.phps 들어가 보았다.

   

나온 코드 php 부분만 가져왔다.

   

먼저 코드에서 eregi 함수를 통해

" ,/,\(,\),\t,\|,&,union,select,from,0x"

같은 문자열이 있으면 종료되게 하였다.

   

$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]")); 

   

if($q[0]=="guest") echo ("hi guest"); 

if($q[0]=="admin"

@solve(); 

echo ("hi admin!"); 

   

코드에서는, no 받아온 것을 통해 쿼리문을 완성하여 받아온 값이 guest이면 'hi guest' 출력하고 admin이면 문제가 풀리게 되어 있다.

   

select id from challenge18_table where id='guest' and no=$_GET[no]

   

no 받아올 인젝션 시켜서 다음 id admin으로 인식되도록 만들어야 한다.

   

일단 입력 창에 여러가지 값들을 넣어 보았다.

1 넣자 hi guest 나왔다.

no 2이면 admin 것이라고 유추하고 문제를 풀어 보자.

   

만약 쿼리문이

select id from challenge18_table where id='guest' and no=123 or no=2

같이 되어 있다면 게스트 로그인에 실패하고 admin 계정으로 로그인 것이다. 하지만 여기엔 공백이 들어가 있으므로 공백 우회가 필요하다.

   

공백 우회의 방법은 여러 가지가 있다.

   

1. tab - %09

2. line feed(\n) - %0a

3. carrage return(wr) - %0d

4. 주석 - /**/

5. 괄호 - ()

6. 더하기 - +

   

공백 우회를 이용하여 값을 입력해 보자.

   

   

결과 문제가 풀린 것을 확인할 있다.

   

다른 방법으로 풀어 보자.

쿼리문을

select id from challenge18_table where id='guest' and no=1 or no=2 limit 1,1

다음과 같이 전달해 주어도 문제가 풀릴 것이다.

guest 계정이 no=1 인해 참이 되고, admin계정이 no=2 인해 참이 되어서 guest admin 결과값이 배열에 차례로 들어가게 된다.

   

이런 경우 admin 값만 선택하기 위해서 limit구문을 사용한다.

   

여기에 공백 우회를 적용하여 값을 입력해 보자.

   

   

역시 문제가 풀린 것을 있다.

   

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 6번  (0) 2016.09.01
webhacking.kr 14번  (0) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01
webhacking.kr 4번  (0) 2016.09.01
Webhacking.kr 39번  (1) 2016.07.10

다음과 같은 창이 나온다. 소스코드를 보자.

코드를 보고 문제 화면에서 100, 97, 119, 115 아스키코드표에 대응하는 문자 d, a, w, s 키를 누르면 이쁜 별이 나오는 것을 있다.

마우스 오버를 하면 별이 사라진다.

   

이떄 124 아스키코드표에 대응하는 문자 | 누르면 답이 나온다.

   

   

문장에서 문자 번호를 진짜 문자로 바꾸는 fromCharCode 함수를 이용해 124 | 바꾼 현재페이지에서 수를 합친 것에 해당하는 주소로 이동시킨다.

   

다음과 같이 웹페이지가 이동되어 비밀번호가 나타났다.

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 14번  (0) 2016.09.01
webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 4번  (0) 2016.09.01
Webhacking.kr 39번  (1) 2016.07.10
Webhacking.kr 15번  (0) 2016.07.08

4번을 들어가 보면 다음과 같이 암호화 되어 있는 걸로 보이는 문장이 나온다.

base64에는 bit수를 맞춰주기 위해 '='(padding) 들어가는데, 코드 뒤에 == 들어간 보아 base64라고 유추할 있다(base64 대한 자세한 내용은 암호 카테고리에서 있다).

   

base64 Decode 보니 다음과 같은 문자열이 나왔다. 문자열은 느낌상 16진수 해쉬 같다.

16진수 해쉬 40자리의 해시 함수를 찾아보니 sha1 있어 sha1으로 2 해독하니 답이 나왔다.

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01
Webhacking.kr 39번  (1) 2016.07.10
Webhacking.kr 15번  (0) 2016.07.08
Webhacking.kr 1번  (7) 2016.07.07

39번을 들어가 보면 다음과 같은 화면이 나온다.

페이지 소스를 보자. 중요한 php문은 나와있지 않다.

주석이 달린 index.phps를 주목해 보자. Php로 구성되어 있는 홈페이지에서 소스를 보기 위해서는 php 뒤에 s를 붙이면 된다. Phps는 서버 설정에서 addtype로 .phps를 php소스로 정의했을 경우에만 볼 수 있는데, 이것은 설정에서 비활성화 하여 해결이 가능한데, 개발자의 실수로 인해 phps를 이용하여 php소스를 볼 수 있는 경우가 있다.

이 문제에서는 주석을 통해 그런 취약점의 힌트를 알려주고 있다.

이제 index.phps를 주소에 적어 php 소스를 확인해 보자.

다음과 같이 코드가 나왔다.

다음 php 코드를 해석해 보자.

 


$_POST[id]=str_replace("\\","",$_POST[id]);
$_POST[id]=str_replace("'","''",$_POST[id]);

 

Str_replace 함수는 str_replace ( mixed $search , mixed $replace , mixed $subject [,int &$count ] )

다음과 같이 사용하는데, subject에서 발견한 모든 search 주어진 replace 값으로 치환한 문자열을 반환한다.


$_POST[id]=substr($_POST[id],0,15);

 

substr함수는

substr ( string $string , int $start [, int $length ] )

다음과 같이 사용하는데, start length 의해 잘려진 문자열을 반환한다.


$q=mysql_fetch_array(mysql_query("select 'good' from zmail_member where id='$_POST[id]"));

 

Mysql_fetch_array함수는 행을 배열로 반환한다.



if($q[0]=="good") @solve();

 

열에서 받은 q q[0] good이면 문제가 해결된다.

 

php문을 해석한 것을 바탕으로 어떻게 문제를 생각해 보자.

자세히 보면, q값에 배열을 넣을 , sql쿼리문 id='$_POST[id]" 부분이 오류가 난다.

이때 우리가 주어야 것은 $_POST[id] good 넣으면서, 오류가 나지 않게 해야 것이다.

다음과 같이 good 입력하고 공백을 10, 그리고 ' 넣는다면 ' '' 바뀌어도 15번째까지 문자열을 자르므로 ' 하나만 변수에 입력되어 q[0]값이 good 것이다.

문제가 풀린 것을 확인할 있다.

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01
webhacking.kr 4번  (0) 2016.09.01
Webhacking.kr 15번  (0) 2016.07.08
Webhacking.kr 1번  (7) 2016.07.07

15번 문제를 눌러보았다.

이런 화면이 뜨고, 확인을 누르면 다시 webhacking.kr 화면으로 돌아간다.

아무래도 페이지 소스코드를 봐야 할 것 같다. 그렇지만 alert가 떠 있는 상태에서는 페이지 소스보기를 할 수 없다.

이때 소스코드를 보는 방법은 2가지가 있다.

 

첫번째 방법은 자바스크립트를 꺼버리는 것이다.

크롬을 사용하고 있으니 크롬을 기준으로 설명하겠다. 크롬 설정을 들어간 후 고급 설정을 클릭한다.

그리고 개인 정보의 콘텐츠 설정을 클릭하면 자바스크립트 항목을 확인할 수 있다. 그 중 모든 사이트에서 자바스크립트 허용 안함에 체크한 후 완료를 누르고 페이지를 새로고침 한다.

그 후 문제를 다시 눌러보자.

자바스크립트가 실행되지 않아 아무 창도 뜨지 않은 화면을 볼 수 있다.

여기서 페이지 소스보기를 해 보자.

다음과 같이 15번 문제의 소스가 나온 것을 볼 수 있다.

history.go(-1);이 실행되면 이전 페이지로 돌아가게 된다. 그래서 페이지 소스를 볼 수 없었다.

그리고 password is off_script를 보아 비밀번호가 off_script라는 것을 알 수 있다.

 

두번째 방법은 url을 이용하는 것이다.

처음 15번 문제를 실행했을 때 url을 유심히 보자.

이 url을 외워 두자

url앞에 view-source: 를 입력하면 자바스크립트가 실행되지 않고 페이지 소스를 볼 수 있다.

새 인터넷 창에 다음과 같이 입력해보자!

그러면 페이지의 소스가 나와 아까같이 비밀번호를 확인할 수 있다.

 

그럼 이제 알아낸 비밀번호를

이 중 auth를 눌러 입력하면 된다.

문제를 이미 풀어 다음과 같은 창이 뜬 것을 볼 수 있다.

 
 
 

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01
webhacking.kr 4번  (0) 2016.09.01
Webhacking.kr 39번  (1) 2016.07.10
Webhacking.kr 1번  (7) 2016.07.07

여기 index.phps에 진입한다.

다음과 같은 소스코드가 나오는데, 이 중 php문을 해석해 보자.



if(eregi("[^0-9,.]",$_COOKIE[user_lv])) $_COOKIE[user_lv]=1;


먼저, eregi함수는 문자를 찾는 함수이다. $_COOKIE[user_lv] 변수가 0~9사이의 숫자와 마침표를 제외한 다른 문자이면 1 반환한다.

, 0~9사이의 숫자와 마침표를 제외한 숫자가 $_COOKIE[user_lv] 들어가 있으면 조건문이 실행되어 $_COOKIE[user_lv] 1 초기화된다.


if($_COOKIE[user_lv]>=6$_COOKIE[user_lv]=1;

 

조건문에서는 쿠키 레벨이 6보다 크면 $_COOKIE[user_lv] 1 초기화시킨다.



if($_COOKIE[user_lv]>5) @solve();

 

조건문을 보면, $_COOKIE[user_lv] 5보다 크면 solve();함수가 발동되는 것을 확인할 있다. @ 에러가 나도 에러 내용을 출력하지 않는다는 뜻이다.


따라서 0~9사이의 문자와 마침표 문자가 포함될 있는 6보다 크지 않고 5보다 문자로 쿠키를 변조해 주면 된다. 문자를 5.5 잡고 보았다.

크롬의 EditThisCookie 설치하여 쿠키값을 5.5 변조해 주었다.

그러자 문제가 풀렸다. 이미 문제를 풀어 다음과 같은 화면이 나온 것을 있었다.

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01
webhacking.kr 4번  (0) 2016.09.01
Webhacking.kr 39번  (1) 2016.07.10
Webhacking.kr 15번  (0) 2016.07.08

+ Recent posts