yccms审计

##Yccms审计

下载源码http://ahdx.down.chinaz.com/202003/yccms_v3.4.rar

目录整体结构

1

先打开首页

2

很显然 首页没有什么内容

然后打开审计工具

第一处xss

3

在第一行发现了一个xss漏洞 跟进看看

4

直接echo 也没有什么过滤 通过$GET请求 获取$art参数的值 直接用echo输出

直接构造payload:?art=

xss测试

访问这个页面并添加payload

5

Xss成功

第二处任意文件删除

通过自动审计工具 发现了一个任意文件读取或删除

6

7

关键函数在delall函数中 我们往下分析

先是判断post请求中是否有send参数 然后才进入if里面

为好了跟进函数 换到phpstorm

If是通过validate类的isNullString函数来判断post请求中的pic****参数的值

我们跟进这个isNullString函数

8

在验证类里面 isNullString是为了判断pic****的值是否为空 空的话就返回true否则****false

9

在根据if的逻辑来看 就是 如果pic的值是空的话 就进入if 然后执行tool类的函数 这个应该就是提示的

然后将路径和uploads拼接 ROOT_PATH是定义的根目录

打印看看

10

相当于拼接后 是uploads目录下

继续往下看

11

然后通过foreach循环 将pic的值赋给 $_value 然后拼接到路径上

然后将路径放到unlink()函数中进行删除,返回值为ture或者false然后再执行if-else语句

unlink() 函数删除文件。

但是这里没有对路径进行任何的过滤和防护 就可以构造../来跨目录删除其他文件

构造payload:pid[0]=../2.txt

文件删除测试

12

来到后台 其他功能的地方

然后点击删除选择的图片进行抓包

13

将payload加上 提前在文件夹创建好测试文件

14

这是在根目录下创建好的 然后点击go

15

然后查看根目录

16

发现2.txt已经不见了 成功删除

第三处代码执行

通过审计工具 发现一个可能代码执行的漏洞

17

18

为了方便操作 还是习惯用phpstorm 切换回来

19

漏洞存在的点在这个eval函数

先看看整段的逻辑

20

在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函数里面的内容可控 至此 导致代码执行

先找找那个文件调用了这个类

21

Run.inc.php这个文件实例了这个类并且调用了setAction函数

然后寻找哪个文件引用了Run.inc.php文件

22

Admin/index.php 和 count.php 都引用了

构造payload:?a=Factory();phpinfo();//../

先测试 后面在说说为什么这样构造

23

24

两个文件都可以直接命令执行

说说这样构造我自己的理解 file_exits 函数在判断文件的时候

他判断的内容是:

D:/phpstudy_pro/WWW/yccms_v3.4/controller/Factory();phpinfo();//../Action.class.php

这是controller目录

25

判断的时候 函数将/Factory();phpinfo();/ //里面的内容当成了目录 虽然不存在 但是还是继续往后进行的判断 然后遇到../ 就回到了上一级目录controller目录 目录下又有Action.class.php这个文件 所以file_exits 能返回true 所以没有进入if

我在cmd测试也能成功切换

26

然后来到eval函数里面 里面相当于执行的内容是self::$_obj = new Factory();phpinfo();//../Action();

27

Factory() 是为了闭合前面的new 后面的// 则相当于把后面的action() 注释掉了

所以最后phpinfo() 直接执行了

把phpinfo() 换成一句话就直接用蚁剑菜刀进行链接就行了 这里我就不做演示了

这就是我对这个洞的理解 有什么理解不对的地方望师傅们指出

第四处 任意文件上传

逛后台的时候发现一个logo上传

28

点击上传 发现打开了另一个窗口

29

复制url到另一个浏览器打开

30

不需要任何权限验证就直接打开了 只要有这个url 就可以上传文件了

尝试上传

直接尝试图片马 抓包修改后缀php

31

可以看到 d盘下有个logo.php

虽然报错了 打开文件夹看看

32

Php成功上传了 尝试打开 这里是可以不需要登录就可以上传的 只需要这个数据包或者上传文件的url

33

上传成功

通过报错我们找到文件进行代码分析

34

在public/class/LogoUpload.class.php文件下 我们跟进logoupload类

35

36

可以看出只检验了Content-Type 没有检测后缀什么的 所以 图片马抓包改后缀可以直接绕过

第五处任意文件上传

在后台的添加文章的地方 有个编辑器

37

测试方法和上面一下 先上传图片马抓包

38

同样直接上传成功了

39

分析代码

40

还是定位到这个文件public/class/LogoUpload.class.php 继续跟进fileupload

41

也只进行了 type验证

42

绕过方法和上面的任意上传一样 就不多赘述了

删掉cookie等 也是可以上传的

43

第六处未授权修改管理员密码

来到后台的修改密码的地方

44

修改密码进行抓包

45

然后分析源码

在adminaction.class.php中

46

先判断post请求中的send

然后判断用户名和密码是否是空等操作 然后来到editadmin() 进行跟进

47

直接执行

通过代码分析 都没有对是否登录 等权限进行判断 所以删除cookie还是可以直接添加

但是当我把cookie删完的时候包用户名为空的错误 我就不理解了

48

48

为什么爆这个错啊 这里就很懵

望师傅们指点

第七处 验证码重放

50

后台登录错误验证码不刷新 可导致爆破 这个就不做演示了 师傅们都会


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!