敲可爱的瞳瞳学习PHP代码审计之旅~quq

发布于 2020-01-16  1.23k 次阅读


我看了一下我手机上的时间,破碎的钢化膜让我有些难堪,打开电脑索然无味,总结自己知识点却发现自己的代码审计是真的烂,我笑出了猪叫,于是叫来了酒肉朋友来帮我,没想到他一个电话就把我问倒,我自闭而敬畏,没钱人学习个代码审计都是这么朴实无华,且枯燥。

之前曾经接触过一点代码审计,不过后来就一直挖洞,再后来就上学了,上了狗艹的大专之后,b事真的多就好久没学习了,看到团队的师傅们那么强,我就想重新学一下代码审计重新整理一下琐碎的知识点,其实现在大部分公司要求java代码审计比较多,但是我连最简单的php代码审计都没搞定,确实有点菜了,然后这个寒假先整会php代码审计再说吧。


正题:

一、审计前的准备

  1. phpstudy(php的运行环境,我是Mac系统就用Mdserver)
  2. phpstorm/sublime/vs code/爱国人士,不用Notepad ++

  3. Seay代码审计工具/RIPS(浏览器运行)/Foritfy SCA(商业工具,匹配规则库)这些都是自动审计工具,方便定向审计
  4. Burp suite
  5. 浏览器插件:
    Hacker/Firebug/FoxProxy/Live http/Headers
  6. 数据库监控工具:vMysqlMonitoring.exe

准备好工具之后,然后配置一下就可以开始审计了

在审计之前呢,先了解一下php这门语言。

二、PHP的基本配置:

大小写敏感:
  • directive = value(指令=值)
  • foo=bar≠FOO=bar
运算符:
  • | $ ~ !
空值的表达方式:
  • foo=;
  • foo=none;
  • foo="none";
安全模式:
  • safe_mode = off 
  • 安全模式,用来限制文档的存取,限制环境变量的存取,控制外部程序执行。
限制环境变量存取:
  • safe_mode_allowed_env_vars = string
指定php程序可以改变的环境变量的前缀,当这个选项值为空的时,那么php可以改变任何环境变量,如:safe_mode_allowed_env_vars=PHP,当这个选项的值为空时,那么php可以改变任何环境变量
外部程序执行目录:
  • safe_mode_exec_dir = "E:\local test\www"
禁用函数:
  • disable_functions
    • 为了更安全的运行php,可以使用此指令来禁止一些敏感函数的使用,当你想用本指令禁止一些危险函数时,切忌吧dl()函数也加到禁止列表,攻击者可以利用dl()函数加载自定义的php扩展来突破disable_function。配置禁用函数时可以使用逗号分隔函数名
com组件:
  • com_allow-dcom=false
    • php设置在安全模式下(safe_mode),仍允许攻击者使用COM()函数来创建系统组件来执行任意命令,推荐关闭这个函数来防止出现此漏洞。
    • 使用COM()函数需要在php.ini配置中配置extension=php_com_dotnet.dll,如果php VERSION<5.45,则不需要。
全局变量注册开关:
  • register_globals = off
    • php.ini的register_globals选项的默认值预设off,在4.2版本之前是默认开启的,当register_globals的设定为On时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,这是对服务器来讲是非常不安全的,所以我们不能让它注册为全局变量
  • register_globals=Off时
    • 服务端获取数据的时候用$_GET['name']来获取数据
  • register_globals=On时
    • 服务端使用POST或者GET提交的变量,都将自动使用全局变量来接收值
魔术引号自动过滤:
  • magic_quoter_gpc=on  本特性已在PHP4.0被移除
    • magic_quoter_gpc=Off在php.ini里面是默认关闭的,如果它打开后将自动把用户提交对sql的查询语句进行转换,如果设置成ON的话,php会把所有的单引号,双引号,反斜杠和空字符加上反斜杠进行转义,他会影响http请求的数据有GET、POST、Cookies,开启它会提高网站的安全性,当然,也可以使用addslashes来转义提交的http请求数据,或者用stripslashes来删除转义
是否允许远程文件包含:
  • allow_url_include=off
    • 该配置为on的情况下,可以直接包含远程文件,若包含的变量可控的情况下,可以直接控制变量来执行php代码
  • alllow_url_open=on
    • 允许本地php文件通过调用URL重写来打开关闭写权限,默认的封装协议提供的ftp时间和http协议来访问文件。
http头部版本信息:
  • expose_php=off
    • 防止了通过http头部泄露的php版本信息
文件上传临时目录:
  • upload_tmp_dir=
    • 上传文件临时保存目录,如果不设置的话,则采用系统临时目录
用户可访问目录:
  • open_basedir=E:\locl test\www
    • 能够控制PHP脚本只能访问指定目录,能够避免php脚本访问,不应该访问的文件,一定程度上限制了phpshell的危害
内部错误选项:
  • display_errors=on
    • 表明显示php脚本的内部错误,网站发布后建议关闭PHP错误回显,在调试的时候通常把php错误显示打开。
错误级别报告:
  • error_reporting = E_ALL & ~E_NOTICE
    • 这个设置的作用是将错误级别调到最高,显示所有问题,方便排错 

还有一些需要了解的超全局变量,如果有php基础的话,相信大家一定不会太陌生quq~

  • $_GLOBALS ——引用全局作用域中可用的全部变量
  • $_SERVER ——服务器和执行环境信息
  • $_GET —— HTTP GET变量
  • $_POST——HTTP POST变量
  • $_REQUEST ——HTTP REQUEST变量
  • $_FILES —— HTTP文件上传变量 

三、了解程序架构:

现在大部分的CMS都会使用MVC的架构,MAC架构我个人认为是一种思想和开发架构,那么简单的介绍一下MVC架构,百度上说的有点懵懵的,简单总结了一下:

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:
  • Model(模型)表示应用程序核心(比如数据库记录列表)。

  • View(视图)显示数据(数据库记录)。

  • Controller(控制器)处理输入(写入数据库记录)。

Model(模型)

  • 是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。

View(视图)

  • 是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。

Controller(控制器)

  • 是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据

这些都了解的差不多了,再了解一下目录结构:

  • 放引用的库或者插件,文件夹名字一般叫librarie/lib/plugin,
  • 现代的PHP项目还有一个vendor文件夹,是PHP的包管理器安装依赖代码存放的路径
  • 视图代码文件夹名称一般叫layout,theme,template,view
  • 控制器文件夹一般叫controller
  • 公用的一些代码文件夹一般叫common
  • 一些工具函数可能放helper/util/tool文件夹里
  • 配置文件放在config文件夹里
  • components或modules:这里有mvc的代码,把功能互相独立出来
  • route.php:对不同的url调用不同的代码 

知道这些之后,就明白了一套程序的整体架构,就可以开始审计啦~

开始审计:

为了学审计,本人问了好多师傅还有大佬,空气哥给我的建议是新手应当全文通读,然后先审计一下小的CMS,像那种特别大的就不要去审了,审起来很累的,那么既然全文通读,不可能真的就是一个个的文件看,一行一行的代码审,所以这里就出现了代码安全性分析。

一、对代码的安全性进行分析

首先先看输入和输出,我们都知道漏洞的成因就在于用户的输入和输出,SQL注入就是一个明显的例子,其次再看这套程序中的安全功能,像一些大一点的框架,会把各种安全功能封装到一个文件里面,然后每个功能点再去包含这个安全规则文件。

还需要注意:

  1. 函数集文件
  2. 配置文件
  3. 安全过滤文件
  4. index文件

总结一句话,再没有任何防护下,所有的输入都是有害的,所有进入函数的变量都是危险的,

二、需要了解的PHP的基础知识

  • PHP的语法规范
  • PHP中变量,数据类型,函数,对象
  • 函数,常量,数据库操作
  • SQL语句基础
  • 数组和多维数组,以及遍历数组
  • 变量的引用,静态变量,伪变量的使用
  • PHP中危险函数(如eval,system这些)
  • 构造函数和析构函数
  • 继承,迭代,接口等
  • echo,var_dump,exit等调试函数

再就想不起来了,想起来再补充吧,毕竟咱是初学者,太菜了,QAQ

二、审计流程


  1. 网站结构(浏览网站文件,了解程序的大致目录)

  2. 入口文件(index.php,admin.php文件一般是整个程序的入口文件,详细读一下index.php文件可以知道程序的架构、运行流程,包含哪些配置文件,包含哪些过滤文件以及包含那些安全过滤文件,了解程序的业务逻辑)

  3. 配置文件(一般类似config.php等文件,保存一些数据库相关信息、程序的一些信息。先看看数据库编码,如果是gbk则可能存在宽字节注入。如果变量的值用双引号,则可能存在双引号解析代码执行的问题)

  4. 过滤功能(通过详读公共函数文件和安全过滤文件等文件,清洗掌握用户输入的数据,哪些被过滤,哪些无过滤。在哪里被过滤了,如果过滤的,能否绕过过滤的数据,过滤的方式是替换还是正则?有没有GPC?有没有使用addslasher()处理?)
  5. 查看代码逻辑(观察函数的引用和包含的文件,跟踪用户可输入的变量,查看数据流,最终的会被传到哪里,如果核心库中存在漏洞,那么这套程序其他地方肯定也会存在漏洞,观察敏感的文件是否做好权限限制,有没有未授权访问的可能性,通过搭建测试,在前台寻找用户可控的业务点,并抓包获得后端处理文件,对后端文件进行代码审计)

暂时就这些吧,学到新的东西会更新的~  QAQ