본문 바로가기
워게임/wechall

[wechall challenge] PHP 0817

by B T Y 2019. 7. 10.
반응형

[wechall challenge] PHP 0817

 

 

 

 

 

PHP 0817.rtf
7.05MB

 

 

 

- Explanation -



코드 위에 나와있는 설명을 보게 되면 LFI 취약점이 있다고 적혀있다. LFI(Local File Inclusion) 취약점은 공격대상 서버에 위치한 파일을 포함 시킬때 사용한다. PHP의 경우 Include, require_once, ... 같은 함수를 사용하면서 입력 값을 필터링 하지 않을때 이러한 취약점이 나타나게 된다.

해당 코드를 보게 되면 isset() 함수를 이용해서 GET방식을 통해서 which라는 파라미터가 있는지 확인을 하고 있고, 해당 파라미터가 존재 한다면 if 문이 실행 되도록 되어있다. if문 안쪽을 살펴보게 되면 which 파라미터에 값을 $which 변수에 저장해서 switch문을 실행 한다. switch문을 잘 살펴보면 case 0과 case 1 부분에는 break; 가 없는 것을 볼 수 있고, 그렇다면 해당 switch문이 실행 되면 case 2에 있는 코드까지 실행이 된 후에 switch문을 빠져 나오게 된다. 그러면 case 2에 있는 코드가 실행 되는데 이때 require_once $which.'.php'; 코드에 $which 부분이 처음에 GET 방식으로 넘겨 받았던 which 파라미터의 내용으로 바뀌면서 해당 되는 php 페이지를 include하고 적용 시키게 된다.

밑에 있는 News, Forum, Guestbook을 하나씩 클릭할 때마다 which 파라미터에 값이 0, 1, 2로 바뀌는걸 볼 수있는데, 해당 파라미터 값이 바뀌면 다른 페이지로 넘어간다는 걸 알 수 있다.

그렇다면 solution.php 페이지로 이동을 하기 위해서는 which 파라미터에 solution이라는 값을 넘겨주게 되면 require_once $which.'.php';에서 $which의 값이 solution으로 바뀌게 되면서 solution.php를 include 하면서 해당 문제가 풀리게 된다.

 

 

※ require_once 함수의 경우 이미 include 되어있다면 다시 include 되지 않는다.
   이미 되어있는 경우에도 계속해서 include를 하길 원하면 require_once 대신에 
    require 함수를 사용하면 가능하다. ( 밑의 코드를 보면 이해 가능하다 )



require_once may not work correctly inside repetitive function when storing variable for example:

file: var.php

<?php

$foo = 'bar';

?>



file: check.php
<?php

  function foo(){
      require_once('var.php');
      return $foo;
  }

  for($a=1;$a<=5;$a++){
    echo foo()."<br>";

  }

?> 

 

> file: check.php
result: 
bar
<empty line>

<empty line>

<empty line>

<empty line>

 



to make sure variable bar available at each function call, replace require once with require. eg situation: https://stackoverflow.com/questions/29898199/variables-not-defined-inside-function-on-second-time-at-foreach

Solution:

file: check2.php
<?php

function foo(){
    require('var.php');
    return $foo;
}

for($a=1;$a<=5;$a++){
    echo foo()."<br>";
}

?>


> php check2.php
result:
bar
bar
bar
bar
bar

 

 

반응형

댓글