PHP를 사용하여 명령 실행: 일반 사용자를 사용하지만 홈 디렉터리는 /root입니다.

PHP를 사용하여 명령 실행: 일반 사용자를 사용하지만 홈 디렉터리는 /root입니다.

저는 Apache + PHP의 사용자 정의 컴파일 설치를 사용하고 있으며 포트를 수신하고 있습니다 80.

Apache는 올바른 설정 UserGroup파일을 사용하여 일반 사용자로 실행되도록 구성되었습니다 httpd.conf.

Apache를 서비스로 실행한 후 루트가 apachectl하나의 프로세스를 httpd실행하고 일반 사용자가 나머지 4개의 프로세스를 실행합니다.

문제는 이것이다:

  • PHP를 통해 외부 명령을 실행하면(예: exec또는 사용 passthru) 올바른 일반 사용자가 실행하지만 $HOME환경 변수는 /root.

예를 들어 다음과 같은 매우 간단한 코드를 사용하십시오.

<?php
echo "Home: " . `echo \$HOME`;
echo "<br />";
echo "Id: " . `id`;

나는 얻다:

Home: /root
Id: uid=1000(normaluser) gid=100(users) groups=100(users),17(audio),33(video)

이 방법으로 실행되는 모든 명령은 실제로 일반 사용자가 실행하므로 보안 문제가 없습니다. 주요 문제는 외부 명령을 실행할 때 해당 명령이 홈 디렉터리에서 무언가를 쓰거나 읽으려고 시도한다는 것입니다.

답변1

나는 쉘이 시작된 것(아파치 프로세스)에 의해 echo $HOME설정된 환경 변수 만 읽기를 원합니다. httpd어떤 일이 발생하지 않는 한 export HOME=/home/whatever환경 변수 HOME의 값은 변경되지 않은 상태로 유지됩니다.

마지막 단락이 맞는지 잘 모르겠습니다. 보안상 문제가 없다면 로 PATH설정되어 있나요 normaluser? /home/normaluser/bin에 ls시스템의 모든 파일에 대해 다운로드 가능한 HTTP 출력을 생성하는 등 특이한 작업을 수행할 수 있는 매우 특별한 실행 파일이 포함되어 있다면 어떻게 될까요? 내 Apache/PHP 설정에서 /usr/local/bin:/bin:/usr/bin:/u/bediger/binPHP 프로그램의 PATH는 .

주요 문제, 즉 홈 디렉토리에서 무언가를 읽고 쓰는 것에 대한 귀하의 주장도 의미가 없습니다. 부분적으로 정규화된 파일 이름의 경우 HOME 값은 중요하지 않지만 현재 작업 디렉토리는 중요합니다. httpd내 테스트 PHP 프로그램에 대해 올바르게 설정된 것 같습니다. 내 Apache/PHP 설정은 현재 작업 디렉터리를 내 PHP가 있는 문서 루트로 설정합니다.

<html>
<head><title>Test</title></head>
<body>
<p>
<?php
    echo "Home: " . `echo \$HOME`;
    echo "<br />";
    echo "Id: " . `id`;
    echo "<br />";
    echo "PWD: " . `pwd`;
    echo "<br />";
    echo "PATH: " . `echo \$PATH`;
?>
</p>
</body>
</html>

관련 정보