PHP代码审计学习笔记
PHP代码审计学习笔记
初识PHP
PHP运行模式
影响PHP安全的全局配置
PHP敏感函数
PHP文档
官方文档:PHP: Hypertext Preprocessor
代码审计流程
反向查找流程
1.通过可控变量(输入点)回溯危险函数
2.查找危险函数确定可控变量
3.传递的过程中触发漏洞
特点
暴力:全局搜索危险函数
简单:无需过多理解目标网站功能与架构
快速:适用于自动化代码审计工具命中率低:简单的漏洞越来越少
无法挖掘逻辑漏洞:逻辑漏洞多数不存在危险函数,或危险函数的参数“看似”不可控。
适应性较差:不适合存在全局过滤的站点
使用反向查找流程挖掘漏洞
危险函数全局查找
自动化审计工具(RISP,VCG,Fortify SCA,Cobra,grepbugs,Sky wolf,Taint)
正向查找流程
1.从入口点函数出发
2.找到控制器,理解URL派发规则
3.跟踪控制器调用,以理解代码为目标进行源码阅读
4.阅读代码的过程中,发现漏洞
MVC架构为例
特点:
复杂:需要及其了解目标源码的功能与架构
跳跃性大:涉及M/V/C/Service/Dao等
多个层面漏洞的组合:通常是多个漏洞的组合,很可能存在逻辑相关的漏洞
潜力无限:安全研究人员的宝库
双向查找流程
-
略读代码,了解架构
-
是否有全局过滤机制?
– 有:是否可以绕过?
可以:寻找漏洞触发点。
不可以:寻找没有过滤的变量。
– 没有:那么它是如何处理的?
完全没有处理:可以挖成筛子。
有处理:寻找遗漏的处理点。 -
找到了漏洞点,漏洞利用是否有坑?
否:成功利用!
是:利用所知的语言知识(tick)解决问题。
特点:
高效:如挖隧道,双向开工,时间减半
知识面广:需要同时掌握正向、反向挖掘技巧,并进行结合以及所有正向、反向的优点
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值位置)
思路总结
任意文件操作审计
文件操作函数
文件包含
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截断等漏洞
本文来自博客园,作者:Yu-Zero,转载请注明原文链接:https://www.cnblogs.com/Yu-0/p/17040395.html