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

+ Recent posts