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

QQ截图20220406100108.jpg

相关知识点

关键字搜索

  • 文件上传的相关函数:move_uploaded_file
  • 文件上传的关键字:在写上传的时候会有注释,如//上传
  • 全局变量$_FILES
  • 应用功能抓包:前台会员中心,后台新闻添加等可能存在上传的地方

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

QQ截图20220407090435.jpg

QQ截图20220407090641.jpg

搜索相关关键字

QQ截图20220407090705.jpg

QQ截图20220407090729.jpg

查看其中一个文件上传的处理过程

QQ截图20220407090939.jpg

访问该页面

QQ截图20220407091109.jpg

上传一个doc文件抓包分析看传递的参数

QQ截图20220407091142.jpg

传递的参数:文件说明:file_infouppic,传递的表单名为up

QQ截图20220407091210.jpg

  • fl_html()里面将传递的字符串利用htmlspecialchars将特殊字符转换为 HTML 实体
  • is_uploaded_file()函数检查指定的文件是否是通过 HTTP POST 上传的。如果文件是通过 HTTP POST 上传的返回 TRUE,可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件。
  • $_FILES['up']['tmp_name']is_uploaded_file()要检查的文件,up是要上传的表单名,tmp_name变量中的值就是文件在Web服务器中临时存储的位置(上传文件的临时保存文件)
  • 确定文件的大小限度(这里是系统设置的值)
  • up_file处理上传的文件,并且验证是否符合上传标准
  • 根据up_file返回值(返回的字典形式)确定文件的路径、扩展名、大小、时间
  • 最后在进行数据库的插入操作
  • 定位函数up_file,传递了三个参数:表单名,文件大小,文件类型

QQ截图20220407092814.jpg

QQ截图20220407093222.jpg

  • pathinfo()以数组的形式返回关于上传的文件路径信息,如/testweb/test.txt,生成数组:[dirname] => /testweb;[basename] => test.txt;[extension] => txt;[filename] => test

QQ截图20220407093014.jpg

  • 这里的关键就是绕过pathinfo(),让php文件的格式的能够最后检测,最后测试结果是没办法绕过

更换一个$_FILES函数存在的文件(admin_pic_upload.php)

QQ截图20220407093729.jpg

抓包分析

QQ截图20220407093807.jpg

QQ截图20220407093802.jpg

处理图片上传的函数是up_img(),还传递了一个数组,因该是允许上传文件的格式,定点查询这里函数

QQ截图20220407094621.jpg

pathinfo()函数以数组的形式返回关于文件路径的信息。[dirname]: 目录路径;[basename]: 文件名;[extension]: 文件后缀名;[filename]: 不包含后缀的文件名(注意:这里没有检测[extension],之前检测了这里是无法绕过的)

QQ截图20220407094651.jpg

将临时文件上传到设置路径上

QQ截图20220407094722.jpg

抓包修改文件类型

QQ截图20220407094744.jpg

在上传目录查看,由于随机有规律,可以尝试根据规律进行穷举尝试,或者通过其他方式获得文件名

QQ截图20220407094802.jpg

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

QQ截图20220407095128.jpg

对头像上传进行抓包分析(上传test.jpg文件,这是一个基于MVC的框架的网站),s对应目录,c对应文件名,m对应方法

QQ截图20220407095159.jpg

在MVC框架内的controller中,查找member目录,文件名为account,函数为upload(一般核心代码都在控制器里面)

QQ截图20220407095330.jpg

将file进行正则式匹配,取第三个(这里应该是文件的路径+文件后缀名),然后将传参的值进行替换,解码,写入新文件(在这里没有存在任何的过滤)

QQ截图20220407095504.jpg

QQ截图20220407095509.jpg

直接上传文件,返回1,文件查看(发现了四张图片)

QQ截图20220407095544.jpg

QQ截图20220407095548.jpg

将目录文件删除,修改数据包的文件头为PHP格式,上传后返回报错

QQ截图20220407095612.jpg

但是文件夹有第一个文件的php,漏洞的原因就是没有严格过滤文件名

QQ截图20220407095637.jpg