ZZCMS v8.2 前台Insert注入+任意文件删除

前几天看了水泡泡老哥的zzcms的审计,在论坛上一搜发现这个cms有不少洞。听说很适合小白练手,所以来瞅一瞅。不知道我发现的这个洞是不是已经被爆过了,如果雷同,纯属巧合。

一.Insert注入,直接返回数据
先从默认页index.php入手:
1077935-20181228163730695-1993103267.png

跟进inc/conn.php看一下:
1077935-20181228163738497-714995709.png

发现include了好多文件,可以看一下每一行的注释,大多数都是定义一些常量。只有inc/function.php和inc/stopsqlin.php不是。先进入function.php看一下,大都是一些公用函数的定义。看看stopsqlin.php:
1077935-20181228163743588-1149313674.png

第一个if用处注释中有了,这里就不说了。直接看黄标,这里用zc_check()处理了$_GET,$_POST和$_COOKIE。这个函数在上面定义了,基本就是在引号前面加个\转义。但是很容易发现,这里并没有过滤$_REQUEST。所以如果某段程序中用$_REQUEST直接获取客户端传来的参数的话,就有可能产生漏洞,可以直接全局搜索一下$_REQUEST。可是我当时没想到,中间又走了些弯路就不说了。直接来到user/adv.php:
1077935-20181228163748524-1357841375.png

可以看到,在37行之后,用REQUEST赋值了很多变量,而这些变量都是原生态的~
从文件头开始看:
1077935-20181228163754570-1014802427.png

inc/conn.php我们一开始就看过了,主要就是对$_GET,$_POST和$_COOKIE做了过滤。跟进下面这个check.php看看:
1077935-20181228163800001-1093341427.png

注意第4行的if条件,如果两个cookie都没set的话,就说明没有登录,进入第一个语句块。重点来了,这里直接用了个js的前端跳转,并没有exit()程序,所以说后面的代码还是会执行的。看一下第二个语句块,这里先query一下数据库,判断是否有返回信息,如果没有的话再来一个js跳转(13行),否则巴拉巴拉巴拉。所以总结下来,这个文件就是用来判断你有没有登录,不过这两个前端跳转形同虚设,后面的代码还是会执行的。回到上个文件adv.php,从那个REQUEST赋值往下看,看到97行有个if:
1077935-20181228163806129-537435708.png

$action是可控的,进去之后就是个insert语句,语句直接拼接了我们上面通过$_REQUEST获得的变量,所以一个Insert注入就这么形成了。仔细看一下这个insert语句,前面的adv, company, advlink, img都是可控的,后面还有个$_COOKIE"UserName"也是可控的,只有最后两个参数不可控。
下面用BurpSuite演示一下,五个可控的点已经标出来了:
点击下载
瞅一眼数据库(最后一行,别看岔了):
1077935-20181228163814648-1047266825.png

插入成功!既然已经插入了,下面就要找一下在哪里能把这个结果给输出出来。继续往下看,发现输出就在下面:
1077935-20181228163820647-661428416.png

110行有个select,根据username字段检索表,然后输出在那几个红线位置。这里回想一下,在上一个insert中,username是可控的,由$_COOKIE['UserName']控制,而这里的username也是如此。但是由于insert在select的前面,所以在我们第一次请求中,结果中就已经包含了我们注入的信息。回到BurpSuite看一看,果然:
1077935-20181228163826286-1128657797.png

返回很多,不只这一个,既然先看到他,就拿他爆数据吧。回到insert语句,由于这几个变量都是被包在单引号内的,而且引号并没有被转义,所以直接常规操作。
1077935-20181228163830875-1455944454.png

注意一下红线部分,由于adv直接闭合了括号,所以这里的username不再是从cookie中获取的了,而是这个5678(必须是唯一的,否则后面会select出多行记录)。因此Cookie的值也是5678,这个是用于select取数据。这里有个小坑,adv这个字段好像是不能重复的,所以测试的时候注意一下。
请求之后看一下数据库(最后一行):
1077935-20181228163838719-334008363.png

这里可以看到,advlink已经被注入了user()了。看一下页面:
1077935-20181228163842510-1388519025.png

总结一下:
1.代码仅过滤了$_GET, $_POST, $_COOKIE, 而没有过滤$_REQUEST。
2.检查登录时,如果不符合要求并没有用exit()退出程序。

二.任意文件删除
还是上面那个文件:adv.php,还是上面那个图,我直接给复制过来了。看看第二个if,$oldimg是REQUEST得到的变量,所以这里有个任意文件删除。
1077935-20181228163847422-85489724.png

1077935-20181228163851520-126663185.png

根目录新建了个文件:DeleteMeBro.php。由于代码中已经将$oldimg与../拼接了(101行),所以参数直接写文件名就好:
1077935-20181228163855774-674917992.png

回文件夹看看,删除成功。
ps: 我发现这个洞和水泡泡之前发的那个任意文件删除一模一样。。。

转载于:https://www.cnblogs.com/litlife/p/8670047.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值