CTF/웹해킹

[HackingCampCTF] World Wide Web - 웹해킹 / LFI

SecurityMan 2023. 4. 28. 11:00

 

웹해킹 문제

 

문제 푸는동안 캡쳐을 제대로 하지 못했다.

 

phpmyadmin 의 취약점과 관련된 문제이다.

 

반응형

 

첫 부분을 캡쳐를 못했는데

 

문제페이지에 접속해보면 어떤 사진 하나가 덩그러니 있다.

 

F12를 눌러 개발자 도구를 살펴보면 

 

이미지의 alt 값이 /phpMyAdmin 으로 되어있는데

 

이걸 통해서 /phpMyAdmin 이라는 경로가 있다는 것을 알아냈다.

 

주소창에 /phpMyAdmin 을 입력해서 들어가보면

 

로그인 창이 하나 나오는데

 

역시나 F12 를 눌러 개발자도구를 확인해보면

 

id 가 wwwweb, pw 가 wwwweb!@# 인것을 확인할 수 있었다.

 

 

아이디, 비밀번호를 입력하면

 

이렇게 정상적으로 로그인이 된다.

 

 

phpMyAdmin 의 버전을 확인해보니

 

4.8.1 이었는데,

 

해당 버전은 LFI 할 수 있는 취약점이 있었다.

(https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-12613)

 

해당 취약점은 LFI 로 RCE 까지 할 수 있는 위험한 취약점이다.

 

public static $goto_whitelist = array(
    'db_datadict.php',
    'db_sql.php',
    'db_events.php',
    'db_export.php',        
    'db_importdocsql.php',
    'db_multi_table_query.php',
    'db_structure.php',
    'db_import.php',
    'db_operations.php',
    'db_search.php',
    'db_routines.php',
    'export.php',
    'import.php',
    'index.php',
    'pdf_pages.php',
    'pdf_schema.php',
    'server_binlog.php',
    'server_collations.php',
    'server_databases.php',
    'server_engines.php',
    'server_export.php',
    'server_import.php',
    'server_privileges.php',
    'server_sql.php',
    'server_status.php',
    'server_status_advisor.php',
    'server_status_monitor.php',
    'server_status_queries.php',
    'server_status_variables.php',
    'server_variables.php',
    'sql.php',
    'tbl_addfield.php',
    'tbl_change.php',
    'tbl_create.php',
    'tbl_import.php',
    'tbl_indexes.php',
    'tbl_sql.php',
    'tbl_export.php',
    'tbl_operations.php',
    'tbl_structure.php',
    'tbl_relation.php',
    'tbl_replace.php',
    'tbl_row_action.php',
    'tbl_select.php',
    'tbl_zoom_select.php',
    'transformation_overview.php',
    'transformation_wrapper.php',
    'user_password.php',
);

 

사용자 입력값에 대한 검증이 미흡한점을 노려

 

위에 있는 whitelist 에 있는 페이지들을 이용해서 공격한다.(ex. db_sql.php)

 

public static function checkPageValidity(&$page, array $whitelist = [])
{
   if (empty($whitelist)) {
       $whitelist = self::$goto_whitelist;
   }
   if (! isset($page) || !is_string($page)) {
       return false;
   }

   if (in_array($page, $whitelist)) {
       return true;
   }

   $_page = mb_substr(
       $page,
       0,
       mb_strpos($page . '?', '?')
   );
   if (in_array($_page, $whitelist)) {
       return true;
   }

   $_page = urldecode($page);   // url decoding 
   $_page = mb_substr(
       $_page,
       0,
       mb_strpos($_page . '?', '?')
   );
   if (in_array($_page, $whitelist)) {
       return true;
   }

   return false;
}

 

db_sql.php? 와 같이 입력해 checkPageValidity() 를 

 

bypass 하기에 LFI 가 가능하다.

 

 

문제 설명에서 플래그가 있다고 말한 /tmp/flag 파일을

 

위와 같이 LFI 를 통해 불러오면 된다.

반응형