제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. 전체 공격 흐름 정리
전체 익스플로잇은 다음 단계로 정리된다.
- LFI를 통해서 PHP 소스 코드 확인
- system(“grep -i “.$keyword.” shop_list.info”) 구조 파악
- 블랙리스트 필터 분석
-
shell 메타 문자( ) 사용 가능 여부 확인 - grep -r FLAG .를 이용한 디렉터리 전체 검색
- command injection 으로 FLAG 획득
6. 정리
이 문제의 포인트는 다음과 같다.
- 블랙리스트 필터는 우회 가능
- system() 사용 자체가 취약
- shell 메타문자 하나로 전체 흐름을 장악 가능
7. 한 줄 요약
-
system(“grep -i “.$input) 구조에서 파이프( )를 이용한 command injection으로 FLAG를 획득하는 문제