漏洞点 —— 模板写入
在phpcms\modules\dbsource\data.php
文件里有个add()
函数
在80行有个fileputcontent()
函数,将$str
写入caches\caches_template\dbsource\$id.php
文件当中。追踪$str
,首先是查询了数据库的$id
行template
的值,然后经过template_cache
系统类的template_parse
方法对模板内容的过滤
phpcms\libs\classes\template_cache.class.php
接着看phpcms\modules\dbsource\data.php
,使61行的if ($dis_type == 3)
成立,template
值post传参且可控,其他的name,type,dis_type,cache,num
都由上面post传入,70行将内容插入了数据库当中
去caches\caches_template\dbsource\
下 发现多了个文件3.php
,成功写入
先写入系统的一句话
这里虽成功写入了一句话,但发现前面有个限制,如果没定义IN_PHPCMS
常量,就 exit 退出。如果定义了就可以直接访问。
若没定义IN_PHPCMS
常量,存在不能直接访问的情况下,那就说明这个文件是用来被包含的, 那就直接搜哪里可以包含此文件,但这个文件名是动态生成的,所以得搜他所在的目录dbsource
发现全局函数库中有个template_url()
函数构造了我们需要被引用的路径
逻辑就是传入id
,判断文件是否存在,不存在就构建,存在就返回路径,返回的路径有了,那就看看这个函数被谁引用了
phpcms\modules\dbsource\call.php
的_format()
函数中使用了此方法
当$type
为3时,对$id
进行文件包含
说明可以利用,继续看看 _format
函数被谁使用,由于是private
定义了$db
,所以只能在此文件内搜索 然后在get()
函数发现用了_format()
函数
id
是通过我们get传参控制,$str
与我们无关,关键是$data['dis_type']
要等于3,$data
哪来的呢? 发现第二个红框进行了sql查询,正是我们刚开始写一句话时候的传入的dis_type=3
,直接利用则只传参$id
不过好像出错了,data
字段内容莫名带进了sql语句中,这种报错信息肯定是sql语句执行的问题,排查一下(附赠sql注入)
跟进一下对data
参数进行的get_one()
函数
phpcms\model\datacall_model.class.php
看到其对应的datacall
数据表
再跟进到父类phpcms\libs\classes\model.class.php
再查看下datacall
数据表中数据,相应的语句的确是写入了
看能不能使用select 1 limit 1
绕过data limit 1
的sql报错(真是黑白盒测试啊~)
然后发现我的一句话中GET方式执行马子不行,我就换成了POST传参
好了,发现写入了!
我们的马子被执行了
当然,我们也可以使用system()函数执行系统命令
漏洞点 —— sql注入 (赠)
从刚刚上面的sql语句报错得到。。貌似存在个sql注入
那就在data处构造个恶意sql语句吧
ok,写进去了
的确存在sql注入,并将用户名,数据库名及版本信息显示出来
GOT IT!
******************************************************
具体利用方式需根据具体实践场景~