php代码审计基础

挺久前看了半本代码审计,但是现在翻来都忘得差不多了。因为最近想开始一些cms的代码审计实战,就过了一遍安全牛的php代码审计视频,下面是笔记啦

 

一、思路和流程

  • 通读原文:公共函数文件、安全过滤文件、配置文件、index文件
  • 敏感关键字回溯参数
  • 查找可控变量
  • 功能点定向审计:程序安装、文件上传、文件管理、登录验证、备份恢复、找回密码(推荐,用思维导图方式记录)

 

二、核心配置

  • 大小写敏感
  • 运算符: |、&、~、!
  • 空值表达方式foo=;foo=none;
  • 安全模式 safe_mode=off 用来限制文档的存取、限制环境变量的存取、控制外部程序的执行(已在php5.4.0被移除)
  • disable_functions 禁止敏感函数时,dl()函数也要加到禁止列表,否则攻击者可以利用dl()函数加载自定义的php扩展突破disable_functions,配置禁用函数时可以使用逗号分隔函数名
  • php设置在安全模式下仍允许攻击者使用com()函数来创建系统组件执行任意命令,默认com.allow_dcom=false,可以改成true防止漏洞,使用com()函数需要再配置extension=php_com_dotnet.dll(如果php版本小于5.4.5则不需要)
  • 全局变量注册开关register_globals=off,服务端获取数据的时候用$_GET['name']来获取数据
  • register_globals=on,服务端使用POST或者GET提交的变量,都将自动使用全局变量的值来接受值
  • 魔术引号自动过滤默认magic_quotes_gpc=off,打开后将自动把用户提交的sql查询语句进行转换,单引号、双引号、反斜杠、空字符加上反斜杠进行转义(已在php5.4.0被移除)
  • 是否允许包含远程文件allow_url_include=off该配置为on的情况下,可以直接包含远程文件,若包含的变量为可控的情况下,可以直接控制变量来执行php代码
  • 是否允许打开远程文件allow_url_open=on允许本地php文件通过调用url重写来打开和关闭写权限,默认的封装协议提供的ftp和http协议来访问文件
  • HTTP头部版本信息expose_php=off防止了通过http头部泄露的php版本信息
  • 文件上传临时目录upload_tmp_dir=上传文件临时保存的目录,如果不设置的话,则采用系统的临时目录
  • 用户可访问目录open_basedir=E:\Local Test\WWW能够控制php脚本只能访问指定的目录,这样能够避免php脚本访问,不应该访问的文件,一定程度上限制了phpshell的危害
  • 内部错误选项display_errors=on表明显示php脚本的内部错误,网站发布后建议关闭php的错误回显,在调试的时候通常把php错误显示打开
  • 错误报告级别error_reporting=E_ALL&~E_NOTICE这个设置的作用是将错误级别调到最高,显示所有问题,方便排错

 

三、超全局变量

全局变量:在函数外面定义的变量,不能再函数中直接使用。它的作用域不会到函数内部,所以再函数内部使用的时候常常看到类似global $a;。

超全局变量:在所有脚本都有效,在函数可直接使用。除$_GET、$_POST、$_SERVER、$_COOKIE等之外的超全局变量保存在$_COOKIE等之外的超全局变量保存在$_GLOBALS数组中。

  • $_REQUEST可以获取以POST方法和GET方法提交的数据,比较慢,尽量不使用
  • $_SERVER保存关于报头、路径和脚本位置的信息等
  • $_FILES['file']['name'] 显示客户端文件的原名称
  • $_FILES['file']['type'] 文件的MIME类型,例如"image/gif"
  • $_FILES[file']['size'] 已上传文件的大小,单位为字节
  • $_FILES['file']['tmp_ name'] 储存的临时文件名,一般是系统默认
  • $_FILES['file']['error'] 该文件上传相关的错误代码
  • $_COOKIE通过 HTTP Cookies方式传递给当前脚本的变量的数组
  • $HTTP_COOKIE_VARS包含相同的信息,但它不是一个超全局变量
  • $_SESSION当前脚本可用 SESSION 变量的数组
  • $HTTP_COOKIE_VARS包含相同的信息,但它不是一个超全局变量(4.1.0已废弃)
  • $_ENV包含服务器端环境变量的数组,可在php程序的任何地方直接访问,只是被动的接受服务端的环境变量转换为数组元素

 

四、SQL注入

  • 条件:
  1. 可控制用户数据的输入
  2. 原程序要执行的代码,拼接了用户输入的数据
  • 利用方式:
  1. 查询数据
  2. 读写文件(一句话木马16进制转一下)http://127.0.0.1/sql.php?id=1 union select 1,2,3, into outfile "E:/LocalTest/WWW/test.php"
  3. 执行命令
  • 修复方案:
  1. 使用预编译语句
  2. 使用存储过程
  3. 检查数据类型
  4. 使用安全函数

 

五、代码执行

代码执行漏洞是指应用程序本身过滤不严,用户可以通过请求将代码注入到应用中执行。当应用在调用一些能将字符串转化成代码的函数(如php中的eval)时,没有考虑到用户是否能控制这个字符串,将造成代码注入漏洞。狭义的代码注入通常指将可执行代码注入到当前页面中,如php的eval函数,可以将字符串代表的代码作为php代码执行,当前用户能够控制这段字符串时,将产生代码注入漏洞。

  • 挖掘思路:
  1. 用户能够控制函数输入
  2. 存在可执行代码的危险函数
  • 常见危险函数:
  1. eval和assert函数(将输入的字符串参数作为php程序代码来执行)
  2. 回调函数
  3. preg_replace函数
  4. 动态函数执行(定义一个函数、将函数名(字符串)赋值给一个变量、使用变量名代替函数名动态调用函数)
  • 修复方案:
  1. 尽量不要执行外部的应用程序或命令
  2. 使用自定义函数或函数库来替代外部应用程序或命令的功能
  3. 使用escappeshellarg函数来处理命令的参数
  4. 使用safe_mode_exec_dir来指定可执行的文件路径
  5. 将执行函数的参数做白名单限制,在代码或配置文件中限制某些参数

 

六、命令执行

命令注入是一种攻击,其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令。当应用程序将不安全的用户提供的数据(表单,Cookie,HTTP头等)传递给系统shell时,命令注入攻击是可能的。在这种攻击中,攻击者提供的操作系统命令通常以易受攻击的应用程序的特权执行。命令注入攻击可能很大程度上是由于输入验证不足。

  • 挖掘思路:
  1. 用户能够控制函数输入
  2. 存在可执行代码的危险函数
  • 常见危险函数:
  1. system函数
  2. exec函数
  3. shell_exec函数
  4. passthru函数
  5. ``(反引号)
  • 修复方案:
  1. 尽量少用执行命令的函数或者直接禁用参数值尽量使用引号包括
  2. 在使用动态函数之前,确保使用的函数是指定的函数之一
  3. 在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
  4. 尽量少用执行命令的函数
  5. 对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤;对于可控点是程序参数值的情况下,使用escapeshellarg函数进行过滤
  6. 参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义
  7. 而针对由特定第三方组件引发的漏洞,及时打补丁,修改安装时的默认配置
  • 命令执行和代码执行的区别:
  1. 代码执行:执行的效果完全受限于语言本身
  2. 命令执行:执行的效果不受限于语言语法本身,不受命令本身限制
  3. 命令执行的类型:代码层过滤不严、系统的漏洞造成命令注入、调用的第三方组件存在代码执行漏洞

 

七、XSS

  • 挖掘思路:

没有过滤的参数,传入到输出函数中(搜索内容、发表文章、留言、评论回复、资料设置等)。

  • 漏洞类型:

1.反射型:

非持久型,也叫反射型XSS。通过GET和POST方法,向服务器端输入数据。用户输入的数据通常被放置在URL的query string中,或者是form数据中。如果服务器端对输入的数据不进行过滤,验证或编码,就直接将用户输入的信息直接呈现给客户,则可能会造成反射型XSS。反射型XSS是比较普遍的XSS,其危害程度通常被认为较小。但是某些反射型XSS造成的后果会很严重,如在输入框的name中输入,服务器不加处理,将name的值直接送到浏览器,则浏览器会每5秒自动刷新1次。严重者会导致服务器崩溃

常见场景:
将前端获取的内容,直接输出到浏览器页面
将前端获取的内容,直接输出到HTML标签
将前端获取的内容,直接输出到

你可能感兴趣的:(php代码审计基础)