前言
本次所创建的环境为php5.5.38+Apache
本次审计纯属分享审计过程和审计思路,请勿用于非法用途!
一、环境搭建
访问该url下载源码http://ahdx.down.chinaz.com/202003/yccms_v3.4.rar
将下载下来的源码放到phpstudy上

导入yccms.sql到本地数据库

修改config配置(将数据库名、用户名、密码填入其中)

二、代码审计
源码如下,分为如下几个部分

  • /Admin 后台路径首页,包含/config/run.inc.php文件
  • /Ceshi 测试页面
  • /Ceshi2 测试页面
  • /config 配置变量目录
  • /Compile 编译目录
  • /Public 存放缓存代码以及网站相关配置代码
  • /Uploads 上传图片目录
  • /view 模板目录


将yccms网站源码放到seay源代码审计系统中,开启自动审计

三、XSS注入漏洞
通过自动化审计,查找到第一条数据可能存在XSS注入攻击

点击进去查看源代码发现该网页通过$GET请求获取$art参数,然后再echo输出$art的值

访问该网站,并且构造参数?art=<script>alert(1)</script>,XSS注入验证成功

四、命令执行漏洞
通过审计发现存在一条命令执行漏洞,该漏洞点在/public/class/Factory.class.php

点击进来审计源代码,分析漏洞构成原因
1.首先该代码的类名为Factory{},该类使用了setAction() 方法,通过调用self:: getA() 方法获取 $a参数进行跳转检查操作,看是否是admin权限,然后通过file_exists()函数检查文件路径是否存在,最后调用eval()执行php代码eval('self::$_obj = new '.ucfirst($_a).'Action();');

2.这里我们要利用eval函数,首先要绕过file_exists()函数的验证,这个函数在进行检查会有一个bug,比如/controller/admin;/../,函数允许路径中有一些特殊字符,并且遇到/../会返回到上级目录,可以利用这个策略逃逸出 file_exists()函数检查。
3.构造payload--->Factory();phpinfo();//../
Factory()是为了闭合eval中的new实例化,然后后面的是执行的命令语句,所以我们要找有生成Factory()实例的文件/config/run.inc.php

4.查找包含/config/run.inc.php该文件的文件/admin/index.php、/config/count.php

5.构造payload获取webshell
http://127.0.0.1/yccms/config/count.php?a=Factory();@eval($_POST[v]);//../
一句话木马连接成功,获取网站的shell

五、任意文件删除漏洞
全局搜索发现一条可能存在任意文件删除和读取的记录

点击跳转到源码分析

  • 1.通过POST请求获取参数pid
  • 2.图片的根路径为/uploads
  • 3.将参数pid的值赋给value,将pid的值放在根目录后面,即/uploads/$pid
  • 4.将路径放到unlink()函数中进行删除,返回值为ture或者false然后再执行if-else语句


这里我们就可以创建一个测试文件test_su.txt,然后构造$pid的值来进行跨路径删除

在yccms后台的图片管理模块对图片进行删除,然后通过burp软件抓包获取请求包

在请求包中修改post值($pid),pid=../test_su.txt(因为现在是在uploads下,测试文件在上一级目录,所以构造该payload)

测试文件被删除,任意文件删除测试成功

六、暴力破解漏洞
该cms具有验证码的功能模块,但是验证码只验证一次,之后就不再刷新了,所以可以通过burp软件抓包,然后对账号密码进行暴力破解

Yccms的默认账号密码为admin/admin,在验证成功的时候响应包的内容为2

当验证失败的时候响应包的内容为1

七、任意密码修改
全局搜索修改密码的模块/controller/AdminAction.class.php,该模块代码只验证了用户名、密码、校验密码的逻辑,没有对用户的权限进行验证;如果用户名、密码、第二次校验密码逻辑正确则调用函数editAdmin()

跟踪函数到/model/AdminModel.class.php文件下,editAdmin()函数是一个sql语句,用于更新密码的,也没有对admin权限进行验证

找到网页的修改密码模块,先去看一下请求包的结构,这样方便我们构造新的越权修改密码的payload

通过burp软件抓包可知请求包结构

退出admin账号登录,在没有登录的情况下验证payload是否有效,回复包回复修改成功,只需验证新密码是否能改成功登录即可


验证新密码登录成功,证明漏洞存在

总结
本次的代码审计中,还发现了该cms存在越权访问漏洞、目录遍历漏洞,在未登录管理员的情况下,输入网站部分路径可以对后台模块进行操作,例如越权操作文件上传漏洞;目录遍历能够访问某一目录下的子目录文件,本次代码审计到此结束,谢谢各位观看!

点击收藏 | 4 关注 | 2
登录 后跟帖