본 블로그는 학습용입니다. 명시적 동의 없는 시스템 접근·정보수집은 불법이며 형사·민사 책임이 따릅니다.
실습은 격리된 테스트 환경에서만 허용됩니다. (형법·정보통신망법·정보통신기반보호법 등)
1. 주제
주제: Injection (Command Injection)
핵심 요약: 명령어 삽입은 공격자가 취약한 웹 애플리케이션을 통해 서버 운영체제에서 임의의 명령어를 실행할 수 있게 하는 심각한 보안 취약점입니다. 사용자의 입력값을 적절한 검증 없이 시스템 명령어의 일부로 사용할 때 발생하며, 성공 시 시스템 제어권 탈취로 이어질 수 있습니다.
2. 정의 및 작동 원리
2.1. 상세 정의
명령어 삽입 취약점은 웹 애플리케이션이 사용자의 입력값을 받아 내부적으로 system(), exec()와 같은 함수를 통해 OS 명령어를 생성하고 실행할 때 발생합니다. 공격자는 입력값에 ;, &&, | 등과 같은 쉘 메타 문자를 포함하여 원래 의도된 명령어를 종료시키고, 자신이 원하는 새로운 명령어를 삽입하여 실행할 수 있습니다.
2.2. 흐름
공격은 다음과 같은 흐름으로 이루어집니다.
- 정상적인 요청: 사용자가 IP 주소를 입력하면 서버는 ping 8.8.8.8와 같이 의도된 명령어를 실행하고 그 결과를 반환합니다.
- 공격자의 요청: 공격자가 127.0.0.1; ls -al와 같이 명령어 구분자를 포함한 악의적인 값을 입력합니다.
- 취약한 서버의 처리: 서버는 입력값을 검증하지 않고 그대로 명령어에 포함시켜 127.0.0.1; ls -al 이라는 명령어를 생성합니다.
- 명령어 실행: OS 쉘은 ping 명령어 실행 후 세미콜론(;)을 기준으로 두 번째 명령어인 ls -al을 실행하여 현재 디렉터리의 파일 목록을 노출합니다.
3. 시나리오 및 실습 환경
3.1. 목표 (Objective)
웹 페이지의 입력 폼에 Command Injection 공격을 수행하여 서버 내에 숨겨진 Flag 값을 획득한다.
3.2. 실습 환경 (Environment)
- Target: https://dreamhack.io/wargame/challenges/44
- Tool(s): 웹 브라우저
4. 분석 및 공격 절차
4.1. [1단계: 정보 수집 및 분석]
챌린지 페이지에 접속하면 IP 주소를 입력받아 네트워크 연결 상태를 확인하는 Ping Test 기능이 존재합니다. 입력 폼에 IP 주소를 넣고 전송하면 해당 IP로 ping을 실행한 결과가 화면에 출력됩니다. 이는 사용자의 입력이 서버의 OS 명령어와 연관되어 있을 가능성이 높다는 것을 시사합니다.

4.2. [2단계: 취약점 발견 및 테스트]
명령어 삽입 취약점이 존재하는지 확인하기 위해, IP 주소 뒤에 명령어 구분자인 세미콜론(;)과 함께 간단한 OS 명령어인 ls를 삽입하여 테스트합니다. ls는 현재 디렉터리의 파일 및 폴더 목록을 보여주는 리눅스 명령어입니다.
- 테스트 페이로드: 127.0.0.1; ls
위 명령어를 넣으니 형식이 안맞다고 다시 입력하라고 나왔었습니다
버프스위트로 입력값을 변조해서 진행해보겠습니다
4.3. [3단계: 공격 수행 및 목표 달성]
flag.txt 파일의 존재를 확인했으므로, 파일의 내용을 읽는 리눅스 명령어인 cat을 사용하여 플래그를 획득합니다.
- 공격 페이로드: 127.0.0.1

위 페이로드로 수정하고 forward를 하면

이런 결과로 flag값까지 나오게 됩니다
5. 핵심 코드 및 결과
5.1. 주요 페이로드
목표를 달성하기 위해 사용된 최종 페이로드는 다음과 같습니다. cat 명령어를 이용해 flag.txt 파일의 내용을 출력합니다.
//버프스위트 값 조작
127.0.0.1; cat flag.txt
5.2. 최종 결과
공격 페이로드를 전송한 결과, 서버는 플래그를 반환했으며 이를 통해 챌린지를 해결할 수 있었습니다.
6. 대응 방안 및 결론
6.1. 보안 대책
- 시스템 명령어 사용 자제: 가능하면 OS 명령어를 직접 호출하는 대신 프로그래밍 언어가 제공하는 내장 라이브러리나 API를 사용해야 합니다.
- 입력값 검증): 사용자의 입력값을 시스템 명령어로 전달해야만 하는 경우, 허용된 문자(Allow-list)만 입력받도록 엄격하게 필터링해야 합니다. 예를 들어 IP 주소라면 숫자와 .만 허용합니다.
- 이스케이프: 사용자의 입력에 포함될 수 있는 쉘 메타 문자(;, |, &, (, ), ` 등)를 실행 전에 이스케이프 처리하여 단순한 문자열로 인식되도록 해야 합니다.
6.2. 결론
사용자 입력을 검증 없이 시스템 명령어로 사용하는 것이 얼마나 위험한지 확인했습니다. Command Injection은 간단한 입력값 조작만으로도 시스템을 장악할 수 있는 강력한 공격 기법입니다. 따라서 개발자는 외부 입력을 항상 신뢰할 수 없는 데이터로 간주하고, 서버 측에서 엄격한 검증 및 이스케이프 로직을 구현하여 안전한 시스템을 구축해야 합니다.
참고 자료
'해킹&보안 > 웹' 카테고리의 다른 글
| [Writeup] NoSQL Injection (0) | 2025.10.31 |
|---|---|
| [Writeup] Forbidden Paths (0) | 2025.10.12 |
| [Writeup] SQL Injection (0) | 2025.10.01 |
| CSRF 취약점 A to Z (0) | 2025.09.30 |
| 세션 기반 인증과 JWT 토큰 기반 인증 (0) | 2025.09.27 |