2017-03-07 8 views
1

사용자에게 도메인 이름을 입력하라는 html 형식이 있습니다.이 형식은 아래의 php7.0 페이지에 게시되어 셸 스크립트에 의해 처리됩니다. 그러면 html 페이지에 쓰기 위해 aha를 통해 결과가 전달됩니다.php7에서 shell_exec을 사용할 때 어떻게 명령 주입을 멈출 수 있습니까?

내가 가진 문제는 그 같은 명령을 주입하지 못하도록 할 수있는 방법입니다 :

domain.com | rm * -rf

나는 safe_mode를 사용하고 명령을 실행할 수있는 디렉토리를 제한 할 수 있다고 생각했지만이 기능은 현재 사용되지 않습니다.

$domain_arg = escapeshellarg($_POST['domain']); 
$today = date("Y-m-d-H:i:s"); 
$cmd = "/home/ubuntu/dtest/dtest.sh $domain_arg | aha -b -t 'Domain test of $domain_arg' > /var/www/website/results/$domain_arg.$today.html"; 
$output = shell_exec($cmd); 
header("Location: http://the.web.com/results/$result.$today.html"); 
+1

사용자 입력을'exec' 명령에 주입하는 것은 매우 위험합니다. 이 작업을 수행하기 전에 정말 좋은 검증 방법을 사용하는 것이 좋습니다. 입력이 유효한 도메인 이름인지 확인하는 유효성 검사기를 작성할 수 있습니다. – Pitchinnate

+0

'escapeshellarg '을 사용하면 할 일은 모두 끝났습니다. – miken32

+0

파일 이름 구성 요소로 다른 것을 사용해야합니다. – miken32

답변

0

실행하기 전에 인수에 escapeshellarg을 사용하면 결과는 'domain.com | rm *'과 같이 작은 따옴표로 묶은 문자열입니다.

aha -b -t 'Domain test of $domain_arg' 

이 절대적으로 당신이 설명하고있는 문제를 일으킬 수 : 귀하의 문제는 쉘의 인수로이를 사용하지 않는,하지만 쉘 인수의 부분로한다는 것입니다. 대신 다음과 같이 시도하십시오 :

<?php 
$domain_arg = escapeshellarg($_POST["domain"]); 
$log_msg = escapeshellarg("Domain test of $_POST[domain]"); 
$today = date("Y-m-d-H:i:s"); 
$log_file = preg_replace(
    "/[^\w:\\/.-]/i", 
    "_", 
    "/var/www/website/results/$_POST[domain].$today.html" 
); 

$cmd = "/home/ubuntu/dtest/dtest.sh $domain_arg | aha -b -t $log_msg > $log_file"; 
$output = shell_exec($cmd); 
$result = rawurlencode($output); // just guessing that's where it comes from 
$today = rawurlencode($today); 
header("Location: http://the.web.com/results/$result.$today.html"); 
+0

$ filename = ''을 (를) 추가해야했습니다. preg_replace ('/ [^ a-z0-9]/i', '_', $ _POST [ '도메인']). $ 오늘. '.html'; $ filename에 헤더를 설정하면. html 앞에 있지만 그렇지 않으면 이것이 완벽하게 작동합니다. 더 이상 파일을 삭제할 수 없습니다. 감사합니다! – user2001109

+0

방금 ​​귀하의 수정 사항을 발견했습니다.이 버전도 시도해 보겠습니다. – user2001109

+0

쉽게 수정할 수 있습니다. 프로덕션 환경에서 사용하기 전에이 코드를 모두 이해하시기 바랍니다. ;) – miken32

관련 문제