【问题标题】:How to prevent shell script injection on my local webpage?如何防止在我的本地网页上注入 shell 脚本?
【发布时间】:2016-10-18 13:24:29
【问题描述】:

我有一个用作本地网络服务器的 openwrt 路由器,我创建了一个网页以在我的 3G 调制解调器上拨打 USSD,脚本如下所示:

<html>
<title>CHECK USSD</title>
<body>
<?php
if($_POST['send']){
    $ussd=$_POST['ussd'];
    exec('ussd.py '.$ussd,$out);
    echo "Result: ".$out[0];
}
?>
<form action="" method="post">
USSD :<input type="text" autofocus name="ussd" size="14" value="">
<input name="send" type="submit" value="Send Ussd">
</form>
</body>
</html>

ussd.py 是我用来检查 USSD 的 python 脚本。问题在于,当用户尝试在输入框中输入某种脚本时,例如:$(echo "hacked" &gt; /www/index.html)$(rm -fr /root/*),这些脚本也会被执行。所以人们可以很容易地破解我的路由器。我怎样才能防止这种情况发生?

【问题讨论】:

  • 您应该彻底验证您的用户输入,然后再将其输入exec。使用正则表达式。任何与您想要接受作为输入的紧密定义不匹配的内容都应立即丢弃。
  • @FranzGleichmann 同意,仅仅使用escapeshellarg 并认为你已经完成了是不够安全的。
  • 您可以将接受的命令列表放在一个数组中,并在运行输入的命令之前检查它是否与任何接受的命令匹配

标签: php python shell


【解决方案1】:

您要查找的命令是 escapeshellarg(),以便您的字符串被视为单个参数。

$pattern = '/Some regex that matches your potential inputs/';

if (preg_match($pattern, $ussd)) {
   exec('ussd.py '.escapeshellarg($ussd),$out);
} else {
   //throw error / response to user
}

一般来说,直接从用户输入执行并不被认为是安全的。因此,在您的潜在输入命令中找到一个与模式相对应的正则表达式,并在继续之前确保它匹配(您已指定硬编码命令不是一个选项)。

【讨论】:

  • escapeshellarg($out) 可能不是你想要的
  • 你说`直接从用户输入执行不被认为是安全的。`那么最安全的方法是什么?
  • 为用户提供与脚本参数对应的预定义选项列表。如果做不到这一点,则在另一条评论中建议了一系列具有某种模式匹配的可接受参数。
  • 好吧,由于ussd命令经常改变,我不认为我可以像这样设置预定义的选项。
  • 这些命令是否有一个模式/它们都有共同点?如果是这种情况,您可以限制接受的输入以匹配模式
猜你喜欢
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
相关资源
最近更新 更多