从php运行iptables时出现意外行为

时间:2017-11-05 14:33:36

标签: php iptables captivenetwork

我在php

中运行以下代码
$ipAddress=$_SERVER['REMOTE_ADDR'];
$mac = `arp -an |grep $ipAddress | awk '{print $4}'`;
$c = "sudo iptables -t mangle -I internet 1 -m mac --mac-source $mac -j RETURN";
shell_exec($c);

之后,输出

#iptables -L -v -t mangle  

 pkts bytes target     prot opt in     out     source               destination         
  215 18676            all  --  *      *       0.0.0.0/0            0.0.0.0/0            MAC D0:17:C2:48:1E:4F
   26  1717 RETURN     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
  340 26189 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0            MARK set 0x63

请注意目标

中没有RETURN

如果我从bash shell运行与sudo相同的命令,则输出为

$ sudo iptables -t mangle -I internet -m mac --mac-source D0:17:C2:48:1E:4F -j RETURN

pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            MAC D0:17:C2:48:1E:4F
    0     0 RETURN     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
    0     0 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0            MARK set 0x63

观察目标

中有RETURN

我已经使用visudo修改了sudoers,以使php能够以root身份运行所述命令

我也尝试过system(),exec并在php中使用反引号运算符。但是,一切都是一样的。

我无法理解为什么会发生这种情况并采取补救措施。

2 个答案:

答案 0 :(得分:1)

分配给$mac的字符串以换行符结尾,从而破坏了iptables命令。删除换行符,例如使用explode代替awk,应解决此问题:

$ipArp = `arp -an | grep $ipAddress`;
$mac = explode(' ', $ipArp)[3];

我想补充一点,这种剧本让我有点害怕。盲目地将值传递给shell命令会产生非常糟糕的后果。我不认为这个特定的脚本是可利用的,但从安全的角度来看,给PHP提供sudo权限并不是一个好主意。

答案 1 :(得分:1)

解决方案: -

我制作了一个脚本/ usr / bin / addtheuser,并仅为此脚本提供了对www-data的sudo访问权限。

的/ usr /斌/ addtheuser: -

iptables -t mangle -i wlan0 -I internet 1 -m mac --mac-source $1 -j RETURN

当我尝试从php运行时

$c = "sudo /usr/bin/addtheuser ".$mac;
shell_exec($c);

现在它按预期工作了。