PHP代码审计1—PHP.ini的那些事

一、前言

Php默认很多选项是不安全的,给攻击者留下了很多利用的机会。

Php.ini中分号开头行为注释行,配置大都为“指令名=值”的形式,这里需要注意的是php.ini对指令名大小写敏感,a=aaa和A=aaa是不一样的。而php.ini中的值可以是字符串、数字、php常量、ini常量、表达式等。配置文件分了很多部分,例如模块部分、php全局配置、数据库配置等。

以下有些参数设置在php高版本中已被移除,低版本存在,有些服务器使用的php版本依然是老版本没有升级,如果是非必要情况,建议升级PHP的版本到PHP 7.0以上。

二、PHP安全参数配置

  • 参数1:register_globals

    它会影响php如何接受传递过来的参数,其作用是注册为全局变量,开启后,传递来的参数会被注册为全局变量直接使用。此参数建议关闭,现在基本默认都是关闭的,而且新版本已经没有这个选项了,低版本存在会开启。
    
  • 参数2:magic_quotes_gpc

    开启此参数后,$_POST、$_GET、$_COOKIE接受到的单引号、双引号、反斜杠、空字符会加上\符号进行转义,可提高安全性,建议开启。这个选项高版本也没有了。
    
  • 参数3:display_errors

      此参数用来定位错误,错误信息会泄露程序、服务器、数据库等敏感信息,有利益攻击者信息搜集,建议关闭。(测试环境可开启,方便调试)
    
  • 参数4:safe_mode

    安全模式,开启后能够控制php中的一些函数,例如system,同时对很多文件操作函数进行了权限控制,且不允许对关键文件进行操作,例如/etc/passwd。此模式默认关闭,需要设置safe_mode=on开启。这个模式在高版本中也被移除。
    此选项在开启的情况下,会对一部分PHP函数进行限制,
    比如系统文件操作的函数:ckdir,copy,fopen,inclode,require,link,mkdir,touck......
    又比如执行系统命令相关的函数也会被禁用:system,exxec,shell_exec,pasathru,popen.....
    
  • 参数5:open_basedir

    其可以控制php能访问哪些目录,避免php脚本访问不该访问的文件,一定程度上可降低webshell的危害,一般设置为只能访问网站目录,例如open_basedir=/var/www/html。
    在没有配置之前,我们getshell之后,访问其他路径文件,比如/etc/目录下的文件是可以访问的。
    但是当配置了之后,则只能看到被限制的目录:
    

    在这里插入图片描述

  • 参数6: disable_functions

    这个配置会限制一些对系统危害比较大的函数,例如phpinfo、system、exec等,这里注意的是这些函数并不是默认限制的,具体限制哪些需要手动配置。建议限制以下函数:
    disable_functions=phpinfo、passthru、exec、system、chroot、scandir、chgrp、chown、shell_exec、proc_Open、proc_get_status、ini_alter、ini_restore、dl、pfsockopen、openlog、syslog、readlink、symlink、popepassthru、stream_socket_server.
    
  • 参数7: com.allow_dcom

    当com.allow_dcom配置为true时,php允许使用com函数来创建系统组件以此来运行系统命令,建议将其设置为false。
    
  • 参数8: expose_php

    此参数决定是否在HTTP响应头中暴漏php的版本,默认为on,建议设置为off。
    
    
  • 参数9: allow_url_fopen

    允许打开远程文件,默认 on
    
  • 参数10: allow_url_include

    在使用include, include_once, require, require_once进行远程文件包含时,需要打开allow_url_fopen 默认允许。
    

三、PHP其他常规参数配置

1、文件上传相关

  • 参数1:file_uploads

    默认 ‘1’ ,允许http上传文件
    
  • 参数2:upload_tmp_dir

    默认NULL,上传文件时用于存储文件的临时目录。php运行用户可写,未设置则使用系统默认值。如果开启了openbase_dir
    
  • 参数3:uload_max_filesize

    上传文件的大小限制,值为整数时,则单位为字节数,支持 K,M,G速记符,默认2M
    
  • 参数4:max_file_uploads

    允许同时上传的最大文件数,默认20
    

2、数据处理相关

  • 参数1:enable_post_data_reading

    默认值为1,禁用此选项将导致不填充 $_POST 和 $_FILES。读取 postdata 的唯一方法就是使用 php://input stream wrapper。这对于代理请求或以高内存效率的方式处理 POST 数据非常有用
    
  • 参数2: post_max_size

    默认8M,设置post传输数据最大值,此参数会影响文件上传,upload_max_size应小于该参数
    
  • 参数3:default_mimitype

    默认“text/html”	,
    
  • 参数4:default_charset

    设置网站编码。默认UTF-8,该值影响多个函数的编码参数,htmlentities(), html_entity_decode() ,htmlspecialchars(),iconv , mbstring等
    
    

3、日志相关

  • 参数1: error_reporting

    默认为空,设置错误级别,生产环境建议设置 E_ALL & ~E_DEPRECATED & ~E_STRICT,开发环境设置为E_ALL
    
  • 参数2: display_errors

    是否将错误信息输出到显示屏幕,生产环境建议关闭。如果设置为stderr 则输出到stderr而不是strout,默认为1,允许输出
    
  • 参数3: log_errors

    默认为0,设置是否将脚本运行的错误信息记录到服务器错误日志或者error_log之中。
    
  • 参数4:error_log

    默认为空,设置脚本错误将被记录到的文件。该文件必须是web服务器用户可写的。如果特殊值 syslog 被设置,则将错误信息发送到系统日志记录器。
    
  • 参数5:log_error_max_length

    设置 log_errors 的最大字节数. 在 error_log 会添加有关错误源的信息。默认值为1024,如果设置为0表示不限长度。该长度设置对记录的错误,显示的错误,以及 $php_errormsg都会有限制作用。
    
  • 参数6: ignore_repeated_errors

    不记录重复的信息。重复的错误必须出现在同一个文件中的同一行代码上,除非 ignore_repeated_source 设置为true。
    

4、其他重要参数

  • 参数1:max_execution_time
默认30,max_execution_time只影响脚本本身执行的时间。任何发生在诸如使用system()的系统调用,流操作,数据库操作等的脚本执行的最大时间不包括其中
  • 参数2:memory_limit
设置脚本允许分配的最大内存。支持整型,速记符,不限制内存则设置为 “-1”,默认128M
  • 参数3: disable_classes
 禁用某些类;用逗号分隔类名;只能在php.ini中设置

四、参考资料

  • https://blog.csdn.net/fageweiketang/article/details/103483146
  • https://blog.csdn.net/Jacksun_huang/article/details/88572828
  • https://www.jb51.net/article/199367.htm
  • https://blog.csdn.net/weixin_43197795/article/details/108127264

猜你喜欢

转载自blog.csdn.net/qq_45590334/article/details/125417978