最近考虑一个问题,就是如果 web 服务被上传 phpwebshell 要怎么办。 有没这种可能,通过修改 php 的解析方法,比如修改 php 文件 <? php 的置顶头为其他,像<? abc。 这样的话就算有恶意 phpwebshell 文件上传也因为系统无法解析它的语法而不能运行。 如果可以行,请问要怎么修改 php ?是否可以需要修改 php 内核?
1
imdong 2018-09-07 14:52:42 +08:00
好思路呦,不过人家直接 在 某个 php 文件末尾加一行 $_GET['a']($_POST['b'])怎么办呢?
嗯,把 php 的文件后缀名也自定义?? 其实还有更简单的办法,能执行代码的目录一律设置不可写入。 能写入的目录不可执行,直接当做二进制输出。 |
2
fcten 2018-09-07 14:54:30 +08:00
可行,但效果非常有限,而且造成不兼容
https://github.com/php/php-src/blob/master/Zend/zend_language_scanner.l#L1935 修改后重新编译 PHP |
3
34C 2018-09-07 15:58:43 +08:00
存放上传文件的文件夹 不应该有执行脚本的权限,任何文件都不应该被执行
|
4
liangming1 OP |
5
Heimo 2018-09-07 16:48:55 +08:00
|
6
realpg 2018-09-07 17:31:00 +08:00 1
@liangming1 #4
php 文件通过版本库联动部署 都是 root 权限 www-data 不可修改 框架只有 index.php 主入口文件让 php-fpm 执行 不要弄 *.php 这都 8012 年了…… 以上的规定是我 2011 年时候拟的 |
10
msg7086 2018-09-08 01:27:29 +08:00
@realpg 我们 2008 年的时候就在用类似的规则了,那时候大概 PHP 5.0 的年代。
一个 PHP 程序最好就是单个入口,引入框架和组件,统一检查用户权限和输入数据,然后程序部分无法被其他账号修改,甚至最好在 wwwroot 以外,然后可上传的目录禁止一切 PHP 解析。 8012 年了,不应该再用十五年前的习惯来做了。 |
11
realpg 2018-09-08 11:35:49 +08:00
@msg7086 #10
我这更绝对一点 只有 index.php 这种框架入口单文件解析 别说上传目录了 而且 云服务出来以后 基本也不设上传目录了 上传文件都丢七牛了 webserver 只有程序 方便基于云服务动态生成新的 vps 直接从版本库拉代码环境自动生成好 |
12
realpg 2018-09-08 11:36:28 +08:00
|
13
Hardrain 2018-09-12 13:21:19 +08:00
上传目录禁用解析器
以 Apache+php-fpm 为例,上传目录的.htaccess 加入 SetHandler ! 其他目录下的.php 还是 chown a-w 吧 当然如果你用 root 运行了 php-fpm 这是无效的。 |
14
liangming1 OP 我找到修改的方法了,但是有个问题,修改了源码之后重新编译,会出现一个问题,cp: cannot stat `ext/phar/phar.phar': No such file or directory .
|
15
liangming1 OP 编译过程之中会生成两个文件,phar.php 和 phar.php ,编译生成的这两个文件是以<?php 开头的,修改了源码的解析头之后,就不能正常读取这两个 php 文件,所以造成 cp: cannot stat `ext/phar/phar.phar': No such file or directory .这个错误,目前我还没有办法解决这个问题。
|
16
liangming1 OP 编译过程之中会生成两个文件,phar.php 和 phar.phar,编译生成的这两个文件是以<?php 开头的,修改了源码的解析头之后,就不能正常读取这两个 php 文件,所以造成 cp: cannot stat `ext/phar/phar.phar': No such file or directory .这个错误,目前我还没有办法解决这个问题。
|