hhkb.dev

BLOG

2025-11-25 / 호스트기반모의해킹 · 13

웹 취약점 진단(LFI&CI)

1. 개요

웹 애플리케이션에서 자주 큰 문제로 이어지는 지점은 입력값 검증 부재(Lack of Input Validation)다. 사용자가 넣은 값을 서버가 충분히 확인하지 않고 신뢰할 때 이런 문제가 생긴다.

2. 로컬 파일 인클루션(Local File Inclusion, LFI)

2.1 개념

LFI는 서버의 페이지 포함(Include) 기능을 악용해, 내부 파일(/etc/passwd 등)을 읽게 만드는 취약점이다.

  • 원리: include($page) 같은 코드에서 $page 경로를 제대로 통제하지 않을 때 발생한다.

2.2 진단 및 공격 기법

확인할 때는 보통 아래 기법을 먼저 살핀다.

  1. 경로 탐색(Path Traversal)
    상위 디렉토리로 이동하는 ../ 문자를 이용하는 방식이다.
    예시: page=../../../../etc/passwd
  2. 널 바이트(Null Byte) 우회
    일부 구형 PHP 환경에서는 뒤에 붙는 확장자(.php) 처리를 흐트러뜨리기 위해 %00 같은 입력이 언급되곤 한다. 최신 버전에서는 대부분 패치됐다.

2.3 자동화 도구

lfimap은 LFI 점검에 자주 언급되는 파이썬 기반 도구다.

python3 lfimap.py -u "http://target/vulnerable.php?page=FUZZ" -a

다양한 래퍼(Wrapper)와 필터 우회 패턴을 자동으로 시도해 보는 용도로 알려져 있다.

3. 커맨드 인젝션(Command Injection)

3.1 개념

웹 애플리케이션이 시스템 함수(system(), exec())를 통해 운영체제 명령을 실행할 때, 사용자 입력이 그대로 섞여 의도하지 않은 명령까지 실행되는 취약점이다.

대표적으로 관리자 페이지의 "Ping Test" 같은 기능이 예시로 많이 나온다.

3.2 쉘 메타 문자(Shell Meta Characters)

리눅스와 윈도우 쉘에는 명령을 구분하거나 이어 붙일 때 쓰는 메타 문자가 있다.

  • ;(세미콜론): 앞 명령이 끝난 뒤 다음 명령을 이어서 실행한다.
  • &&(AND): 앞 명령이 성공했을 때만 다음 명령을 실행한다.
  • |(Pipe): 앞 명령의 출력을 뒤 명령의 입력으로 넘긴다.
  • $() 또는 `(Backtick): 명령 실행 결과를 문자열처럼 치환한다.

3.3 주의사항: URL 인코딩

HTTP에서는 &, ; 같은 문자가 파라미터 구분자처럼 특별한 의미를 가진다.

그래서 이런 문자를 넣어 확인할 때는 URL Encoding을 같이 고려해야 한다.

  • & -> %26
  • Burp Suite에서는 Ctrl + U로 빠르게 인코딩할 수 있다.

3.4 진단 기법

진단은 수동과 자동화 보조를 함께 보는 편이 많다.

  1. 수동 진단: Repeater로 입력값과 응답 변화를 직접 비교해 본다.
  2. Intruder 활용: 다양한 메타 문자와 우회 패턴을 넣었을 때 응답 길이(Length)나 시간 차이(Time-based)가 달라지는지 비교한다.

4. 실무에서는?

실무에서는 이 두 취약점을 모두 우선순위 높게 본다.

  • LFI는 단순 파일 열람으로 끝나지 않고 더 큰 문제로 이어질 여지가 있다.
  • Command Injection은 서버 명령 실행과 직접 맞닿아 있어서 발견 즉시 치명적으로 평가되는 경우가 많다.
  • 블랙리스트 필터링만으로 막는 방식은 한계가 뚜렷하다. 결국은 안전한 API 사용과 서버 측 검증이 근본 대책이다.