其历史相对已经比较久远了,这里也就不废话了,属弱类型中一种阐明型措辞
除了web开拓以及写些大略的exp,暂未创造其它牛逼用场,暂以中小型web站点开拓为主
其余,低版本的php自身漏洞就比较多,建议,从现在开始就在新项目中利用php 5.6.x 今后的版本

好在官方掩护的一贯比较勤奋,主次版本都迭代的比较快,最新版已经到7.2.0
哼哼……是,'最好的措辞'... :)
0x02 这次演示环境
CentOS6.8 x86_64 最小化,带根本库安装 eth0: 192.168.3.42 eth1: 192.168.4.14 eth2: 192.168.5.14
php-5.6.32.tar.gz 官方供应的源码包
0x03 下载 php-5.6.32.tar.gz,并安装好php所需的各种依赖库
# yum install epel-release -y
# yum install -y zlib-devel libxml2-devel freetype-devel
# yum install -y libjpeg-devel libpng-devel gd-devel curl-devel libxslt-devel
# yum install openssl openssl-devel libmcrypt libmcrypt-devel mcrypt mhash mhash-devel -y
# tar xf libiconv-1.15.tar.gz
# cd libiconv-1.15
# ./configure --prefix=/usr/local/libiconv-1.15 && make && make install
# ln -s /usr/local/libiconv-1.15/ /usr/local/libiconv
# ll /usr/local/libiconv/
0x04 开始编译安装php5.6.32,要带的编译参数比较多,大家下去往后,可以仔细理解下这些参数都是干什么用的,实在,都是一些php内置功能模块,这里默认就已经启用了一些比较常用的模块,如,pdo,mysqli,关于下面的模块,并不用全部都装,根据你自己实际的开拓业务需求,用什么装什么即可,牢记,不要一上来不管用不用就先装一大堆,你不用,很可能就会被别人利用
# wget http://au1.php.net/distributions/php-5.6.32.tar.gz
# tar xf php-5.6.32.tar.gz
# cd php-5.6.32
# ./configure --help
# ./configure \
--prefix=/usr/local/php-5.6.32 \
--with-config-file-path=/usr/local/php-5.6.32/etc \
--with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-pdo-mysql=/usr/local/mysql \
--with-iconv-dir=/usr/local/libiconv \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--with-curl \
--with-mcrypt \
--with-gd \
--with-openssl \
--with-mhash \
--with-xmlrpc \
--with-xsl \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--enable-gd-native-ttf \
--enable-pcntl \
--enable-sockets \
--enable-soap \
--enable-short-tags \
--enable-static \
--enable-ftp \
--enable-opcache=no
# make && make install
# ln -s /usr/local/php-5.6.32/ /usr/local/php
# cp php.ini-production /usr/local/php/etc/php.ini创建php阐明器的配置文件
0x05 编辑,配置并优化php-fpm.conf,即 fastcgi 的做事端,如下
让php进程以一个别系伪用户的身份起来,在能知足实际业务需求的情形下,最大程度上降落php进程权限
museradd -s /sbin/nologin -M phpfpm
# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
# vi /usr/local/php/etc/php-fpm.conf
# mkdir /usr/local/php/logs
# egrep -v \"大众^$|;\"大众 /usr/local/php/etc/php-fpm.conf简化php-fpm配置文件
# php-fpm 的全局配置模块
[global]
# 指定php-fpm的进程id号文件存放位置
pid = /usr/local/php/logs/php-fpm.pid
# 指定php-fpm进程自身的缺点日志存放位置
error_log = /usr/local/php/logs/php-fpm.log
# 指定要记录的php-fpm日志级别
log_level = error
rlimit_files = 32768
events.mechanism = epoll
# php-fpm web配置模块
[www]
# 最好把web做事用户和php-fpm进程用户的权限分开,分别用两个完备不同的系统伪用户来跑对应的做事,防止意外的越权行为
# 实在,你也可以不分开,特定条件下,关系也并不是非常大,不过,个人建议,最好还是分开
user = phpfpm
group = phpfpm
# 务必要监听在127.0.0.1的9000端口,其余,该端口严禁对外开放,防止别人通过fastcgi进行包含
listen = 127.0.0.1:9000
listen.owner = phpfpm
listen.group = phpfpm
pm = dynamic
pm.max_children = 1024
pm.start_servers = 16
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 2048
slowlog = /usr/local/php/logs/$pool.log.slow
request_slowlog_timeout = 10
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f klion@protonmail.com
# 只让为php的后缀实行,一样平常这里还有`.php3 .php4 .php5`,把那些默认给的可实行后缀统统去掉,只留`.php`即可
# 一样平常汇合营php.ini文件中的cgi.fix_pathinfo参数一起利用,避免入侵者布局利用解析漏洞进行上传
security.limit_extensions = .php
# /usr/local/php/sbin/php-fpm启动php-fpm
# ps -le | grep \"大众php-fpm\公众
# netstat -tulnp | grep \"大众:9000\公众
# echo \"大众/usr/local/php/sbin/php-fpm\"大众 >> /etc/rc.local && cat /etc/rc.local
# killall php-fpm 如果想关闭php-fpm,直接把它进程kill掉即可
考试测验让php与mysql,nginx 进行联动,看看php能不能被正常解析
# vi connect.php
<?php
$link = mysql_connect(\"大众localhost\"大众,\"大众root\公众,\"大众admin\"大众) or die(mysql_error());
if($link){
echo \"大众yeah , mysql connect succeed!\公众;
}else{
echo mysql_error();
}
?>
0x06 末了,我们就来好好关注下php解析器自身的安全,php解析器的设置全部依赖php.ini文件来实现,以是,下面就来详细解释一下针对php.ini的安全配置
# vi /usr/local/php/etc/php.ini
将 register_globals 项设为Off,本身的意思便是注册为全局变量,也便是说,设置为On的时候,从客户端传过来的参数值会被直接注册到php全局变量中,在后端可以直接拿到该变量到脚本中利用,如果为Off,则表示只能到特定的全局数组中才能取到该数据,建议关闭,随意马虎造成变量覆盖问题,不过在php高版本中 如,> 5.6.x,已经去除对此项的设置,官方给的解释是这样的本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除,如果你用的还是低版本的php就须要把稳把此项关闭
register_globals = Off
<?php
if($mark){
echo \"大众login succeed! \"大众;# 此处会直接显示上岸成功,因事先没有定义$mark,导致$mark直接被覆盖掉了
}else{
echo \"大众login failed!\公众;
}
?>
将 cgi.fix_pathinfo的值设为 0,默认cgi.fix_pathinfo 项是开启的,即值为1,它会对文件路径自动进行改动,我们要把它改成0,不要让php自动改动文件路径,防止入侵者利用此特性布局解析漏洞来合营上传webshell
cgi.fix_pathinfo = 0
建议同时关闭以下两项,如果实在有业务需求,请在代码中严格限定检讨用户传过来的数据
# 为On时,则表示许可,也便是说,此时可以通过file_get_contents(),include(),require()等函数直接从远端获取数据
# 随意马虎造成任意文件读取和包含问题,把稳,此项默认便是开启的
allow_url_fopen = Off
# 随意马虎造发展途包含,强烈建议关闭此项
allow_url_include = Off
禁用各种高危函数,尽可能让各种 webshell [ 一句话,大马 ] 无法再靠php内置函数来实行各种系统命令,说实话,禁用这些函数也并不能很好的防住什么,利用各种拆分拼装变形,依然很随意马虎逃逸,下面是一些比较常见的命令和代码实行函数,如果你还创造有其它的一些不常用的高危函数,也可以一并加进来,防止被入侵者率先创造并利用,此项默认为空,即关闭,其余,并不是下面所有的函数都一定要禁用掉,务必要根据自己实际的开拓业务来进行,实在用不到的,也没必要让它留着,由于有些函数,开拓可能会用,以是也不能盲注的去禁用,那就只能靠在代码中做更为严格的检讨,中间的短长还要靠大家自己去定夺,这里仅仅只是个参考
disable_functions = dl,eval,assert,popen,proc_close,gzinflate,str_rot13,base64_decode,exec,system,ini_alter,readlink,symlink,leak,proc_open,pope,passthru,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,max_execution_time,opendir,readdir,chdir,dir,unlink,delete,copy,rename,ini_se
转义开关,紧张用来转义各种分外字符,如,单引号,双引号,反斜线和空字符...个人建议,在这里先把它关闭,由于它并不能很好的防住sql注入,或者说,基本是防不住的,比如,利用宽字节 说到这儿,顺便再补充一句,对付宽字节的最好办法便是全站统一利用 utf-8,这里还是建议大家采取sql语句预编译和绑定变量的办法来预防sql注入,这也是目前为止比较切实有效的预防手段,对付从客户端过来的各种其它数据,可以单独写个检讨类,如果你想安全就不要对这些开关寄予太大的希望,可能php官方也创造,这个开关本色便是个摆设,以是给出了这样的解释本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除
magic_quotes_gpc = Off
magic_quotes_runtime = Off
关闭php自身的各种缺点回显,反正只要记得,在项目上线后,所有的程序缺点一律吸收到我们自己事先准备好的地方[一样平常这天记],一旦被入侵者在前端看到,极易造成敏感信息透露,高版本的php,默认这些危险项便是处于关闭状态的,其余,有条件的情形下务必把线上环境和测试开拓环境隔离,不要把过多希望寄托于程序员,毕竟,你我都知道,那是根本不靠谱的 ^_^
display_errors = Off# 牢记千万不让让php缺点输出到前端页面上
error_reporting = E_WARING & ERROR# 设置php的缺点报告级别,只须要报告警告和缺点即可
log_errors = On # 开启php缺点日志记录
error_log = /usr/local/php/logs/php_errors.log# 指定php缺点日志存放位置
log_errors_max_len = 2048 # 指定php缺点日志的最大长度
ignore_repeated_errors = Off # 不要忽略重复的缺点
display_startup_errors = Off # 其余,不要把php启动过程中的缺点输出到前端页面上
隐蔽php的详细版本号,即X-Powered-By中显示的内容,不得不再次强调,有些漏洞只能针对特定的类型版本,在实际渗透过程中,如果让入侵者看到详细的版本号,他很可能就会直接去考试测验利用该版本所具有的一些漏洞特性再合营着其它漏洞一起利用
expose_php = Off
限定php对本地文件系统的访问,即把所有的文件操作都限定指定的目录下,让php实在便是限定了像fopen()这类函数的访问范围,一样平常紧张用来防止旁站跨目录,把webshell去世去世掌握在当前站点目录下,此项默认为空,不建议直接写到php.ini中,可以参考前面nginx安全支配中的,直接在每个站点目录下新建一个.user.ini然后再把下面的配置写进去即可,这样相比拟较灵巧
open_basedir = \"大众/usr/local/nginx/html/bwapp/bWAPP:/usr/local/nginx/html/dvws/\公众
关于对做事端session的一些安全处理办法
隐蔽后端利用的真正脚本类型,扰乱入侵者的渗透思路,其余,牢记不要把敏感数据直接明文存在session中,有透露风险
session.name = JSESSIONID表示jsp程序,php的则是PHPSESSID
修正session文件存放路径,最好不要直接放在默认的/tmp目录下,实际中可能是一台单独的session做事器,比如,memcached
session.save_handler = memcache
session.save_path = \"大众tcp://192.168.3.42:11211\公众
安全模式可根据实际业务需求选择性开启,安全模式的意思便是操作文件的函数只能操作与php进程UID相同的文件,但php进程的uid并不一定便是web做事用户的uid,这也就造成了麻烦,也便是说,你想避免这种麻烦,可能就须要在最开始配置时就让php进程和web做事利用同一个别系用户身份,但这又恰好跟我前面说的相背了,我们在前面说过,最好把php进程用户和web做事用户分开,这样更随意马虎进行权限掌握,其余,高版本的php[ > php5.4 ]已不再支持安全模式,由于官方可能也以为它并没什么卵用,而且低版本php的安全模式,还可被绕过,以是,如果你用的是低版本的php,请根据自身实际业务做取舍
safe_mode = On
safe_mode_gid = off
限定php单脚本实行时长,防止做事器资源被长期滥用而产生谢绝做事的效果
max_execution_time = 30
max_input_time = 60
memory_limit = 8M
关于上传,如果实际的业务根本不涉及到上传,直接把上传功能关掉即可,如果须要上传,再根据需求做出调度即可,对防入侵来讲,这里对我们意义并不是非常大
file_uploads = On# 开启php上传功能
upload_tmp_dir =# 文件传上来的临时存放目录
upload_max_filesize = 8M# 许可上传文件的文件大小最大为多少
post_max_size = 8M# 通过POST表单给php的所能吸收的文件大小最多为多少
0x07 利用 chattr 锁定一些不须要常常改动的主要配置文件,如,php-fpm.conf,php.ini,my.cnf…,为了防止chattr工具被别人滥用,你可以把它改名隐蔽到系统的某个角落里,用的时候再拿出来
锁定
# chattr +i /usr/local/php/etc/php.ini
# chattr +i /usr/local/php/etc/php-fpm.conf
# chattr +i /etc/my.cnf
解锁
# chattr -i /usr/local/php/etc/php.ini
# chattr -i /usr/local/php/etc/php-fpm.conf
# chattr -i /etc/my.cnf
0x08 务必勤于关注php官方的高危补丁发布及解释,和其它工具不同,php 自身bug多,由于关注的人多,搞的人也多,以是暴露出来的各种安全问题也就更多
0x09 末了,见告大家一个怎么把曾经yum下来的包保留着的办法,在系统断网的情形下大概用的着,只需到yum配置里面去调度下即可,保留的包的路径也在yum配置中定义好了
# vi /etc/yum.conf
keepcache=1
小结:
至此为止,关于整套LNMP架构的安全支配及优化,也就差不多完成了,我们关注的点,更多可能还是集中在防御入侵上,捎带了一点性能优化,这里所给的参数选项基本全部都可直接用于实战支配,但并不是所有的参数配置都是必须的,还须要你好好根据自己实际的业务需求做出适当取舍,或者在此根本进行定制改进,有些地方都是基于自己平时实战履历的考量来的,并不一定完备是对的,如果有性能更好,更安全的方案,也非常欢迎大家一起来私信互换 ^_^
#PHPSEC