51 代码审计-PHP框架MVC类上传断点调试挖掘

目录

知识点1:

#关键字搜索: (函数,关键字,全局变量等)

文件上传,$_FILES,move_uploaded_file等

通过函数类带入操作文件类的上传函数,搜索寻找特定地方进行文件上传

程序员为了代码的阅读性,他可能会对代码进行注释,表示这串代码是做什么作用的,你如果搜索文件上传关键字的话,可能会搜到程序员在开发源代码的时候,写到的相关注释的关键字,从而找到文件上传的代码段,来分析这个地方的漏洞

$_FILES是php里面的全局变量,这些都是可以获取到的

通过搜索FILES关键字,也能得到一些进行文件操作的代码段,分析代码的安全性

#应用功能抓包:(任何可能存在上传的应用功能点)

前台会员中心,后台新闻添加等可能存在上传的地方

你去猜测源码那个地方会存在文件上传,一般是前台会员中心、个人头像、后台新闻添加等可能存在上传的地方,所以这些地方属于应用功能,你只需要找到这些地方,对这些地方进行上传抓包,分析代码的指向文件,他的一些参数,然后再找到对应的地方

知识点2:

MVC开发框架类:https://www.cnblogs.com/wsybky/p/8638876.html

知识点3:

Thinkphp框架: https://sites.thinkphp.cn/1556331

演示案例:

PHPStorm+xdebu断点调试演示

我们把php的代码段打开

点击一下,把开关开起来,phpstorm + xdebug是用来代码分析,后期代码审计必须要掌握的东西

找个文件打开

点击调式

发现窗户出现选项,这边是调式的信息和控制端的一些东西

自动打开登录界面

我需要登录后台进行操作

点击上传,后面要有调式的参数XDEBUG_SESSION_START=10695,代码在这里一直暂停

这些是调式的功能键盘

我们点击下一步会一直向下执行,这个页面在加载的时候,会运行这些代码,我这边直接跳了,会不断地加载新的文件

这里还验证数据库账号密码这些东西,进入到mysql里面来

这个文件地址,我们在打开的时候,需要我们登录,登录的时候,账号密码在数据库里面,所以它加载这些文件,其实就是匹配数据库配置文件,从数据库文件去连接数据库,然后进行登录的判断,一般登录完之后,才会进行文件上传

这就是打开界面,他的所有代码执行的每一步,浏览器访问地址的时候,他执行的每一步都在这里,这是来到登录这里来了,执行登录这个操作,等我访问完,页面就出现,觉得慢,可以跳出

我们输入账号密码

登录的一刹那,就会监听到登录的状态

登录的时候,又开始登录的验证,我们直接跳出,因为登录不是我们验证的方向,我们要验证文件上传,所以我要抓文件上传的代码段

就登录到这里来了

这个时候,我们要点文件上传

让他跳出去

点上传图像,我们要让他跳出去,把页面正常显示,然后我在抓包

这里就是文件上传的地方

只要把图像给找到,这些图片信息慢慢就会显示

然后我们再点图片上传,代码还没有截获到,因为数据包还没有产生,这个时候我们上传文件,这个地方就截到了,这个地方就是我们核心数据包

执行执行,开始进行文件上传的操作了

所以,我们可以通过断点调式,可以不用看懂代码,你就能知道他整个执行流程,经历了那些函数、代码,我们就能知道过滤代码在那里

上传的时候会加载其它页面,这个就是断点调式

大个比方,现在1.php在操作,那我们进行抓包,抓到的就是1.php的数据,然后1.php里面可能会引用到2.php的文件里面的函数、自定义函数,但是抓包抓不到2.php,因为他是里面在1运行,不是产生在浏览器,但是我们通过断点调式,可以抓到2.php的数据的,他自动会帮你代码一步步的执行完,从那里引用直接跳到那个文件

打开的所有文件都是我在进行登录上传操作,他加载的所有文件

阅读代码,一步步调用各种文样的代码,断点调式会更细致,没看到的,都帮你加载,抓包只能抓到单一的

这个技术主要是在代码分析,特别像java里面经常用到,因为java代码很多东西,大家可能看不懂,这个时候你用断点调式就能具体分析到指向的文件

代码多的话,我们要一个个追踪,这是很漫长的

Beescms无框架后台任意文件上传

搭建Beescms

把Beescms源码载进去

全局搜索上传,结果太多了,我们不好筛选

我们搜索$_FILES,看那个都行

我们随便打开一个看

我们登录到后台先看一下对应文件

他这个漏洞属于后台的文件上传操作

找一下文件的触发地址

抓取数据包,我们找到up、uppic、file_info这三个参数

我们跟踪代码段,搜索uppic

如果uppic有值,就提交up值

is_uploaded_file定位函数没有定位到,说明是自带函数

判断函数是否有提交,不是验证

up_file自定义函数,进行了相关的验证,我们主要是绕过扩展名这里

pathinfo() 函数

不管我怎么加,他最终取的值就是最后一个点的值

type的定义类型

pathinfo把他分割出来,然后取里面的后缀名,然后判断后缀名跟数组有没有对应上,没有对应上就不让放权

我们可以尝试用%00截断

即使上传了也没有用,因为他保存的文件名还是以.svf,所以这个地方搞不了,没有漏洞

这里有文件上传,我们在这里抓包

搜索变量找到对应的地方就完事了,这些都是接收,没什么好讲的

我们看过滤,主要是看函数,is_uploaded_file判断文件是否存在,然后进行上传

我们追踪up_img,发现是大小、图片格式的判断

这些数据就是我们看到数据包的mime类型,就是看传入的第一个变量的type值和校验的type是否对应,对应就上传成功

这就是典型的没有判断文件后缀,判断的是mime类型

判断之后,进行文件上传,文件上传之后,都没有进行过滤,他这里的判断是非常单一的判断

尝试了一下,发现图片能够上传

我们改成php文件上传,文件上传漏洞就来了

文件上传检测不要检测mime,最重要的检测是检测后缀名,因为mime检测是可以伪造的,以一个图片类型的mime去上传脚本文件

Finecms基于前台MVC任意文件上传

把源码打开,通过他的会员中心发现他有文件上传,从而去判断有没有文件上传的一个过程

我们找功能点,抓到文件上传的包,这个源码就是建立在mvc的框架

这是mvc的执行流程,浏览器先到控制器,把它编译出来,如果有涉及到数据库,数据库还会把值给它,给它之后,它还会返回给控制器,控制器给视图,视图再给浏览器,这是现在源码的主流架构

前端js、css、html文件就是属于view,就是我们看到的界面美观;控制器用来接收数据,model把数据进行处理

很清晰了然,我们直接从目录架构把这个代码找到

框架一般是mvc的框架,mvc是他的统称,框架是别人写好的mvc架构直接套用

我们找到Index文件,找到他打开一看,这里没有看到s参数的接收和处理,所以这种就是典型的mvc代码结构

我们要看入口文件一般在FCPATH、WEBPATH这里

包含文件在执行主程序

这是他核心的一些代码,system/本身自带的代码,dayrui/二次开发自带的代码,所以我们看主要目录dayrui/

我们看路由规则,s一般对应目录,c对应文件,m对应里面的方法

我们找dayrui/目录,一般代码在控制器里面,我们找控制器目录,按照参数的值一个个的找下去,这个地方就是处理文件上传地方的代码

全局搜索upload去找这个结果是非常多的,这也是一种方法,但是比较麻烦,最好的方法是了解这个架构

这是属于逻辑上的安全问题,他在没有验证之前file_put_contents就已经上传,后面就没有了,我们只需要上传就可以了

这地方只要不是权限和磁盘的问题,一般就上传成功了

我们提交测试一下

$new_file表示完整路径,我们把new_file输出一下,就看他完整路径在那里,我们就能判断是否上传成功


我们改一下文件的后缀名,上传成功

CItphp基于前台TP5框架任意文件上传

TP5是mvc框架,mvc只是一个框架代码架构,而这个tp是建立在架构上面的一个名字,mvc就好比我们的操作系统,tp是操作系统里面的一个分类,win7或者win2008,MVC是一个开发思想,主流的开发技术

TP是在这个思想上出来的成品,比如你要进行文件上传,正常来讲,我们从文件接收到文件处理,但是你采用tp去开发的话,他的文件上传全部写好了,上传模块调用一下就可以了,并且thinkphp里面内置了检测机制,你只要按照他规定的写法去写,调用他的东西就完了,那些功能他全部帮你写好了,全部封装到框架里面去了

由于他采用的是框架开发,那就表示核心代码在框架里面,不是他自己的代码里面,与其说审计代码,不如说是审计框架的漏洞,框架的漏洞发现一般是比较牛逼,之前报过thinkphp RCE漏洞,使用thinkphp的网站都会受到影响

我们简要的看一下thinkphp的官方手册,这是国内比较知名的,国外还有其它框架,大部分在市面上是5.0的版本

看一下5.0的开发手册

入口文件public/index.php

index.php打开,app是自身源码的核心代码

由于我要挖漏洞,我们要对源码进行抓包测试,所以我们直接找会员中心,这里有文件上传

访问地址请求是要根据他的版本,url的访问模式决定

在app目录里面找

与其说我们分析代码,不如说我们分析thinkphp的安全性

如果你使用thinkphp,你按照他规定写法去写的话,没有自定义去写东西的话,那么一般会引用thinkphp官方的安全问题,等于和宝塔一样,你用宝塔搭建的网站,就会受到宝塔的保护,他有自身的安全体系,这个thinkphp也是这个意思

如果你使用thinkphp,但是不按他的规定来那就会以自己代码的验证模式去验证,那这个就可以绕过,不是说thinkphp就安全,thinkphp自身的代码是安全的,很少暴露,一旦暴露,危害特别大,但是有可能是代码程序员在开发的时候,不按照他的规定写法去写,也会造成安全问题所以一般针对thinkphp源码网站方向是两个,第一个是看他的写法规不规矩,针对thinkphp自身的代码进行分析,看有没有安全漏洞,但第二个这一点是很难实现的,因为一般这种漏洞不会有,一两年才会爆出一个,一旦这个漏洞报出来,危害是特别大的

他在上传前有个问题,如果info只有的话,就到getSaveName()了

但是getSaveName()没有调用任何东西,就是光秃秃的保存文件的操作

这是一个逻辑上的问题,他在保存文件的时候,并没有进行验证,他的验证代码在move这个地方

但是这里没有调用check,就相当于没有代入到这里验证

我上传图片的时候上传成功

上传php文件失败

数据没有拦截到,很明显的本地验证

我们可以先用合格的文件类型上传,然后抓包,修改文件末尾为.php,成功上传

他自己的代码写的有问题,逻辑上有问题,官方自带的验证他没有调用;如果他用的话,我们就去分析他官方的验证有没有问题,但是一般来说基本上很难分析到,一旦你分析到的话,网上就已经有人爆出了这个漏洞,除非是隐藏特别比较深的,你分析到了,一般thinkphp框架类的,就是看他的写法规不规范,他有没有利用官方推荐的写法去写

mvc是开发的思想,他不是一个东西,php里面的yii框架,java里面有spring框架,st2框架,他们都是基于思想搞出来的成品,这成品里有别人写好的

bash 复制代码
搜索$_FILES->后台中心->上传图像->跟踪代码->逻辑判断
业务功能分析->会员中心->上传图像->跟踪代码->逻辑判断
搜索文件上传->会员中心->上传图像->跟踪代码->逻辑判断

涉及资源:

https://sites.thinkphp.cn/1556331

https://www.cnblogs.com/wsybky/p/8638876.htm

https://blog.csdn.net/yinhangbbbbb/article/details/79247331

https://pan.baidu.com/s/1miETaZcez30imUEA5n2EWw 提: xiao

相关推荐
BingoGo2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
刀法如飞4 天前
一款Go语言Gin框架MVC脚手架,满足大部分场景
go·mvc·gin
JaguarJack5 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php