PHP代码审计一(PHP核心配置详解)

前言

代码在不同环境下执行的结果也会大有不同,可能就是因为一个简简单单的配置问题,导致一个非常高危的漏洞能够利用;也可能你已经找到一个漏洞就因为你的配置问题,导致你弄了好久都无法构造成功的漏洞利用代码。然而,在不同的PHP版本中配置指令也会有不一样的地方,新的版本可能会增加或者删除部分指令,改变指令默认设置或者固定设置命令,因此,我们在代码审计之前需要非常熟悉PHP各个版本中配置文件的核心指令,才可以高效的挖掘到高质量的漏洞。

PHP常见的基本设置

(1)open_basedir设置
open_basedir能限制应用程序能访问的目录。将PHP所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。检查有没有对open_basedir进行设置,当然有的通过web服务器来设置,例如:apache的php_admin_value,nginx+fcgi通过conf来控制。

通常我们只需要设置为web目录就可以了,如果需要加载外部脚本,也需要把脚本所在目录路径加入到open_basedir指令中,多个目录以分号(; )分割。使用open_basedir 需要注意的一点是,指定的限
制实际上是前缀,而不是目录名。例如,如果配置open_ basedir =/www/a,那么目录/www/a和/www/ab都是可以访问的。所以如果要将访问仅限制在指定的目录内,请用斜线结束路径名。例如设置成: open_basedir = /www/a/。

(2)allow_url_fopen设置

  • 如果allow_url_fopen=ON,那么PHP可以读取远程文件进行操作,这个容易被攻击者利用。

(3)allow_url_include设置(是否允许包含远程文件)

  • 如果allow_url_include=ON,那么PHP可以包含远程文件,会导致严重漏洞。

这个配置指令对PHP安全的影响不可小觑。在该配置为on的情况下,它可以直接包含远程文件,当存在include($var)$var可控的情况下,可以直接控制$var变量来执行PHP代码。allow_url_include 在PHP 5.2.0后默认设置为off,配置范围是PHP_INI_ ALL。
测试代码:

<?php
include $_GET['a'];

(4)safe_mode_exec_dir设置

  • 这个选项能控制php可调用的外部命令的目录,如果php程序中有调用外部命令,那么知道外部命令的目录,能控制程序的风险。
  • 如果安全模式打开了,但是却是要执行某些程序的时候,可以指定要执行程序的主目录:
      safe_mode_exec_dir = D:/usr/bin
  • 一般情况下是不需要执行什么程序的,所以推荐不要执行系统程序目录。
  • 像那些php的命令执行函数只能在 safe_mode_exec_dir 设置的目录下进行执行操作。

(5)magic_quote_gpc设置(魔术引号自动过滤)

  • 这个选项能转义提交给参数中的特殊字符,建议设置magic_quote_gpc=ON。

magic_quotes_gpc函数在php中的作用是判断解析用户提交的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。

在magic_quotes_gpc=On的情况下,如果输入的数据有单引号(’)、双引号(")、反斜线(\)与 NUL(NULL 字符)等字符都会被加上反斜线,但是在PHP 5 中magic_quote_gpc并不会过滤$_SERVER变量,导致很多类似client-ip、referer一类的漏洞能够利用。(如:在HTTP头里面的HTTP_CLIENT_IP和HTTP_X_FORWARDFOR等获取到的IP地址经常没有安全过滤就直接拼接到了SQL语句中,并且由于它们是在$_SERVERE变量中不受gpc的影响,那我们就可以去查找HTTP_CLIENT_IP和HTTP_X_FORWARDFOR关键字来快速寻找漏洞。)

如果这个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义,类似的函数还有mysql_escape_string(),mysql_real_escape_string()等。正是因为这个选项必须为On,但是又让用户进行配置的矛盾,在PHP6中删除了这个选项,一切的编程都需要在magic_quotes_gpc=Off下进行了。在这样的环境下如果不对用户的数据进行转义,后果不仅仅是程序错误而已了。同样的会引起数据库被注入攻击的危险。所以从现在开始大家都不要再依赖这个设置为On了,以免有一天你的服务器需要更新到PHP6而导致你的程序不能正常工作。

**当PHP版本<5.3.4,且php的magic_quotes_gpc为OFF状态时,会造成%00截断漏洞。**当把magic_quotes_gpc打开,或是php版本依然不再小于5.3.4时,再测试,结果%00被转义成了\0两个单体字符,不再具有截断功能。

示例:
在这里插入图片描述
(6)register_globals设置
开启这个选项,将会导致PHP对所有外部提交的变量注册为全局变量,后果相当严重,会造成变量覆盖漏洞。
register_globals的意思就是注册为全局变量,所以当为On的时候,传递过来的值会被直接的注册为全局变量直接使用并初始化值为对应的值,使得提交的参数在可以在脚本中使用,而Off的时候,我们需要到特定的数组里去得到它。
register_globals从php版本5.3.0起被废弃了,在php 5.4.0中移除了该选项。
代码示例1:

<?php  
//?id=1
$id=0;
echo "Register_globals: ".(int)ini_get("register_globals")."<br/>";   //ini_get — 获取一个配置选项的值
echo '$_GET["id"] :'.$_GET['id']."<br/>";
echo '$id :'.$id;
?>

当register_globals=Off的时候,程序接收的时候应该用$_GET['id']来接受传递过来的值;
当register_globals=On的时候,程序可以直接使用$id来接受值,也可以用$_GET['id']来接受传递过来的值。
通过这种方式就可以向程序注册一个之前没有声明的变量,不过如果之前变量已经存在就无法覆盖掉,原已有变量值不变。
如,上面的代码中,已经对变量$id赋了初始值,比如$id=0,那么即使在URL中有/test.php?id=1,也不会将变量覆盖,id值为0

(7)safe_mode设置

  • safe_mode(安全模式)是php内嵌的一种安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的操作,建议开启。

当safe_mode=on时,联动可以配置的指令有safe_mode_include_dir、 safe_mode_exec_dir、safe_mode_allowed_env_ vars等。php 5.4之后被取消了。

这个配置会出现下面限制:
**1)**所有文件操作函数(例如unlink()、file()和include() 等都会受到限制。例如,文件a.php和文件c.txt的文件所有者是用户a,文件b.txt的所有者是用户b并且与文件a.php不在属于同一个用户的文件夹中,当启用了安全模式时,使用a用户执行a.php,删除文件c.txt可成功删除,但是删除文件b.php会失败。对文件操作的include等函数也一样,如果有一些脚本文件放在非Web服务启动用户所有的目录下,需要利用include等函数来加载一些类或函数,可以使用safe_mode_include_dir 指令来配置可以包含的路径。
**2)**通过函数popen()、system() 以及 exec() 等函数执行命令或程序会提示错误。如果我们需要使用一些外部脚本,可以把它们集中放在一个目录下,然后使用safe_mode_exec_dir指令指向脚本的目录。

安全模式下执行命令失败的提示:
在这里插入图片描述

(8)session_use_trans_sid设置

  • 如果启动session_use_trans_sid,会导致PHP通过url传递会话ID,这样会导致攻击者容易劫持当前会话,或者欺骗用户使用已被攻击者控制的现有会话

(9)display_errors和error_reporting设置

  • 如果启动此选项,PHP将会输出所有的错误或警告信息,攻击者能利用这些信息获取web根路径等敏感信息。

(10)expose_php设置
-是否在服务器返回信息HTTP头显示PHP版本

如果启动expose_php选项,那么由php解释其生成的每个 响应 都会包含主机系统上所安装的PHP版本。了解到远程服务器上运行的PHP版本后,攻击者就能针对系统枚举已知的盗取手段,从而大大增加成功发动攻击的机会。
expose_php = On:
在这里插入图片描述
expose_php = Off:
在这里插入图片描述
(11)magic_quotes_sybase(魔术引号自动过滤)

  • magic_quotes_sybase指令用于自动过滤特殊字符,当设置为on时,它会覆盖掉magic_quotes_gpc=on的配置,也就是说,即时配置了gpc=on也是没有效果的。这个指令与gpc的共同点是处理的对象一致,即都是对POST\GET\Cookie进行处理。而他们之间的区别在于处理方式的不同,magic_quotes_sybase仅仅是转义了空字符和把单引号(’)变成了双引号(")。
    在这里插入图片描述

(12)magic_quotes_runtime(魔术引号自动过滤)
magic_quotes_runtime 也是自动在单引号(’)、双引号(")、反斜杠()及空字符(NULL)的前面加上反斜杠()。它跟magic_quotes_gpc的区别是,处理的对象不一样,magic_quotes_runtime 只对从 数据库 或者 文件 中获取的数据进行过滤,它的作用也非常大,因为很多程序员只对外部输人的数据进行过滤,却没有想过从数据库获取的数据同样也会有特殊字符存在,所以攻击者的做法是先将攻击代码写入数据库,在程
序读取、使用到被污染的数据后即可触发攻击
。同样,magic_quotes_runtime 在PHP 5.4之后也被取消,配置范围是PHP_ INI _ALL。

有一个点要记住,只有部分函数受它的影响,所以在某些情况下这个配置是可以绕过的,受影响的列表包括get_meta_tags()、file_get_contents()、file()、fgets()、fwrite()、fread()、fputcsv()、stream_socket_recvfrom()、exec()、system()、passthru()、 stream_get_contents()、bzread()、gzfile()、gzgets()、gzwrite()、 gzread()、 exif read_ data()、dba_ insert()、dba_replace()、dba_fetch()、ibase_fetch_row()、ibase_fetch_assoc()、ibase_fetch_ object()、mssql_fetch_row()、mssql_fetch_object()、mssql_fetch_array()、mssql_ fetch_assoc()、mysqli_fetch_row()、mysqli_ fetch_ array()、 mysqli_fetch_assoc()、mysqli_fetch_object()、pg_fetch_row()、pg_fetch_assoc()、pg_ fetch_ array()、pg_ fetch_ object()、 pg_fetch_ all()、 pg_ select()、 sybase_ fetch_ object()、sybase_ fetch_array()、sybase_ fetch. assoc()、 SplFileObjet::fgets()、SpIFileObject::fgetcsv()、SptFileObject::fwrite()。

测试代码:

#文件1.txt
1'2"3\4

# 文件1.php
<?php
ini_set("magic_quotes_runtime","1");
echo file_get_content("1.txt");

在这里插入图片描述

(13)disable_functions(禁用函数)

  • 在正式的生产环境当中,为了更安全地运行PHP,也可以使用disable_functions指令来禁止一些敏感函数的使用。当你想用本指令禁止一些危险函数是,切记要把dl()函数也加入到禁止列表,因为攻击者可以利用dl()函数来加载自定义的PHP扩展以突破disable_function指令的限制。配置禁用函数是使用逗号分隔多个函数名。

dl ( string $library )函数载入指定参数 library 的 PHP 扩展。

在这里插入图片描述

参考:https://blog.csdn.net/Fly_hps/article/details/79812933

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值