PHP代码审计学习笔记

初识PHP

PHP运行模式

image

影响PHP安全的全局配置

image

PHP敏感函数

image

PHP文档

官方文档:PHP: Hypertext Preprocessor

代码审计流程

反向查找流程

1.通过可控变量(输入点)回溯危险函数

2.查找危险函数确定可控变量

3.传递的过程中触发漏洞

特点

暴力:全局搜索危险函数

简单:无需过多理解目标网站功能与架构

快速:适用于自动化代码审计工具命中率低:简单的漏洞越来越少

无法挖掘逻辑漏洞:逻辑漏洞多数不存在危险函数,或危险函数的参数“看似”不可控。

适应性较差:不适合存在全局过滤的站点

使用反向查找流程挖掘漏洞

危险函数全局查找

自动化审计工具(RISP,VCG,Fortify SCA,Cobra,grepbugs,Sky wolf,Taint)

正向查找流程

1.从入口点函数出发

2.找到控制器,理解URL派发规则

3.跟踪控制器调用,以理解代码为目标进行源码阅读

4.阅读代码的过程中,发现漏洞

MVC架构为例
image

特点:

复杂:需要及其了解目标源码的功能与架构

跳跃性大:涉及M/V/C/Service/Dao等

多个层面漏洞的组合:通常是多个漏洞的组合,很可能存在逻辑相关的漏洞

潜力无限:安全研究人员的宝库

双向查找流程

  • 略读代码,了解架构

  • 是否有全局过滤机制?
    – 有:是否可以绕过?
    可以:寻找漏洞触发点。
    不可以:寻找没有过滤的变量。
    – 没有:那么它是如何处理的?
    完全没有处理:可以挖成筛子。
    有处理:寻找遗漏的处理点。

  • 找到了漏洞点,漏洞利用是否有坑?
    否:成功利用!
    是:利用所知的语言知识(tick)解决问题。

image

特点:

高效:如挖隧道,双向开工,时间减半

知识面广:需要同时掌握正向、反向挖掘技巧,并进行结合以及所有正向、反向的优点

SQL注入审计

PHP+Mysqli连接方式

  • Mysql(废弃) 无预编译 可能存在

  • Mysqli

  • PDO

SQL注入常见过滤方法

  • intval(转为int,过滤第一个非int之后的所有内容)
  • addslashes(转义特殊字符)(尝试宽字符注入绕过)
  • mysql_real_escape(转义 + 过滤宽字节)
  • mysqli_escape_string(转义特殊字符 + 主动加引号包裹)(尝试宽字符注入绕过)
  • mysqli_real_escape_string(转义特殊字符 + 主动加引号包裹)(尝试宽字符注入绕过)
  • mysqli:escape_string(转义特殊字符 + 主动加引号包裹)(尝试宽字符注入绕过)
  • PDO:quote(转义特殊字符 + 主动加引号包裹)(尝试宽字符注入绕过)
  • 参数化查询(最好过滤方式)(寻找非SQL值位置)

思路总结

image

任意文件操作审计

文件操作函数

文件包含
include/require/include_once/require_once/spl_autoload

文件读取
file_get_contents/fread/readfile/file/highlight file/show_source

文件写入
file_put_contents/fwrite/mkdir/fputs

文件删除
unlink/rmdir

文件上传
move_uploaded_file/copy/rename

文件上传漏洞

文件上传流程

1.检查文件大小、后缀、类型
2.检查文件内容(如图片头等)
3.提取文件后缀
4.生成新文件名
5.将上传临时文件拷贝到新文件名位置

文件上传逻辑常见错误

只检查文件类型不检查文件后缀
文件后缀黑名单导致遗漏
使用原始文件名,导致\0截断等漏洞