环境搭建

下载地址:https://www.jb51.net/codes/716819.html#downintro2

环境:

  • php5.6.9
  • MySQL5.7.26
  • Apache2.4.39

下载后将文件夹放到phpstudy下的WWW目录下

image-20251023215244489

导入yccms.sql到本地数据库:
image-20251023215729041

接着修改config配置(将数据库名、用户名、密码填入其中):
image-20251023215802162

image-20251023215901663

然后就可以开始审计了

image-20251023220917483

分析框架

第一步依然是分析框架,先看目录结构:

image-20251023220136227

1
2
3
4
5
6
7
8
9
10
/Admin 后台路径首页,包含/config/run.inc.php文件
/Ceshi 测试页面
/Ceshi2 测试页面
/config 配置变量目录
/Compile 编译目录
/Public 存放缓存代码以及网站相关配置代码
/Uploads 上传图片目录
/view 模板目录
/controller 业务逻辑处理
/model 处理数据逻辑

这里自定义的MVC框架,所以我们优先考虑/controller/model

XSS

第一处

image-20251023222521373

定位到compile/%25%25D8^D83^D83C04B9%25%25createhtml.tpl.php
image-20251023222712331

没有任何过滤:

1
http://127.0.0.1/compile/%25%25D8%5ED83%5ED83C04B9%25%25createhtml.tpl.php?a=html&m=arts&send=%E5%BC%80%E5%A7%8B%E7%94%9F%E6%88%90&art=<script>alert(1)</script>

image-20251023222956885

第二处

功能点在于文章列表处

image-20251024005745525

定位到controller\ArticleAction.class.php文件:
image-20251024010004720

添加文件功能并没有将我们的输入转义

image-20251024010048028

文章列表显示时也并没有转义,所以可以直接XSS:
image-20251024010209366

image-20251024010225933

命令执行

关键点:绕过file_exists函数

定位到/public/class/Factory.class.php
image-20251023225350761

image-20251023225438301

首先该代码类名为Factory{},eval在setAction方法中,通过调用self::getA方法获取参数a,接着看是否有admin权限,然后file_exists()函数检查文件路径是否存在,最后调用eval()执行php代码eval('self::$_obj = new '.ucfirst($_a).'Action();');

这里如果我们要执行eval函数,就得绕过file_exist函数验证,但这个函数是有漏洞的,比如/controller/admin;/../,函数允许路径中有一些特殊字符,并且遇到/../会返回到上级目录,可以利用这个策略逃逸出 file_exists()函数检查。所以直接绕过:

1
Factory();phpinfo();//../

Factory()是为了闭合前面的self::$_obj = new 防止报错

接着我们看哪里调用了该方法:
image-20251023225816983

/config/run.inc.php文件调用了:
image-20251023225902408

接着找哪里包含了该文件/config/run.inc.php

image-20251023231714516

admin\index.php

1
http://127.0.0.1/admin/index.php?a=Factory();phpinfo();//../

image-20251023232040378

count.php直接构造:

1
http://127.0.0.1/config/count.php?a=Factory();phpinfo();//../

image-20251023231951345

search/index.php

1
http://127.0.0.1/search/index.php?a=Factory();phpinfo();//../

image-20251023232214628

任意目录文件删除

第一处

image-20251023234257825

定位到controller\PicAction.class.php文件:
image-20251023234508214

pid为删除的图片文件名,这里可以通过路径遍历实现任意文件删除,先创建一个文件测试:
image-20251023234709335

其功能点对应于删除图片功能:
image-20251023235404148

抓包修改:

image-20251023235444847

image-20251023235504103

文件成功删除

第二处

功能点在于清空目录:

image-20251024002928290

定位到\controller\NavAction.class.php

image-20251024002825577

可以看到navname为要删除清空的目录名,且没有任何过滤,创个文件用于测试:

image-20251024003053153

抓包修改:

image-20251024003121069

image-20251024003315466

成功删除

未授权修改管理员密码

看一下管理员密码修改对应的路由文件:
image-20251024000646945

可以看到这里并没有对用户身份进行验证,所以可以直接更改:
image-20251024000803053