yccms审计
##Yccms审计
下载源码http://ahdx.down.chinaz.com/202003/yccms_v3.4.rar
目录整体结构
先打开首页
很显然 首页没有什么内容
然后打开审计工具
第一处xss
在第一行发现了一个xss漏洞 跟进看看
直接echo 也没有什么过滤 通过$GET请求 获取$art参数的值 直接用echo输出
直接构造payload:?art=
xss测试
访问这个页面并添加payload
Xss成功
第二处任意文件删除
通过自动审计工具 发现了一个任意文件读取或删除
关键函数在delall函数中 我们往下分析
先是判断post请求中是否有send参数 然后才进入if里面
为好了跟进函数 换到phpstorm
If是通过validate类的isNullString函数来判断post请求中的pic****参数的值
我们跟进这个isNullString函数
在验证类里面 isNullString是为了判断pic****的值是否为空 空的话就返回true否则****false
在根据if的逻辑来看 就是 如果pic的值是空的话 就进入if 然后执行tool类的函数 这个应该就是提示的
然后将路径和uploads拼接 ROOT_PATH是定义的根目录
打印看看
相当于拼接后 是uploads目录下
继续往下看
然后通过foreach循环 将pic的值赋给 $_value 然后拼接到路径上
然后将路径放到unlink()函数中进行删除,返回值为ture或者false然后再执行if-else语句
unlink() 函数删除文件。
但是这里没有对路径进行任何的过滤和防护 就可以构造../来跨目录删除其他文件
构造payload:pid[0]=../2.txt
文件删除测试
来到后台 其他功能的地方
然后点击删除选择的图片进行抓包
将payload加上 提前在文件夹创建好测试文件
这是在根目录下创建好的 然后点击go
然后查看根目录
发现2.txt已经不见了 成功删除
第三处代码执行
通过审计工具 发现一个可能代码执行的漏洞
为了方便操作 还是习惯用phpstorm 切换回来
漏洞存在的点在这个eval函数
先看看整段的逻辑
在factory类中 的setAction函数里 这个函数先通过getA 获取get请求a的值
然后通过if判断a的值 是否为数组里面的 然后判断session是否是admin权限 进行是否跳转到登录
但这一步 直接不进入if判断 不久跳过这个session判断了嘛
往后看
然后通过file_exits 函数判断文件是否存在 不存在则给$_a赋值login
file_exists() 函数检查文件或目录是否存在。
然后进入到eval函数执行self::$_obj = new ‘.ucfirst($_a).’Action();
ucfirst() 函数把字符串中的首字符转换为大写。
进入eval函数的内容没有经过任何过滤 又因为$_a 是通过get请求获取的 可控 就导致了 eval函数里面的内容可控 至此 导致代码执行
先找找那个文件调用了这个类
Run.inc.php这个文件实例了这个类并且调用了setAction函数
然后寻找哪个文件引用了Run.inc.php文件
Admin/index.php 和 count.php 都引用了
构造payload:?a=Factory();phpinfo();//../
先测试 后面在说说为什么这样构造
两个文件都可以直接命令执行
说说这样构造我自己的理解 file_exits 函数在判断文件的时候
他判断的内容是:
D:/phpstudy_pro/WWW/yccms_v3.4/controller/Factory();phpinfo();//../Action.class.php
这是controller目录
判断的时候 函数将/Factory();phpinfo();/ //里面的内容当成了目录 虽然不存在 但是还是继续往后进行的判断 然后遇到../ 就回到了上一级目录controller目录 目录下又有Action.class.php这个文件 所以file_exits 能返回true 所以没有进入if
我在cmd测试也能成功切换
然后来到eval函数里面 里面相当于执行的内容是self::$_obj = new Factory();phpinfo();//../Action();
Factory() 是为了闭合前面的new 后面的// 则相当于把后面的action() 注释掉了
所以最后phpinfo() 直接执行了
把phpinfo() 换成一句话就直接用蚁剑菜刀进行链接就行了 这里我就不做演示了
这就是我对这个洞的理解 有什么理解不对的地方望师傅们指出
第四处 任意文件上传
逛后台的时候发现一个logo上传
点击上传 发现打开了另一个窗口
复制url到另一个浏览器打开
不需要任何权限验证就直接打开了 只要有这个url 就可以上传文件了
尝试上传
直接尝试图片马 抓包修改后缀php
可以看到 d盘下有个logo.php
虽然报错了 打开文件夹看看
Php成功上传了 尝试打开 这里是可以不需要登录就可以上传的 只需要这个数据包或者上传文件的url
上传成功
通过报错我们找到文件进行代码分析
在public/class/LogoUpload.class.php文件下 我们跟进logoupload类
可以看出只检验了Content-Type 没有检测后缀什么的 所以 图片马抓包改后缀可以直接绕过
第五处任意文件上传
在后台的添加文章的地方 有个编辑器
测试方法和上面一下 先上传图片马抓包
同样直接上传成功了
分析代码
还是定位到这个文件public/class/LogoUpload.class.php 继续跟进fileupload
也只进行了 type验证
绕过方法和上面的任意上传一样 就不多赘述了
删掉cookie等 也是可以上传的
第六处未授权修改管理员密码
来到后台的修改密码的地方
修改密码进行抓包
然后分析源码
在adminaction.class.php中
先判断post请求中的send
然后判断用户名和密码是否是空等操作 然后来到editadmin() 进行跟进
直接执行
通过代码分析 都没有对是否登录 等权限进行判断 所以删除cookie还是可以直接添加
但是当我把cookie删完的时候包用户名为空的错误 我就不理解了
为什么爆这个错啊 这里就很懵
望师傅们指点
第七处 验证码重放
后台登录错误验证码不刷新 可导致爆破 这个就不做演示了 师傅们都会
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!