ile Inclusion 취약점으로 RFI(Remote File Inclusion)과 LFI(Local File Inclusion)에 대해 알아보자.

일단, RFI나 LFI 취약점이 존재하는지 확인하려면 다음과 같이 파라미터 입력 부분에 ../를 넣어 확인한다.
취약점이 존재하는 경우, 다음과 같은 include 오류가 뜬다.

  

그럼 이제, LFI와 RFI에 대해 자세히 알아보자.

LFI(Local File Inclusion) 취약점

  1. LFI(Local File Inclusion) 취약점이란?
공격 대상 서버에 위치한 파일을 포함시켜 읽어오는 공격  
  • php 코드상에서 include() 사용 시 input에 대한 적절한 필터링이 이루어지지 않아 발생하는 취약점
  • 일반적으로 포함시키는 파일명
    • /etc/httpd/logs/access.log
    • /etc/httpd/logs/access_log
    • /etc/httpd/logs/error.log
    • /etc/httpd/logs/error_log
    • /opt/lampp/logs/access_log
    • /opt/lampp/logs/error_log
    • /usr/local/apache/log
    • /usr/local/apache/logs
    • /usr/local/apache/logs/access.log
    • /usr/local/apache/logs/access_log
    • /usr/local/apache/logs/error.log
    • /usr/local/apache/logs/error_log
    • /usr/local/etc/httpd/logs/access_log
    • /usr/local/etc/httpd/logs/error_log
    • /usr/local/www/logs/thttpd_log
    • /var/apache/logs/access_log
    • /var/apache/logs/error_log
    • /var/log/apache/access.log
    • /var/log/apache/error.log
    • /var/log/apache-ssl/access.log
    • /var/log/apache-ssl/error.log
    • /var/log/httpd/access_log
    • /var/log/httpd/error_log
    • /var/log/httpsd/ssl.access_log
    • /var/log/httpsd/ssl_log
    • /var/log/httpd_log
    • /var/www/log/access_log
    • /var/www/log/error_log
    • /var/www/logs/access.log
    • /var/www/logs/access_log
    • /var/www/logs/error.log
    • /var/www/logs/error_log
    • C:\apache\logs\access.log
    • C:\apache\logs\error.log
    • C:\Program Files\Apache Group\Apache\logs\access.log
    • C:\Program Files\Apache Group\Apache\logs\error.log
    • C:\program files\wamp\apache2\logs
    • C:\wamp\apache2\logs
    • C:\wamp\logs
    • C:\xampp\apache\logs\access.log
    • C:\xampp\apache\logs\error.log
    • C:\APM_Setup\Server\Apache\logs\error.log
    • C:\APM_Setup\Server\Apache\logs\access.log

2. 공격 방법
        1) 공격이 가능한지 확인한다. (파라미터에 ../등을 삽입하여 에러메시지 확인)
          2) 파라미터에 원하는 파일의 경로 삽입
                ex) c:\apm_setup\Server\apache\logs\access.log


하지만..!
LFI 취약점을 이용해서 php.ini 파일을 include 시키려고 하면...?
다음과 같이 parse 에러가 난다.

왜???

php.ini 파일의 77번째 라인을 찾아가면 다음과 같은 설명글이 있다...


정확히 왜 때문에 발생하는 parse 에러인지 이해는 가지 않지만 받아올 수 있는 방법은 있다!
아마.. include하는데 <?가 중복 포함되서 제대로 include가 안되는 거 같당...(정확히 모르겠음)

  1. PHP Wrappers 사용한 LFI
           여러 종류의 PHP Wrapper 사용이 가능하지만 가장 많이 시도되는 것이 base64 인코딩을 이용한 방법이다. 
            (다른 종류의 PHP Wrapper가 궁금하다면 https://hakin9.org/web-application-penetration-testing-local-file-inclusion-lfi-testing/ 참조)
           이 때, 응답값 내 base64로 인코딩된 파일 컨텐츠를 반환한다!
         
               php://filter/convert.base64-encode/resource=[파일경로]

            1) php://filter/convert.base64-encode/resource=c:\apm_setup\php.ini 요청


            2) 응답값 내 base64로 인코딩된 값 확인



            3) base64 디코딩



PHP에서 세션을 저장하는 원리나 어디에 저장하는 지 등에 대해 한번도 생각해 본적이 없었는데.. 
PHP가 세션값을 서버의 특정 경로에 저장했다가 세션을 파기한다고 한다

    - 일단, Session을 생성시키기 위해 로그인 과정을 진행한다
            ** 대락 다음과 같은 코드가 있어야 session 생성 가능
                    
                       <?
session_start();
$_SESSION['user_id'] = $user_id;
$_SESSION['user_name'] = $members[$user_id]['name'];
?>

    정상적으로 로그인에 성공하면 $user_id랑 $members를 $_SESSION의 변수로 등록하여 세션을 구현한다.
    
    일단, session_start() 함수가 호출이 되면 client 측의 브라우저에는 PHPSESSID로 시작하는 세션 토큰이 생긴다.



    그러면 이런 정보를 서버는 어떻게 저장하고 처리할까?

   session_start()가 호출되면 서버는 PHPSESSID를 생성하여 설정된 경로에 "sess_PHPSESSIONID"라는 파일을 생성한다.
   이 때, 파일 안에는 아무값도 저장하지 않으며, 해당페이지에서 세션값이 필요 없는 서비스만 이용이 가능하다.

    


  이 때, 정상적으로 로그인이 이루어지면 파일안에 $user_id와 $members 정보를 저장한다.

   



! 참고 !

session값을 저장하는 경로는 php.ini 설정파일에서 수정이 가능하다.
나의 경우, C:\APM_Setup\temp\session으로 설정하여 해당 파일 내에 저장되는 것!!

** session.save_path를 설정하는 여러가지 방법에 대해 설명하고 있는데
   session.save_path="N;/path"  로 설정하면 설정한 경로내에 session 파일을 몇개까지 저장할 것인지 설정이 가능하다. (N은 정수)
** default로 session.save_path="/" 로 설정되어있음.



이제, 로그아웃 시 세션을 삭제하는 과정을 살펴본다.
세션을 삭제하려면 session_destroy()가 호출되어야 한다.
    ** 대략 다음과 같은 코드가 있어야 세션 삭제 가능 

<?php
session_start();
session_destroy();
?>

정상적으로 session_destroy()가 호출되면 해당 파일안에 저장된 정보를 삭제하고 다시 빈파일이 된다.




php를 이용하여 웹어플리케이션을 구동하는 가장 쉬운 방법은 apmsetup을 이용하는 것이다.
현재는 공식으로 다운로드 받을 수 있는 http://www.apmsetup.com 홈페이지가 이상한 곳으로 리다이렉트되는 것으로 보아 더이상 서비스를 하지 않는것 같다..

APM Setup이란?

Apache, PHP, MySQL의 줄임말로서 웹어플리케이션 구성 시 가장 많이 사용하는 구성이기도 하다. 
본래는 각각의 프로그램을 다운받아 설치 및 설정해야 하지만, apmsetup.exe 파일을 통해 쉽게 한번에 처리가 가능하다.

검색해본 결과, 2010년 01월 03일 이후 개발자가 업데이트를 중지하면서 홈페이지를 폐쇄했다고 한다.. 
그래도 마지막 버전을 인터넷상에서 다운로드 받을 수 있으니 설치 가능하다.
(필요하신 분은 비댓주세요. 이메일 보내드릴게용 😃 )


APM Setup 설치

모든것을 한번에 설치하도록 되어있기 때문에 설치가 매우 간단하다. 
특별한 경우를 제외하고는 설치 시 모든 것을 디폴트로 해놓고 진행하면 되지만 자세한 설명이 필요한 경우, 아래 캡쳐를 참고하면 된다.
  • 일단 나의 경우는 VMware에 윈도우7(32bit)를 올리고 진행했다.

  1. 설치파일 클릭 후, 언어를 선택한다 (대부분 Korean 선택할 것이라 생각하고 진행함)


  1. [다음] 클릭


  1. [동의함] 클릭

  1. [APM_Setup 7 Default Data] 선택 후, [다음] 클릭

  1. 설치 폴더 지정 후, [설치] 클릭 (설치하는데 다소 시간이 걸림)


  1. 방화벽에서 액세스 허용 메시지가 뜨면 허용하기

  1.  [APMSETUP 7 for win32 실행하기]만 체크 표시하고 [마침] 클릭 (readme 파일은 굳이 볼 필요없음...)

  1. APMsetup monitor를 통한 정상동작 확인

  1. localhost나 127.0.0.1로 들어가서 설정 경로 확인 가능





+ Recent posts