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漏洞
/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文件,现在已经被删除,任意文件删除漏洞验证成功
在店铺管理处,可以搜索店铺名称:
我们找到这里的路由,查看一下代码:
这里的$_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' and updatexml(1,concat(0x7e,user(),0x7e,database()),1)#
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报错注入