在PHP里有个很牛逼轰轰的函数 那就是 shell_exec.这个函数需要一个字符串,也就是命令.然后就可以在PHP脚本中执行 外部命令了.所以说 非常 强大但同时你需要非常注意因为稍有不谨慎就能导致安全隐患.
我之前就 基于这个函数 搞了两个简单的页面运行 LINUX 小工具: FIGLET 和 CURL
原理如下:
1 2 3 | $value = $_GET['value']; $cmd = 'figlet $value'; shell_exec($cmd); |
$value = $_GET['value']; $cmd = 'figlet $value'; shell_exec($cmd);
三行代码很简单; 变量从URL地址栏里用户 通过 GET方式设置.然后就执行,如果用户给这样的输入:
hello | ls -l
最后执行的命令就会很不幸的变成这样:
figlet hello | ls -l
这命令组合后是合法的 ;这样的话用户 就可以执行任何命令;如果他 敲入 rm -rf / 那么后果不敢相像.
所以 我们必须把这些字符给排除(特殊字符)
1 2 3 4 | $value = str_replace('|', '', $value); $value = str_replace(';', '', $value); ... ... |
$value = str_replace('|', '', $value); $value = str_replace(';', '', $value); ... ...
很多符号都得考虑,比如逗号分号$(/等,一一排除并不是很完美的解决方法 因为这样一来有可能漏掉 二来用户就无法真正使用这些字符.
最简单的方法是 先把字符串中的单引号给删掉 然后 在字符串前后加一个单引号,这样 在LINUX命令行下 单引号内的字符就是不转义的.
1 | $value = '\'' . str_replace('\'', '', $value) . '\''; |
$value = '\'' . str_replace('\'', '', $value) . '\'';
比如 ‘a | ls -l’ 就会变成
figlet 'a | ls -l'
这样 就会被认为是单一命令,相当安全.
英文:https://helloacm.com/escape-linux-command-to-prevent-security-holes-from-php-shell_exec-function/
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK