代码审计之 zzzphp

作者: 蚁景科技 | 来源:发表于2018-11-05 15:23 被阅读117次

    本文转自公众号:信安之路

    想想很久都没有发布代码审计的文章了,最近忙于开发任务加上最近状态不太好,哎研发dog。

    这里给去中心化漏洞平台拉个广告(域名:dvpnet.io),因为有朋友在里面工作,之前叫我去一起挖交易所漏洞,然后被狠狠打击了一波自信。

    周五的时候打赌看谁挖的多,周末两天我提交了 14 个洞,不是撞洞就是不符合规则。而大佬呢?猛的一B,四个号全部上了10月榜单前十。有机会去北京一定要揍...吃...他一顿狠的,气啊!!!

    SQL 注入

    版本:zzzcms php 1.5.5 181018

    安装好环境后跟入口文件,至此处:

    ParseGlobal(G('sid'), G('cid'));跟进去后是这样的:

    在跟进db_load_one方法看看:

    到此凭经验来看,ParseGlobal()方法内传递的参数会造成SQL注入,db_load_one()方法中的130行会将&符号替换成and,而ifnum()方法仅是一个判断$where是否是整形。

    接下来就是向上查找传递的$sid、$cid,注意到在进ParseGlobal()时,先用了G()方法,而它实践上是在获取$GLOBALS['sid']。

    随后在ParseGlobal(G('sid'), G('cid'));的上面一行,$location = getlocation();中找到了sid。

    下面代码的关键位置我已经加了注释说明:

    可以看到,sid是通过 URL 赋值的,通过$arr1中的about定位到漏洞出现位置

    正常访问:http://127.0.0.1/?about/22_1

    注入查询:http://127.0.0.1/?about/22&1=2_1

    此时的 SQL:

    综合上面的东西,组合URL时不能使用/**/注释来充当空格,现在让我们来爆下数据库名称:

    payload:?about/22&ascii(mid(database(),1,1))=122_1

    未修复的后台管理万能密码,首先搜了一下 cnvd:

    先看了看当前的版本是1.5.5,所有想验证下这个漏洞是否被修复了。首先找到后台登录处的代码:

    用户名是$adminname,这里的getform()是去POST中找adminname这个参数,如果没找到则返回null。

    getform()里面还有一个txt_html()转义函数,但是在这里并没有什么 luan 用。

    可以看到有个htmlspecialchars函数,但设置第二个参数,导致它不会过滤单引号,然后就沦陷了。这是正常的包:

    这是 SQL 注入导致的万能登录包:

    虽然最终弹出了一个script,但cookie已经被写入,我们去前台刷新下页面就可以直接进入后台。

    原因是,当然我们绕过第一段账号密码判断的 SQl 后,存在一个login_in($adminname);

    可以看到,这里是一个foreach循环,当$username传入含or的恶意SQL时,查询出来的$data是多条记录。这里存在逻辑错误,首先判断账号是否具备管理员,如果不是会exit退出。也就说,查出来的$data在前面的循环中成功写入cookie的一定是管理员账号。不仅如此,这里还会输出后台所有管理员的账号。我特意去后台新增了一个账号,admintest。

    后台上传 GETSHELL

    我不怎喜欢审计后台的东西,可是已经审计到这了,那就看看有没有后台可以getshell的地方。答案当然是有的,前提是你拿到的管理组有上传设置的编辑权限。

    首先在文件简历->上传设置->附件类型中,加入一个 php。

    然后在任意文章或者内容管理页面,上传图片并抓包:

    验证下:

    关键代码在inc/zzz_file.php中的upload()方法,会取出我们刚才加在附件类型中的 php,进行文件名后缀的白名单比对。


    本文仅用于普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征等,若读者因此做出危害网络安全的行为后果自负,与合天智汇以及原作者无关,特此声明。

    相关文章

      网友评论

        本文标题:代码审计之 zzzphp

        本文链接:https://www.haomeiwen.com/subject/bbysxqtx.html