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框架,他们都是基于思想搞出来的成品,这成品里有别人写好的
搜索$_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