目录

代码审计环境搭建

wamp/wnmp 环境搭建:

lamp/linmp 环境搭建:

PHP 核心配置详解:

register_globals (全局变量注册开关)

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

magic_quotes_gpc (魔术引号自动过滤)

magic_quotes_runtime (魔术引号自动过滤 )

magic_quotes_sybase (魔术引号自动过滤 )

safe_mode (安全模式)

open_basedir PHP 可访问目录

disable_ functions (禁用函数)

display_errors 和 error_reporting 错误显示

剩余其它常用指令:


代码审计环境搭建

通常代码审计师都选择安装 wamp/wnmp 或者 lamp/lnmp 等环境集成包,可以快速构建我们所需要的 PHP 运行环境。在选择集成包的时候必须要考虑的是集成环境版本问题,对于 PHP、MySQL 、Apache 等服务软件版本,尽量使用目前使用最多的版本,比如 PHP 5.2.X、MySQL 5.0 以上,在针对特殊的漏洞测试时可能还需要安装不同的版本进行测试,还需要在不同的操作系统下测试。

wamp/wnmp 环境搭建:

wamp 组合是使用最多的测试环境,常用的集成环境包有 phpStudy、WampServer、XAMPP 以 AppServ。其中使用最方便上且功能最强大的是phpStudy。

lamp/linmp 环境搭建:

在不同的操作系统下,漏洞的测试结果也可能会不一样。简单举例,像文件包含截断,在 Windows 下与 Linux 下截断也有不一样的地方。为了更好地测试漏洞,我们还需要搭建 Linux 下的 PHP 环境。跟 Windows 一样,在 Linux 下也有 PHP 集成环境包,常用的有 phpStudy for Linux 、lanmp 以及XAMPP

PHP 核心配置详解:

在阅读 PHP 官方配置说明 (http://www.php.net/manual/zh/ini.list.php) 之前需要了解几个定义值,即 PHP_INI_* 常量的定义:

register_globals (全局变量注册开关)

该选项在设置为 on 的情况下,会直接把用户 GET、POST 等方式提交上来的参数注册成全局变量并初始化值为参数对应的值,使得提交参数可以直接在脚本中使用。register_globals 在 PHP 版本小于等于 4.2.3 时设置为PHP_INI_ ALL,从 PHP 5.3.0 起被废弃,不推荐使用,在 PHP 5.4.0 中移除了该选项。

当 register_globals 设置为 on 且 PHP 版本低于 5.4.0 时,如下代码输出结果为 true:

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

这个配置指令对 PHP 安全的影响不可小觑。在该配置为 on 的情况下,它可以直接包含远程文件,当存在 include ($var) 且 $var 可控的情况下,可以直接控制 $var 变量来执行 PHP 代码。allow_url_include 在 PHP 5.2.0 后默认设置为 off,配置范围是PHP_INI_ALL。与之类似的配置有allow_url_fopen,配置是否允许打开远程文件,不过该

参数对安全的影响没有 allow_url_include 大,故这里不详细介绍。

配置 allow_url_include 为 on,可以直接包含远程文件。测试代码如下 :

magic_quotes_gpc (魔术引号自动过滤)

magic_quotes_gpc 在安全方面做了很大的贡献,只要它被开启,在不存在编码或者其他特殊绕过的情况下,可以使得很多漏洞无法被利用,它也是让渗透测试人员很头疼的一个东西。当该选项设置为 on 时,会自动在GET、POST、COOKIE 变量中的单引号 ( ' )、双引号 ( " )、反斜杠 ( \ ) 及空字符 (NULL) 的前面加上反斜杠 ( \ )。

但是在 PHP 5 中 magic_quotes_gpc 并不会过滤 $_SERVER 变量,导致很多类似 client_ip、referer 一类的漏洞能够利用。在 PHP 5.3 之后的不推荐使用 magic_quotes_gpc, PHP 5.4之后干脆被取消,所以你下载 PHP 5.4 之后的版本并打开配置文件会发现找不到这个配置选项。在 PHP 版本小于 4.2.3 时,配置范围是PHP_INI_ALL; 在 PHP 版本大于 4.2.3时,是PHP_INI_PERDIR。

测试代码如下:

magic_quotes_runtime (魔术引号自动过滤 )

magic_quotes_runtime 也是自动在单引号 ( ' )、双引号 ( " )、反斜杠 ( \ ) 及空字符(NULL) 的前面加上反斜杠 ( \ )。它跟 magic_quotes_gpc 的区别是,处理的对象不一样,magic_quotes_runtime 只对从数据库或者文件中获取的数据进行过滤。

它的作用也非常大,因为很多程序员只对外部输入的数据进行过滤,却没有想过从数据库获取的数据同样也会有特殊字符存在,所以攻击者的做法是先将攻击代码写人数据库,在程序读取、使用到被污染的数据后即可触发攻击。同样, magic_quotes_runtime 在 PHP 5.4 之后也被取消,配置范围是 PHP_INL_ALL。

有一个点要记住,只有部分函数受它的影响,所以在某些情况下这个配置是可以绕过的,受影响的列表包括:

get meta tags()、file_get_contents() 、file() 、fgets()、fwrite()、fread()、fputcsv() 、stream_ socket recvfrom() 、exec() 、system() 、passthru() 、stream_get_contents() 、bzread() 、gzfile() 、gzgets()、8g8Zzwrite() 、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()、SplFileObject::fgets()、SplFileObject::fgetcsv()、

SplFileObject::fwrite()。

测试代码如下 :

magic_quotes_sybase (魔术引号自动过滤 )

magic_quotes_sybase 指令用于自动过滤特殊字符,当设置为 on 时,它会覆盖掉magic_quotes_gpc=on 的配置,也就是说,即使配置了 gpc=on 也是没有效果的。这个指令与 gpc 的共同点是处理的对象一致,即都对 GET 、POST 、Cookie 进行处理。而它们之前的区别在于处理方式不一样,magic_quotes_sybase 仅仅是转义了空字符和把

单引号 ( ' ) 变成了双引号 ( " )。与 gpe 相比,这个指令使用得更少,它的配置范围是PHP_INI_ALL, 在 PHP 5.4.0 中移除了该选项。

测试代码如下 :

safe_mode (安全模式)

安全模式是 PHP 内嵌的一种安全机制,当 safe_mode=on 时,联动可以配置的指令有 safe_ mode_include_dir、safe_mode _exec_dir、safe_mode_allowed_env_vars 、safe_mode、protected_env_vars。

safe_mode 指令的配置范围为PHP_INI_SYSTEM,PHP 5.4 之后被取消。

这个配置会出现下面限制:

1 ) 所有文件操作函数 (例如 unlink()、file() 和 include()) 等都会受到限制:

例如文件 a.php 和文件 c.txt 的文件所有者是用户 a, 文件 b.txt 的所有者是用户 b 并且与文件a.php 不在属于同一个用户的文件夹中,当启用了安全模式时,使用 a 用户执行 aphp,删除文件 c.txt 可成功删除,但是删除文件 b.php 会失败。对文件操作的 include 等机数也一样,如果有一些脚本文件放在非 web 服务启动用户所有的目录下,需要利用include 等本数来加载一些类或函数,可以使用 safe_ mode_include_dir 指令来配置可以包含的路径。

2 ) 通过函数 popen()、system() 以及 exec() 等函数执行命令或程序会提示错误:

如果我们需要使用一些外部脚本,可以把它们集中放在一个目录下,然后使用 safe_mode_exec_dir 指令指向脚本的目录。

下面是启用 safe_mode 指令时受影响的函数、变量及配置指令的完整列表:

apache_request_headers() 、ackticks()、hdir() 、hgrp()、chmode()、chown()、copy()、dbase_open() 、dbmopen()、dl() 、exec() 、filepro()、filepro_retrieve()、filepro_rowcount() 、fopen()、header() 、highlight_file() 、ifx_* 、ingres_* 、link()、mail() 、max_execution_time()、mkdir()、move_uploaded_ file()、mysql * 、parse_ini_

file(O 、passthru() 、pg_lo_import()、popen()、posix_mkfifo()、putenv() 、rename()、zmdir()、set_time_limit()、sShell exec()、show_source()、Symlink()、system() 、touch()。

安全模式下执行命令失败的提示,如下图所示:

open_basedir PHP 可访问目录

open_basedir 指令用来限制 PHP 只能访问哪些目录,通常我们只需要设置 Web 文件目录即可,如果需要加载外部脚本,也需要把脚本所在目录路径加入到 open_basedir 指令中,多个目录以分号 (; ) 分割。使用 open_basedir 需要注意的一点是,指定的限制实际上是前缀,而不是目录名。例如,如果配置 open_basedir =/www/a,那么目录

/www/a 和 /www/ab 都是可以访问的。所以如果要将访问仅限制在指定的目录内,请用斜线结束路径名。例如设置成: open_basedir = /www/a/。

当 open_basedir 配置目录后,执行脚本访问其他文件都需要验证文件路径,因此在执行效率上面也会有一定的影响。该指令的配置范围在 PHP 版本小于 5.2.3 时是 PHP_INI_SYSTEM,在 PHP 版本大于等于5.2.3 是PHP_INI_ALL。

disable_ functions (禁用函数)

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

本指令配置范围为php.ini only。配置禁用琢数时使用逗号分制函数名,例如:disable _functions=phpinfo ,eval, passthru, exec, system。

display_errors 和 error_reporting 错误显示

display_errors 表明是否显示 PHP 脚本内部错误的选项,在调试 PHP 的时候,通常都把PHP 错误显示打开,但是在生产环境中,建议关闭 PHP 错误回显,即设置display_errors=off,以避免带来一些安全隐患。在设置 display_errors=on 时,还可以配置的一个指令是 error_reporting,这个选项用来配置错误显示的级别,可使用数字也可使用内置常量配置。这两个指令的配置范围都是 PHP_INI_ALL。

数字格式与常量格式的详细信息如表 1-2 所示:

剩余其它常用指令:

代码审计:企业级web代码安全架构读书笔记(一)相关推荐

  1. JAVA WEB整合开发王者归来 -- 读书笔记 by CZF 完整版

    JAVA WEB整合开发王者归来 -- 读书笔记  目录 第1章 概述. 1 第2章 搭建web开发环境. 1 第3章 Servlet技术. 1 第4章 深入JSP技术. 7 第5章 会话跟踪. 12 ...

  2. 《SQL Server企业级平台管理实践》读书笔记——几个系统库的备份与恢复

    原文:<SQL Server企业级平台管理实践>读书笔记--几个系统库的备份与恢复 master数据库 master作为数据库的主要数据库,记录着SQL Server系统的所有系统级信息, ...

  3. 代码大全(读书笔记)

    代码大全(读书笔记) 2021.06.27 开始阅读此书,这篇文章记录了一些读此书或者这款时间工作生活的一些心路,希望自己能持续从此受益. 2021.08.05 此次阅读的关注点在第 3/5/6/7/ ...

  4. 《重构-改善既有代码设计》读书笔记-重构篇

    2019独角兽企业重金招聘Python工程师标准>>> 重构定义 名词 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本.--<重 ...

  5. 《代码阅读》读书笔记(一)

    <代码阅读>读书笔记(一) <代码阅读>(<Code Reading The Open Source Perspective>)Diomidis Spinellis ...

  6. 《Web安全测试》读书笔记

    <Web安全测试>读书笔记 第1章  绪论                  什么是安全测试:安全测试就是要提供证据表明,在面对敌意和恶意输入的时候,应用仍然能够充分地满足需求.     ...

  7. 聊聊架构--读书笔记

    1.认识架构 1.1生命周期: 万物皆有生命周期 生命周期包含各种活动,活动的推进是生命周期的必要因素(对象的行为) 生命周期里面的活动拆分后,形成若干新的生命周期 拆分后主体不变的是核心生命周期,变 ...

  8. Code Complete《代码大全》读书笔记

    最近拜读了 Code complete<代码大全>,这部大块头确实经典,涉及到了软件开发的方方面面.有点后悔没有早些阅读,值得推荐给还没读过的朋友.它并不是针对某种语言的武林秘籍,应该可以 ...

  9. 整洁架构读书笔记(Clean Architecture)

    又称干净的架构The Clean Architecture,这是著名软件工程大师Robert C Martin提出的一种架构整洁清晰之道,也是当前各种语言开发的目标架构.干净.清晰.整洁的架构应该只包 ...

最新文章

  1. 小米副总裁崔宝秋:智能手机是今天AI技术最大的平台,AIoT又让AI无处不在 | MEET 2021...
  2. Linux文件操作命令
  3. zabbix 从入门到精通
  4. 配置linux系统自带apache+php+mysql
  5. 制作完整的java可执行文件
  6. 人名和成绩一起排序_不同工作表中的数据表排序各异,如何用Excel数据透视表汇总?...
  7. 数字化方法基础(三)_导入本地模型
  8. Android View框架总结(六)View布局流程之Draw过程
  9. 通过cmd修改注册表并设置cmd窗口的大小
  10. 学生的知识管理工具:有道云笔记、幕布和 Effie
  11. TP-link WR720N路由器刷入OpenWrt
  12. VBS实现的日程提醒小工具
  13. 基于javaweb房屋租赁管理系统的设计与实现
  14. VPP DPDK,不是翻墙!!
  15. matlab画极坐标方程图像_怎么用matlab画极坐标图
  16. 软件测试 Web自动化测试 基础知识 HTML CSS JavaScript
  17. linux常用命令_Linux常用命令总结
  18. 手机App测试点归纳
  19. Maven命令行窗口指定settings.xml
  20. 数字图像处理杂项-同态滤波

热门文章

  1. MathType 快捷键大全——数学建模神器yyds(告别繁杂的公式)
  2. 网站SEO优化诊断怎么做 分析诊断报告包含了哪些内容
  3. matlab三大重要数组之胞元数组
  4. 360n4s普通版Android7,360手机N4S有几个版本 360手机N4S各版本区别对比
  5. 某些在线点播视频的地址格式
  6. ARM开发(4)基于STM32的矩阵键盘按键控制TM1629A LED显示
  7. 【HNOI2004】宠物收养所
  8. qBittorrent一个替代 µTorrent 的开源软件
  9. IT计算机前后端相关专业——20个常用的学习教程及在线编程工具
  10. ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n