2014-10-28 4 views
3

나는 2 개의 인자를 가진 open() 명령어가 3 개의 인자를 가진 open() 명령어가 주사 가능하지 않은 반면에 injection에 취약하다는 것을 읽었다. perl open() 주입 방지

은 내 모든 파일을 "파일 -"공통 접두사, 즉이 디렉토리가 있다고 그래서 예를 들어 파일 이름은 어떻게 open(FILEHANDLE, "some/random/dir/file-" . $fileextension) 같은 취약 것 파일 SomeSourceCode.txt

될 것인가?

여기서 $fileextension은 말의 '파일 이름'일 수 있습니다. 내가 아는 한, 이것은 서버에 명령을 실행할 | shutdown -r |과 같은 파일 이름에 취약하지 않습니다.

+0

파일 이름 인수가 리터럴 문자열로 시작하면 취약하지 않을 수 있습니다 (큰 금액이 부과되지는 않지만). 실제 취약점은 인수가 변수 이름이고 명령 줄 인수에서 검사하지 않고 도출 된 경우입니다. 어쨌든 3 인자 버전의'open'을 사용하지 않을 이유가 없습니다. 업데이트 할 수없는 일부 오래된 코드의 안전성에 대해 걱정하십니까? –

+3

위험 대비 오버 헤드의 문제입니다. 위험합니다. 이 위험은 3 인자'open'에 의해 완전히 제거됩니다. 처음부터이 위험을 감당할 필요가 없을 때 왜이 위험을 완화하려고합니까? – Sobrique

+0

Perl 마스터하기의 많은 보안 프로그래밍 기술 장에서 이러한 종류의 것들을 보여줍니다. –

답변

9
open(my $fh, "some/random/dir/file-" . $user_text) 

은 완전히 취약합니다. 뿐만 아니라 부적절한 주입은 불가능이라는 이름의 파일을 열 수 있도록 않습니다

some/random/dir/file-foo| 
는 임의의 명령

을 실행할 수 있습니다

$ perl -e'open(my $fh, "file-".$ARGV[0])' ' ; echo 0wned >&2 |' 
sh: 1: file-: not found 
0wned 
내가 없지만 @ikegami 우수한 게시물에 대해 언급 할
+0

해설 해 주셔서 감사합니다. –

+0

2 이유는 'open'을 절대 사용해서는 안되는 이유입니다. 입력 내용의 유효성을 확인할 수 있도록주의를 기울여야합니다.하지만 문제가 존재하지 않았는지 확인해야하는 이유는 무엇입니까? 첫 번째 장소. – Sobrique

0

가장 쉬운 취약점은 $fileextension이 갑자기 /../../../../../etc/passwd이 될 때입니다. 또 다른 가능성은 "some/random/dir/file-" . $fileextension이 기존의 실행 파일을 가리 키도록하는 것이며,이 경우 | any-command |을 추가하면 트릭이 완벽하게 작동합니다.

+0

참고 :'some/random/dir/file- '로 시작하는 dir이 필요합니다. – ikegami

+0

동의합니다. 쉘 명령을 직접 전달하는 것이 훨씬 좋습니다. – afenster

+0

이것은 two-arg open과는 아무런 관련이 없습니다. three-arg open은 똑같이 취약하다. – ikegami

1

허가.

또 다른 가능한 페이로드 벡터는 = (동일)로 악성 입력을 시작하는 것입니다. 이미 하드 코딩 된 이름은 쉘 변수로 처리됩니다.

perl -e'open(my $fh, "file".$ARGV[0])' '=foo echo 0wned >&2 |' 

일부 경우 cgi 스크립트는 오류 발생시 중지되고 해당 페이로드는 오류가 생성되지 않습니다.