目录
一:代码审计的定义
二:为什么选择PHP学习代码审计
三:入门准备
四:PHP常见的套路
4.1 代码结构
4.2 目录结构
4.3 参考项目
五:如何调试代码
六:代码审计的本质
一:代码审计的定义
通过阅读一些程序的源码去发现潜在的漏洞,比如代码不规范,算法性能不够,代码重用性不强以及其他的缺陷等等
从安全人员的角度来看是:查找代码中是否存在安全问题,推断用户在操作这个代码对应功能的时候,能否跳出开发人员设想的场景
和逻辑,去给网站数据或者服务器造成危害。例如在购物结算的时候,正常用户想着付款结束购买,而我们要想着这个功能是不是存
在0元购买等逻辑漏洞。
其次代码审计可以发现一些扫描器难以发现的细节,比如某一个特定的功能场景,只有当你传入特定的参数值的时候,才会触发这个
漏洞,这种情况是扫描器很难发现到的。
二:为什么选择PHP学习代码审计
PHP是天生用来开发web程序的,正如之前的梗”PHP是世界上最好的语言”,最主要的原因是PHP编写的各种程序,如cms 商城 论
坛 博客等占据了市场上的绝大份额,在今后的漏洞挖掘中经常遇得到。其次,PHP官方的中文资料文档非常丰富,适合我们每个阶段
的人去学习
链接:http://php.net/manual/zh/index.php
三:入门准备
1.PHP的编程基础
2.环境搭建能力由于我们的环境是为了让代码跑起来,并不是真正上线,所以为了方便推荐使用集成工具面板,例如PHP study
和宝塔)
四:PHP常见的套路
这些所谓的套路在其他编程语言中也存在,只是一个通用与适用的问题,我们要学会举一反三
4.1 代码结构
常见的代码结构有两种:
1.HTML与PHP代码混编,特征就是一个url对应一个PHP页面,例如WordPress的登陆页面http://wordpress.com.test/wp-login.php
2.MVC模式
把代码拆分为Model View Controller三部分结构,
模型一般是数据库操作的相关的代码,例如jsp中的javabean用来设计数据的属性和行为,提供获取属性和设置属性的get/set方法
视图通常是HTML代码和其他编程语言的混编结果,可以把一些控制器传递过来的结果,进行一定的拼接
控制器的代码一般是接受数据,做一些数据的校验,权限的判定,调用一些模型的数据库操作代码,把获得到的数据,传递给
视图,然后视图把装好的HTML代码发送到客户端
MVC的常见表现形式是通常有一个入口文件,这个入口一般是index.php
4.2 目录结构
- 放引用的库或者插件,文件夹名字一般叫librarie/lib/plugin,
- 现代的PHP项目还有一个vendor文件夹,是PHP的包管理器安装依赖代码存放的路径
- 视图代码文件夹名称一般叫layout,theme,template,view
- 控制器文件夹一般叫controller
- 公用的一些代码文件夹一般叫common
- 一些工具函数可能放helper/util/tool文件夹里
- 配置文件放在config文件夹里
- components或modules:这里有mvc的代码,把功能互相独立出来
- route.php:对不同的url调用不同的代码
4.3 参考项目
https://github.com/fecshop/yii2_fecshop
https://github.com/PrestaShop
https://github.com/opencart/opencart
https://github.com/joomla/joomla-cms
五:如何调试代码
1.直接修改源代码,利用var_dump)打印变量,然后在不同分支里面用echo字符串的形式去标记,然后用die函数终止代码
2.使用xdebug扩展
3.网络相关的调试,可以通过wiresharek,看网络通讯
六:代码审计的本质
代码审计是一种经验的对抗和压制:如果我知道的东西比你多,经验就能压制你,如果你的功能没有考虑到这一点,那么就会存在
漏洞。例如对于富文本xss过滤方案,业内最优解已经产生,而你编程的时候没有使用最优解,而是从网上超了一段代码来使用,那
么在审计的时候就产生了绝对压制。
如果你的水平和开发的水平不。相上下,那么就只能根据对方的代码或者算法去设想和构造不同的场景+参数,甚至是通过fuzz来验
证是否存在漏洞。