여기서는 command 값을 기반으로 쿼리 문자열을 얻습니다 shell_exec()
.
쿼리 문자열 값을 받았지만 shell_exec()
작동하지 않습니다.
저는 Raspberry pi 3에 연결된 웹캠을 사용하고 있으므로 명령은 shell_exec()
웹캠을 켜고 끄는 것입니다.
$output=shell_exec('sudo /etc/init.d/motion start')
암호:
<?php
$status=$_GET['status'];
if($status == 'on')
{
$output=shell_exec('sudo /etc/init.d/motion start');
}
if($status == 'off')
{
$output=shell_exec('sudo /etc/init.d/motion start');
}
실행 문제를 해결하는 방법은 무엇입니까?
답변1
일반적인 접근 방식은 apache/http 사용자에게 sudo 권한을 부여하는 대신 다음과 같이 suid 래퍼 바이너리를 만드는 것입니다.
$ sudo gcc -o suidmotion -xc - <<cEnd
#include "stdlib.h"
#include "string.h"
int main(int argc, char *argv[])
{ if (argc ==2)
{ if (!strcmp(argv[1], "start")) system("/etc/init.d/motion start");
if (!strcmp(argv[1], "stop" )) system("/etc/init.d/motion stop");
}
}
cEnd
$ sudo chmod +s suidmotion
...php에서 호출하는 대신shell_exec("/path/to/suidmotion start/stop");
sudo gcc
누가 소유하든 바이너리의 실행 권한이 바이너리 소유자(루트)에게 승격되도록 보장하는 출력 suidmotion
바이너리를 생성합니다 .root:root
chmod +s