【问题标题】:Unexpected behaviour when running iptables from php从 php 运行 iptables 时出现意外行为
【发布时间】:2017-11-05 14:33:36
【问题描述】:

我在 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 中使用反引号运算符。但是,一切都一样。

我不明白为什么会发生这种情况以及对此的补救措施。

【问题讨论】:

  • 你是什么意思,enable php to run the said command,你给了哪个用户访问权限?请注意,如果您从浏览器执行此操作,则需要授予访问权限的是 Web 服务器用户。
  • 是的。我为该命令授予 www-data 对 sudo 的访问权限,正如我所提到的,它运行但不添加 RETURN 目标。这出乎我的意料。

标签: php iptables captivenetwork


【解决方案1】:

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

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

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

【讨论】:

  • 是的。但这给了我正确的mac地址。它还运行 iptables 命令。问题是没有添加 RETURN 目标。我想这是 php 特有的,因为它可以从 bash shell 工作。
  • 如果您怀疑是权限问题,请同时添加您的 sudoers 文件的相关行。
  • 是的。我确实检查了 var_dump($mac)。它给出了 string(18) "D0:17:C2:48:1E:4F " 而且,这不是命令运行时的权限问题。对于 bash 和非 sudo 用户,它会抱怨。
  • 另外,我考虑了安全后果。用 sudo 使用 php 真的很可怕。但是,由于这是用于内部网络的,所以它不会是一个大问题。
  • 谢谢。确实不错。
【解决方案2】:

解决方案:-

我创建了一个脚本 /usr/bin/addtheuser 并为这个脚本授予了 sudo 访问 www-data 的权限。

/usr/bin/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);

现在它按预期工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多