PHP 代码审计基础
0x00 Preface
大多数漏洞都是由 [可控变量]+[特定功能] 产生的(对于用户可传入的变量缺少过滤或过滤不严)。比如SQL注入,我们通过闭合、注释等方式插入payload以获取敏感数据。比如文件上传,我们写入一句话木马以获得web权限。这样的例子数不胜数,同时也给我们提供了一个思路,在我们进行代码审计时,可以根据特定功能,查看是否存在可控变量,可控变量是否存在过滤,过滤是否存在绕过,从而检验是否存在漏洞。
渗透测试分为黑盒测试和白盒测试,黑盒测试仅给出门户网站,白盒测试不仅会给出网站,还会给出项目源码。黑盒测试时,我们只能正常的访问该网站,通常只能从网站的业务逻辑出发,对网站上存在的功能点逐个抓包,然后验证其是否存在漏洞。当然,也可以判断网站是否采用了cms,搜索cms爆出过的安全漏洞,查看是否能够利用。白盒测试时,我们不仅能够正常访问该网站,还可以对网站进行代码审计。因此,我们既可以效仿黑盒测试,根据功能点,抓包查找到对应的代码进行分析(黑盒测试只能抓包测试,无法分析代码),也可以直接在项目源码中搜索select、$_FILE、eval等关键字,对附近代码进行分析。
总的来说,黑盒测试更加贴近于黑客攻击时的情形,而白盒测试则更易发现安全问题。
0x01 MVC 框架
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,它把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。PHP中MVC模式也称Web MVC,是从上世纪70年代进化而来。
MVC的目的是实现一种动态的程序设计,便于后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。
MVC各部分的职能:
- 模型Model – 管理大部分的业务逻辑和所有的数据库逻辑,模型提供了连接和操作数据库的抽象层。
- 控制器Controller - 负责响应用户请求、准备数据,以及决定如何展示数据。
- 视图View – 负责渲染数据,通过HTML方式呈现给用户。
一个典型的Web MVC流程:
- Controller截获用户发出的请求
- Controller调用Model完成状态的读写操作
- Controller把数据传递给View
- View渲染最终结果并呈献给用户
MVC框架的好处有:1、允许更改视图层代码而不用重新编译模型和控制器代码;2、允许使用各种不同样式的视图来访问同一个服务器端的代码;3、使降低开发和维护用户接口的技术含量成为可能;4、使开发时间得到相当大的缩减等。
其实可以把MVC理解为一个规则,这么多网站,纷繁杂乱,如果大家都遵循这个规则,那么网站将变得更加容易管理和维护。此外,也可以把它理解为一个模板,增强了复用性,能够大量减少开发的工作量。同时,它将复杂的底层细节封装了起来(类与对象),使得网站的各个模块相对更加独立,不仅使得维护用户接口更加方便,而且使开发时间得到了相当大的缩减(开发人员集中精力于业务逻辑,界面程序员集中精力于表现形式)。
我们要探讨的是代码审计,与MVC框架又有什么关系呢?MVC框架有其特有的目录结构和路由规则,它与未使用该框架的网站不同,URL路径并不对应其代码文件所在位置。所以在白盒测试中,了解MVC框架有助于我们更加快速、准确地定位到网页功能点所对应的代码段,后面会有相关演示。
0x02 ThinkPHP 框架
Thinkphp框架就是MVC框架的一种,如果说MVC框架是类的话,Thinkphp框架就是其实例化后的对象。
ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。遵循Apache2开源许可协议发布,意味着你可以免费使用ThinkPHP,甚至允许把你基于ThinkPHP开发的应用开源或商业产品发布/销售。
Thinkphp教程资源:http://sites.thinkphp.cn/1556331
Hsycms是由ThinkPHP5.0框架开发的企业网站管理系统,Hsycms下载地址:https://www.hsycms.com/
访问官方部署好的在线网站,选中产品中心模块,随便选取一个产品介绍,查看其路径:
但是项目中并没有product文件,这也证实了前面我们所说的,TP采用的是MVC框架,有其特有的路由规则(TP官方文档中有详细介绍,前面已给出TP教程资源链接)。
首先查看入口文件:
接着查看路由规则:
index/Show/index通常指module、controller、function:
仔细将下图与前面图中的URL进行对比,index.php在这里只是可以省略罢了,加上它仍然可以正常访问,它所代表的正是前面所说的module:index,由于路由规则的设置,/product/195.html并不是controller和function,但也有网站是直接用/module/controller/function路由的(也有通过传参实现路由的,但其本质没有区别),module通常都是index.php。
0x03 Summary
漏洞关键字(特定功能):
- SQL 注入:
select、insert、update、mysql_query、mysqli 等 - 文件上传:
$_FILES、type=“file”、上传、move_uploaded_file()等 - XSS 跨站:
print、print_r、echo、sprintf、die、var_dump、var_export 等 - 文件包含:
include、include_once、require、require_once 等 - 代码执行:
eval、assert、preg_replace、call_user_func、call_user_func_array 等 - 命令执行:
system、exec、shell_exec、``、passthru、pcntl_exec、popen、proc_open 等 - 变量覆盖:
extract、parse_str、import_request_variables()、$$ 等 - 反序列化:
serialize、unserialize、__construct 、__destruct 等 - 其他漏洞:
unlink、file_get_contents、show_source、file、fopen 等
通用关键字(可控变量):
$_GET、$_POST、$_REQUEST、$_FILES、$_SERVER 等
0x04 Reference
php MVC框架实例教程
mvc框架的好处有哪些
PHP 代码审计基础相关推荐
- PHP代码审计基础手册
PHP代码审计基础手册 审计第一步 审计INI配置文件 审计SQL注入 审计XSS 审计CSRF 审计文件包含 审计文件读取(下载) 审计文件上传 审计文件删除 审计代码执行 审计命令执行 审计变量覆 ...
- php代码审计基础笔记
出处: 九零SEC 连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059 -------------------------- ...
- php代码审计是什么意思,php代码审计基础篇
文章最后更新时间为:2019年01月20日 22:08:44 0. 前言 打算寒假学习代码审计和pwn,但是pwn真的是对人太不友好了,在这靠抖取暖的寒冬里大概看完了尹毅的<代码审计 企业级we ...
- java代码审计常见漏洞_java代码审计基础教程之V2会议系统多个漏洞集合/无需登录...
因为学习java并不是很长时间,也没有做深入的研究.但是在学习之后,发现可以审计出一些简单的javaweb漏洞,所以想这这里和大家分享一下.0x01审计之初首先,我拿到了源码之后,大概看了一下这个系统 ...
- c++ 反射_Java代码审计基础之反射
先来一段反射的概念: 在程序运行的时候动态装载类,查看类的信息,生成对象,或操作生成对象. 类在运行的时候,可以得到该类的信息,并且可以动态的修改这些信息 反射类的首要操作 - 获取类 获取类有 三种 ...
- 【代码审计】PHP代码审计---基础记录
PHP伪协议 PHP伪协议事实上是其支持的协议与封装协议,支持的种类有以下12种. * file:// - 访问本地文件系统 * http:// - 访问 HTTP(s) 网址 * ftp:// - ...
- Java代码审计基础——RMI原理和反序列化利用链
目录 (一)何为RMI (二). RMI的模式与交互过程 0x01 设计模式 0x02 交互过程 0x03 Stub和Skeleton (三)简单的 RMI Demo 1.Server 2.Regi ...
- P003-PHP代码审计基础-审计方法与步骤-框架与结构
本节课主要讲解了php审计的方法与大体框架, 首先我们审计代码的时候首先要做的是先看网站的根目录下有什么文件 在进行下一步的判断: 解释: 分析网站:
- PHP代码审计基础_漏洞银行_笔记整理(一)
PHP 主要适用于Web开发领域 用户输入经过操作,进入危险函数,执行危险操作 用户输入指GPCSF.数据库.文件等输入点,危险函数包括include.system等. 用户输入的危险操作要是被转义或 ...
最新文章
- 在“内卷”、“红海”的2020 年,开垦计算机视觉领域的知识荒原:BatchNorm
- c语言是函数式原型的编程,编程范式|程序世界里的编程范式,探索编程本质
- python类继承实例
- 用findstr查找特定文件里面的字符串
- java http请求 乱码_怎么解决java中的http请求乱码
- LS-DYNA常用关键字
- 在Block中使用weakSelf与strongSelf的意义
- 基础编程题之因数分解
- Oracle RAC 11g R2(11.2.0.4)部署文档
- 调整Word中英文与汉字之间的空隙
- AcWing 1913. 公平摄影(前缀和+STL)
- 单目标跟踪paper小综述
- iOS多张图片合成一个视频
- 我的网站防盗链和屏蔽蜘蛛的iis8.5 web.config功能
- 蜂鸟E200(3)乱序、反压、流水线冲突
- assert有什么作用
- 别忽悠我,征信真的有黑名单吗?
- 复旦-华盛顿大学EMBA 二十年20人丨徐欣:从外企转战民企的变身
- 朋友,别再干巴巴地“陈述”简历了,10条写作的技巧分享给你
- 计算机usb接口是一种通用,USB接口大科普,你用的是哪一种?