记录一次MVC框架的代码审计

admin 2024年5月17日20:54:24评论17 views字数 1291阅读4分18秒阅读模式

   说在前面:好久没更新文章了,本来都有停更的念头了,但觉得还是要写点东西往外发好督促自己学习。之前就有在学习审计,但只是再审一些无框架的老源码而且没审几套就半途而废了,现在打算再拾起来深入学习。这次选取的是Yccms3.4。打算审几套简单的mvc再去学thinkphp,然后再学java。

    首先拿到源码先关注config,controller,public这种目录。在config目录发现run.ini.php,查看内容应该是入口文件,第29行调用Factory类的setAtion方法,然后用它的返回结果再去调用run方法。

记录一次MVC框架的代码审计

    先追踪看下setAction方法内容,定义变量$_a去调用getA(),说白了就是去接收get方式传进来的a的值,然后使用in_array函数去比对传进来的值是否在已定义的数组中,同时去检查session中admin的值来判断登陆状态。如果登陆了且传进的值在所定义的数组中就去调用controller下的类文件。

记录一次MVC框架的代码审计

记录一次MVC框架的代码审计


   然后再去看run()的内容,先定义了$_m变量去结束get传进来的m的值,然后使用method_exists()去检测此方法是否存在,如果存在就使用eval函数去调用它,比如我们在增加文章处抓包可以看到?a=article&m=add,其实就是去调用了Article中的add方法。

记录一次MVC框架的代码审计

前面的准备工作差不多了,下面开审!



漏洞一:代码执行漏洞

  漏洞位于Factory.class.php中,乍一看好像没啥问题,但其实file_exists()函数有一个自身缺陷就是遇到/../会将/前的内容当成一个文件夹同时/../也类似于../向上走了一级,所以新建了一级又向上走了一级相当于原地不动但是我们的恶意字符串就成功逃逸了出来。这里的Factory();是去闭合前面的实例化关键字new,然后再跟上我们的语句。

记录一次MVC框架的代码审计

记录一次MVC框架的代码审计


  然后我们可以去看哪些文件去调用了这个类,然后哪些地方又包含了这个文件。

记录一次MVC框架的代码审计

记录一次MVC框架的代码审计

记录一次MVC框架的代码审计


漏洞二:两处任意文件上传

   全局搜索upload发现主要集中在两处,分析后一处是网站logo上传,另一处是网站编辑器的上传

记录一次MVC框架的代码审计


  先看LogoUpload.class.php,他是在CallAction.class.php处被调用的,继续追踪LogoUpload(),提前定义了图片类型再去使用checkType()去检查,虽然最后提示系统不支持但仍然上传成功了

记录一次MVC框架的代码审计

记录一次MVC框架的代码审计

记录一次MVC框架的代码审计

记录一次MVC框架的代码审计


第二处文件上传在编辑器上传处

  调用了FileUpload方法,同样是定义了图片的类型在数组里然后去匹配,伪造mine类型即可绕过

记录一次MVC框架的代码审计

记录一次MVC框架的代码审计

记录一次MVC框架的代码审计

记录一次MVC框架的代码审计


漏洞三:任意文件删除

  漏洞位于PicAction.class.php处,其实源码有很多删除的功能点,比如删除分类、删除文章,但是都是去调用了数据库查询的结果去删除不是直接去接收传进来的值,所以就相对来说安全了点。Pic这个点算是一个漏网之鱼吧,使用foreach函数去将POST传进来的pid的值作为删除的文件名,然后在拼接一个目录/uploads/,由于缺少对../的限制所以很容易就能实现任意文件删除。

记录一次MVC框架的代码审计

记录一次MVC框架的代码审计





原文始发于微信公众号(飞奔的狸花猫):记录一次MVC框架的代码审计

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月17日20:54:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记录一次MVC框架的代码审计https://cn-sec.com/archives/2491133.html

发表评论

匿名网友 填写信息