Command Injection
사용자의 입력이 시스템 명령어로 그대로 전달될 때 발생하는 취약점
이를 통해 공격자가 입력값을 조작하여 원하는 시스템 명령어를 실행하도록 유도 가능
시스템 제어, 원격 셸 획득 등 피해로 이어질 수 있음
[취약한 예시 코드]
import os
user_input = input("삭제할 파일명을 입력하세요: ")
os.system(f"rm {user_input}") # 매우 위험!
<?php
$file = $_GET['file'];
system("rm $file"); // 매우 위험!
?>
보안 대책
- 쉘 명령어 직접 연결 금지
- 입력값 검증 및 제한
- 허용되는 문자 및 패턴만 입력받거나 화이트리스트 적용
- 문자열 길이 제한 등으로 리스크 줄이기
- 특수문자 사용 제한 (
|,&,;등)
- 필요 없으면 시스템 명령어 호출 자체를 피하기
- 언어 내장 함수(
os.remove,unlink) 사용으로 공격 가능성 제거
- 언어 내장 함수(
[셸에서 지원하는 메타문자]
`[명령어]` : 명령어 치환
$([명령어]) : 명령어 치환 (중복 사용 가능 echo $(echo $(echo hello))
&& : 앞 명령 성공시 뒤 명령 실행
|| : 앞 명령 실패시 뒤 명령 실행
; : 앞뒤 관계없이 연속 실행
| : 파이프 (앞 명령어의 결과과 뒷 명령어의 입력으로 들어간다)
&&, ;, |등을 사용하면 여러 개의 명령어 연속 실행시킬 수 있다. → 공격자는 메타 문자를 통해 임의 명령어를 실행하여 셸 획득 가능
$ echo `echo hello`
hello
$ echo $(echo hello)
hello
$ echo hello && echo world
hello
world
$ cat / || echo world
cat: /: Is a directory
world
$ echo hello ; echo world
hello
world
$ echo id | /bin/sh
uid=1001(jade) gid=1001(jade) groups=1001(jade)'Study > Web Hacking' 카테고리의 다른 글
| [Web] 불충분한 인증? 인가? (0) | 2025.11.15 |
|---|---|
| [Web] SQL Injection (0) | 2025.11.05 |
| [Web] 파일 취약점 (0) | 2025.10.12 |
| [Web] 쿠키? 세션? 토큰? (0) | 2025.10.09 |
| [Web] Full TTY (완전한 터미널 환경) (0) | 2025.10.06 |