代码审计之 zzzphp

本文作者:0x584A(信安之路作者团队成员)

想想很久都没有发布代码审计的文章了,最近忙于开发任务加上最近状态不太好,哎研发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,进行文件名后缀的白名单比对。

原文发布于微信公众号 - 信安之路(xazlsec)

原文发表时间:2018-10-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SDNLAB

DLUX组件扩展上篇-原理

作者: M.S-Group.皮皮熊,M.S-Group组织主要成员之一,数通行业老兵,精通传统数通网络技术,SDN/NFV新技术的狂热拥护者!

12140
来自专栏腾讯大数据的专栏

大型web系统数据缓存设计

1. 前言 在高访问量的web系统中,缓存几乎是离不开的;但是一个适当、高效的缓存方案设计却并不容易;所以接下来将讨论一下应用系统缓存的设计方面应该注意哪些...

50360
来自专栏Java架构沉思录

单线程的Redis为什么这么快?

https://blog.csdn.net/xlgen157387/article/details/79470556

22330
来自专栏Python中文社区

Python开源项目介绍:网站日志分析工具

日志分析在web系统中故障排查、性能分析方面有着非常重要的作用。该工具的侧重点不是通常的PV,UV等展示,而是在指定时间段内提供细粒度(最小分钟级别,即一分钟内...

20030
来自专栏蓝天

apache thrift的不足

thrift作为RPC优点明显,那些还在坚持使用消息排斥RPC的同学,都应当亲自接触体验一下。 

10910
来自专栏数据之美

玩转 SHELL 脚本之:Shell 命令 Buffer 知多少?

1、问题: 下午有同学问了这么一个问题: tail -n +$(tail -n1 /root/tmp/n) -F /root/tmp/ip.txt 2>...

45260
来自专栏杨建荣的学习笔记

使用sysbench压力测试MySQL(二)

昨天有了第一篇的测试之后,仅仅是一个开始。 我接下来做sysbench压测的主要思路是根据现有的配置作出调整,能够持续性的优化和压力测试达到目的,而...

90790
来自专栏phodal

编辑-发布-开发分离:git作为NoSQL数据库

动态网页是下一个要解决的难题。我们从数据库中读取数据,再用动态去渲染出一个静态页面,并且缓存服务器来缓存这个页面。既然我们都可以用Varnish、Squid这样...

214100
来自专栏架构师之路

为什么说要搞定微服务架构,先搞定RPC框架?

第一章聊了【“为什么要进行服务化,服务化究竟解决什么问题”】 第二章聊了【“微服务的服务粒度选型”】 今天开始聊一些微服务的实践,第一块,RPC框架的原理及实践...

41880
来自专栏owent

关于BUS通信系统的一些思考(一)

如何保证一个进程或线程能安全稳定地把一段消息发送到另一个进程和线程,甚至是另一台机器的进程或线程,再或是要通过代理转发到另一个进程或线程,一直是一个比较麻烦的问...

16310

扫码关注云+社区

领取腾讯云代金券