제2회 울산 모의해킹 대회

0. 개요

  • 문제 이름 : shopshop
  • 환경 :
    • PHP 기반 웹 서비스
  • 입력 :
    • POST 파라미터 city
  • 목표 :
    • 서버 내부에서 FLAG 문자열을 찾아 출력한다.

사용자 입력을 이용해 의도하지 않은 shell 명령을 실행하는 것이다.


1. 전체 구조 분석

1-1. 기능 구조

서비스는 도시 이름을 입력받아 해당 상점 정보를 검색하는 기능이다.
입력 -> 서버 -> grep 검색 -> 결과 출력
즉, 내부적으로는 다음과 같은 흐름으로 동작한다.

grep -i [user_input] shop_list.info


1-2. 코드

LFI를 통해 확인한 실제 코드의 핵심 부분은 다음과 같다.

system(“grep -i “.$keyword.” shop_list.info”);

이 코드에서 중요한것은: 사용자의 입력이 그대로 shell command에 들어간다.


2. 취약점 분석

2-1. 블랙리스트 필터

코드를 보면 일부 문자열을 차단하는 로직이 존재한다.

$keyword = str_replace(“ls”,””,$keyword);
$keyword = str_replace(“cat”,””,$keyword);

if(preg_match(“/ls l’s cat/i”, $keyword)) exit

즉:

  • ls, cat 차단
  • 일부 문자열 제거
  • 정규식 검사 추가

2-2. 필터의 한계

이 필터는 다음과 같은 특징을 가진다.

  • 특정 문자열만 차단 (블랙리스트)
  • shell 메타문자는 차단하지 않는다.
  • 명령 실행 자체는 제한하지 않는다.

따라서 필터를 우회하는 것이 아니라 명령 실행 흐름을 바꾸는 것이 중요하다.


2-3. command injection 발생

다음 코드가 취약점의 본질이다.

system(“grep -i “.$keyword.” shop_list.info”);

이 구조에서는 입력값이 다음 위치에 들어간다.

grep -i [입력값] shop_list.info

여기서 shell 메타문자를 삽입하면: 원래 의도된 grep이 아니라 다른 명령을 실행할 수 있다.


3. 공격 시나리오

3-1. 공격 전략

서버 내부에서 FLAG 문자열 검색

이를 위해 :

  • 기존 grep 실행 흐름을 깨고 새로운 명령을 실행해야 한다.

3-2. 파이프 이용

shell 에서는 다음과 같은 문법이 가능하다.

A B

이 경우:

  • A의 출력 → B의 입력
  • 결국 B가 실행된다.
따라서 입력값에 를 삽입하면 기존 grep을 무력화하고 원하는 명령 실행이 가능하다.

3-3. 최종 Payload

필터를 보면 ls, cat이 막혀있다. 하지만 ls, cat 없이
grep만으로도 FLAG 검색이 가능하다.


3-4. 실제 실행 흐름

서버에서 실행되는 명령:
grep -i test | grep -r FLAG

이때 앞의 grep은 아무런 의미가 없다.
뒤의 grep이 전체 디렉토리 검색을 수행한다.

결과적으로 FLAG 가 출력된다.


4. 결과

최종 플래그 :

1
FLAG{bol_2_ddunddunhae}

5. 전체 공격 흐름 정리

전체 익스플로잇은 다음 단계로 정리된다.

  1. LFI를 통해서 PHP 소스 코드 확인
  2. system(“grep -i “.$keyword.” shop_list.info”) 구조 파악
  3. 블랙리스트 필터 분석
  4. shell 메타 문자( ) 사용 가능 여부 확인
  5. grep -r FLAG .를 이용한 디렉터리 전체 검색
  6. command injection 으로 FLAG 획득

6. 정리

이 문제의 포인트는 다음과 같다.

  • 블랙리스트 필터는 우회 가능
  • system() 사용 자체가 취약
  • shell 메타문자 하나로 전체 흐름을 장악 가능

7. 한 줄 요약

  • system(“grep -i “.$input) 구조에서 파이프( )를 이용한 command injection으로 FLAG를 획득하는 문제