PHP安全威胁概览---你对PHP了解多少???

PHP安全

文件包含

4个主要函数

  • include()
  • require()
  • include_once()
  • require_once()
    当使用这四个函数包含一个新文件时,该文件将作为PHP代码执行,PHP内核并不会在意该包含的文件时什么类型。

要想成功利用文件包含漏洞,需要满足两个条件

  1. include等函数通过动态变量的方式引入需要包含的文件。如果时静态包含是没有办法的。
  2. 用户能够控制该动态变量。

本地文件包含

  1. %00截断
  2. 目录最大长度限制
  3. 编码达到目录遍历

本地文件包含利用技巧

  1. 包含用户上传的文件
  2. 包含data://或php://inputd等伪协议
  3. 包含session文件
  4. 包含日志文件
  5. 包含/proc/self/environ文件
  6. 包含上传的临时文件
  7. 包含其他应用创建的文件

远程文件包含

实现远程文件包含需要设置allow_url_include=ON,则文件包含的函数将支持加载远程文件。

远程文件包含可以读取攻击者的服务器从而实现命令执行。

变量覆盖漏洞

  • 全局变量覆盖
    register_gobal = ON,现在默认变为OFF

  • extract()变量覆盖

  • 遍历初始化变量

  • import_request_variables变量覆盖

  • parse_str()变量覆盖

安全建议:

  1. register_globals = OFF
  2. 熟悉可能造成变量覆盖的函数和方法,检查用户是否能控制变量的来源
  3. 养成初始化变量的好习惯

代码执行漏洞

  • 危险函数
    popen()、system()、paththru()、exec()等都可以直接执行系统命令。

  • phpmyadmin远程代码执行漏洞

  • MyBB1.4 远程代码执行漏洞

挖掘漏洞的过程。通常需要先找到危险函数,然后回溯函数的调用过程,最终看在整个调用的过程中用户是否有可能控制输入。

  • 文件写入执行代码

其他代码执行方式

  • 直接执行代码的函数
    eval()
    assert()
    system()
    exec()
    shell_exec()
    passthru()
    escapeshellcmd()
    pcntl_exec()
    等函数,一般来说,最好在PHP中禁用这些函数,在进行代码审计时则可以检查代码中是否存在这些函数。

  • 文件包含
    相关函数上述内容有介绍

  • 本地文件写入
    能够往本地文件里写入内容的函数都需要重点关注,比如:
    file_put_contents()
    fwrite()
    fputs()

  • preg_replace()代码执行

  • 动态函数执行
    用户自定义的动态函数可以导致代码执行,需要注意这种情况

  • Curly Syntax
    PHP的Curly Syntax也能导致代码执行,它将执行花括号间的代码,并将结果替换回去。

<?php $var = "i was innocent until {`ls`} appeared here" ?>
  • 回调函数执行代码

  • unserialize()导致代码执行

  1. 一是unserialize()函数的参数用户可控
  2. 二是存在__destruct()函数或者__wakeup()函数

定制安全的PHP环境

根据以上所述,应该配置好php.ini来加固PHP 的运行环境

配置参数

register-globals = OFF----避免变量覆盖漏洞
open_basedir----该指令可以建一个基目录,对抗文件包含、目录遍历
allow_url_include----避免远程文件包含,同时推荐关闭的还有allow_url_fopen
display_errors----防止信息泄露,错误回显可能会使攻击者分析出应用程序逻辑进而扩大攻击范围
log_errors = On----把错误消息记录在日志里
magic_quotes_gpc----推荐关闭,增加转义字符可以被攻击者绕过,还有可能衍生出新的一系列问题
cgi.fix_pathinfo----PHP分为模块安装和CGI安装,如果使后者,则要关闭此选项,避免文件上传问题
session.cookie_httponly----开启,防止XSS
session.cookie_secure----若是全站HTTPS请开启此项
safe_mode----需要仔细斟酌
disable_functions----能够在PHP中禁用函数,视情况而定。disable_classes
max_execution_time = 30(默认值)----防止用户脚本占用过多CPU。
user_dir=string----该指令指定用户主目录的一个目录名,PHP脚本必须放在这里才能执行。

隐藏配置细节

  • 隐藏apache
    ServerSignature指令设置为Off.
    ServerTokens指令在确定开启上个指令时,以何种程度显示服务器细节,从full———Prod共有六个选项

  • 隐藏PHP
    expose_php = 0----设置为1时将细节追加服务器签名后面
    phpinfo()----应删除phpinfo()调用的所有实例

  • 修改文件扩展名
    php\php3\phtml

隐藏敏感数据

  • 隐藏文档根目录
    在apache的配置文件中即httpd.conf会发现有一个配置指令DocumentRoot.它被设置为服务器所认为的公共HTML目录的路径。

  • 拒绝访问某些文件扩展名

<Files * .inc>
Oeder allow,deny
Deny from all
</ Files>

数据加密

  • PHP加密函数
    md5()
    MCrypt包----数据加密包

简单的概括,没有太细节,还有一些涉及到有关php的安全可以参考一下我做的漏洞复现,参考了白帽子讲安全以及php编程。

猜你喜欢

转载自blog.csdn.net/qq_43571759/article/details/105919851