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

相关推荐
m0_687399841 分钟前
QT combox 前缀匹配
开发语言·数据库·qt
计算机源码社4 分钟前
分享一个餐饮连锁店点餐系统 餐馆食材采购系统Java、python、php三个版本(源码、调试、LW、开题、PPT)
java·python·php·毕业设计项目·计算机课程设计·计算机毕业设计源码·计算机毕业设计选题
汤兰月9 分钟前
Python中的观察者模式:从基础到实战
开发语言·python·观察者模式
DieSnowK10 分钟前
[C++][第三方库][httplib]详细讲解
服务器·开发语言·c++·http·第三方库·新手向·httplib
火红的小辣椒15 分钟前
PHP反序列化8(phar反序列化)
开发语言·web安全·php
一颗花生米。3 小时前
深入理解JavaScript 的原型继承
java·开发语言·javascript·原型模式
问道飞鱼3 小时前
Java基础-单例模式的实现
java·开发语言·单例模式
学习使我快乐013 小时前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
通信仿真实验室4 小时前
(10)MATLAB莱斯(Rician)衰落信道仿真1
开发语言·matlab
勿语&4 小时前
Element-UI Plus 暗黑主题切换及自定义主题色
开发语言·javascript·ui