OS 커맨드는 커맨드 인젝션 공격에 취약하지 않아야 합니다.

 

운영 체제 명령을 실행하거나 기본 시스템과 상호 작용하는 명령을 실행하는 애플리케이션은 해당 명령에 사용된 외부 제공 값을 무력화해야 합니다. 그렇게 하지 않으면 공격자가 의도하지 않은 명령을 실행하거나 민감한 데이터를 노출하는 입력을 포함할 수 있습니다.

이 문제는 다음 중 한 가지 방법으로 완화할 수 있습니다:

  • shell=true 없이 subprocess 모듈 사용. 이 경우 서브프로세스는 명령과 인수가 명확하게 구분된 배열을 기대합니다.
  • shlex.quote로 셸 인자 치환

규칙을 어긴 코드

os

from flask import request
import os

@app.route('/ping')
def ping():
    address = request.args.get("address")
    cmd = "ping -c 1 %s" % address
    os.popen(cmd) # 규칙을 어긴 코드

subprocess

from flask import request
import subprocess

@app.route('/ping')
def ping():
    address = request.args.get("address")
    cmd = "ping -c 1 %s" % address
    subprocess.Popen(cmd, shell=True) # 규칙을 어긴 코드; shell=true을 사용하는 것은 안전하지 않습니다

규칙을 준수한 해결책

os

from flask import request
import os

@app.route('/ping')
def ping():
    address = shlex.quote(request.args.get("address")) # address argument is shell-escaped
    cmd = "ping -c 1 %s" % address
    os.popen(cmd ) # 규칙을 준수한 코드

subprocess

from flask import request
import subprocess

@app.route('/ping')
def ping():
    address = request.args.get("address")
    args = ["ping", "-c1", address]
    subprocess.Popen(args) # 규칙을 준수한 코드

같이보면 좋은 자료

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project