2012-03-01 4 views
0

안전한 것으로 생각 되나요?Windows에서 쉘 주입 방지

def clipboard(foo): 
import sys, subprocess 
system = sys.platform 

if 'win' in system: 
    cmd = 'echo %s | CLIP' % (foo,) 
    subprocess.call(cmd, shell=True) 

if __name__ == '__main__': 
    clipboard('RMDIR /S/Q C:\') #something terrible that actually works. 

간단히 말해서 일부 입력을 클립 보드에 복사하는 것이 아닙니다. 내가 묻는 것은 튜플의 요소를 참조하는 형식화 된 문자열에 내 인수를 래핑하면 쉘 주입 공격의 가능성을 방지 할 수 있는가?

+0

'껍질이 참 ... 지금은 무엇입니까?' 일부 사용자 입력을 나타 냅니까? –

+0

나는 당신을 명확히했다. – Droogans

답변

1

아니, 쉘 주입은 여전히 ​​귀하의 경우에 발생합니다 클립 보드 ('안녕하세요, RMDIR/S/Q C : \')이 클립 보드에 '안녕하세요'넣어하지만, RMDIR를 실행합니다 은.

는 아마도 같이 도울 수있는 인용 부호와 shlex를 사용하여 :

import shlex 
if 'win' in system: 
    safe_arg='"%s"'%foo 
    assert len(shlex.split(safe_arg)) == 1, "Injection attempt detected" 
    cmd = 'echo %s | CLIP' % (safe_arg,) 

편집 : 위의 코드는 여전히 안전도 강력한도했다. 다음은 적어도 더 좋지만 여전히 가양 성을보고 할 수 있습니다.

foo = str(foo.strip('"').strip()) 
safe_arg = '"%s"'%foo 
if '"' in foo: 
    if (len(shlex.split(safe_arg, False, False)) != 1): ... 
+0

[예에서] 배치 한 문서 (http://docs.python.org/library/subprocess.html#subprocess.Popen)에서'Popen'과 함께'shlex'를 사용하려고했습니다. 나는 인수 카운트를 확인하기 위해'shlex'를 사용하는 것을 생각하지 않았습니다. 이것은 실용적이고 이해하기 쉽습니다. 감사. – Droogans

0

read in the manual처럼 명령에서 신뢰할 수없는 소스의 초기화되지 않은 텍스트를 사용하면 쉘에서 명령을 실행하는 것이 주입 공격에 취약 할 수 있습니다. 이는 프로그램이 사용자가 정상적으로 가질 수있는 것보다 많은 권한으로 실행되고있는 경우에만 문제가됩니다.

이것은 변경 불가능한 개체와 완전히 별개입니다. 파이썬 문자열은 immutable입니다.

관련 문제