2.本文在正式版之前会不断的约请各路黑客大手进行评价测试,欢迎提出异议。

本文仅针对网站部分,本文会对typecho,wordpress进行测试

如果你root端口为22,并且密码是123456,就没必要往下看了。

phpforbidden从入侵谈防御之黑不失落的网站论网站攻防公测版 Ruby

网站环境为linux tengine/nginx mariaDB,同理,apache也有干系设置,百度实验下即可。

本文会阐述以下部分

1.根本权限掌握

2.实行目录限定

3.PHP的限定

4.webshell写入与实行

5.权限细分,必须写入的目录

1.根本权限掌握

什么叫根本权限?在LNMP架构下,nginx+php-fpm架构须要什么权限?

这里我们先来看一下默认权限

默认我们的nginx运行用户是nginx,而php-fpm的默认用户是apache,默认用户安全吗?

看一下webshell

uid=48(apache) gid=48(apache) groups=48(apache)

很明显,我们的默认用户是apache

我们利用shell新建一个目录,很明显,我们是无法建立文件夹的

mkdir: cannot create directory `1': Permission denied

在网上很多教程会见告我们,吧nginx和phpfpm改成同样的用户,我们看看会发生什么。

[root@gov 1]# sudo -u nginx mkdir 1

[root@gov 1]# ll

total 4

drwxr-xr-x 2 nginx nginx 4096 Aug 19 18:08 1

没错,这是一项屈曲的决定!

以是默认权限是安全的吗?并不是,你忘了上传目录,我们看下上传目录的权限

drwxrwx--- 3 nginx apache 4096 Aug 14 17:09 uploads

没错,上传目录的存在便是放大权限,如果php没有写入权限,那么他就无法上传图片。

假设,我们手里有一个0day,现在我要用它来getshell

我会选择uploads目录

-rw-r--r-- 1 apache apache 0 Aug 19 18:11 1.php

完美写入,接着你的站就会被玩坏了,写入shell后我们可以插件数据库链接密码,进网站后台,脱裤,挂黑链等等等等

网站里有几个目录是默认可以写入的?在你的网站目录下实行ls -l

常日plugins themes uploads 这三个目录都是可以写入的。

你还有其他目录可以写入?赶紧修正权限吧!

加入我们的网站在/var/www/html/root

那么下面的命令是极好的,对付必须要有上传权限的uploads目录,我们下面再说

chown -R nginx.apache html

find /var/www/html/root -type d -exec chmod 750 {} \;

find /var/www/html/root -not -type d -exec chmod 640 {} \;

chmod 770 /var/www/html/root/uploads -R

如果你有某些插件也须要写入权限,给他权限,并负责看下面的内容。

2.实行目录限定

我们的apache权限有多大呢?相同的网站拥有相同的权限。

默认情形下,我们的apache权限能浏览大部分目录。
最要命的问题在于,他可以跨站实行,从你的网站一贯接实行到网站二。

我们须要给他一个限定,每个虚拟主机一个单独的限定,没错便是open_basedir。

这里我们须要特殊的技巧,每个虚拟机都要限定

这样虚拟主机将只许可在网站目录和tmp目录实行,而不能穿越到其他目录

在乌云有一篇谈论绕过open_basedir的文章,以是open_basedir只能让你更安全而不是彻底安全,以是你还须要往下看。

server {

location ~ .\.php(\/.)$ {

#include pathinfo.conf;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param PHP_VALUE \"大众open_basedir=$document_root:/tmp/\"大众;

3.PHP的限定

我们想一个另类办理办法,如何限定webshell的实行?

在php.ini里,我们可以选择关闭某些不屈安的函数

但是由于php这玩意分之多又繁芜,这里只能整理出一部分不屈安的函数。

直接添加到php.ini末了面即可

disable_functions=exec,system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,dl,popen,pcntl_exec,socket_accept,socket_bind,socket_clear_error,socket_close,socket_connect,socket_create_listen,socket_create_pair,socket_create,socket_get_option,socket_getpeername,socket_getsockname,socket_last_error,socket_listen,socket_read,socket_recv,socket_recvfrom,socket_select,socket_send,socket_sendto,socket_set_block,socket_set_nonblock,socket_set_option,socket_shutdown,socket_strerror,socket_write,stream_socket_server,disk_total_space,disk_free_space,diskfreespace,getrusage,get_current_user,getmyuid,getmypid,dl,leak,listen,chgrp,link,symlink,dlopen,proc_nice,proc_get_stats,proc_terminate,shell_exec,sh2_exec,posix_getpwuid,posix_getgrgid,posix_kill,ini_restore,mkfifo,dbmopen,dbase_open,filepro,filepro_rowcount,posix_mkfifo,putenv,sleep,chmod,chown,chroot,ini_set,phpinfo,proc_get_status,error_log,syslog,readlink,putenv

在看webshell,我们会创造里面空空如也了,并不能实行命令了。

4.webshell写入与实行

现在我们的网站已经很安全了,他能否更加安全?

现在,我们就要说说我们必须要有实行权限的upload目录了,nginx同样供应理解决方案

location ~ /(usr/uploads)/.\.(php|php5)?$

{

deny all;

}

这个时候我们打开uploads中的php文件会提示403

403 Forbidden

You don't have permission to access the URL on this server. Sorry for the inconvenience.

我们的效果得到验证,纵然写入也不能实行。

5.必须要写入权限但是又包含php文件的目录。

例如我的用的邮件关照插件目录内有cache和和log目录,是必须有写入权限的

这里千万不要犯

location ~ /(usr/uploads|usr/plugins/CommentToMail/cache|usr/plugins/CommentToMail/log)/.\.(php|php5)?$

{

deny all;

}

既可以实现写入文件,又可以让php无法实行。

总结,上面的所有配置:

用户与PHP运行权限分离

nginx:apache

实行目录限定

open_basedir

PHP函数限定

php.ini

分外目录关闭PHP解析

deny all

权限细分

xx|xx|xx

欢迎拍砖,同时 起司靶场v2 上线,完备分开安全锁之类的软件,欢迎测试。

起司靶场v2