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