对 Dbshop 的一次代码审计过程

代码审计 2019-11-10

本文作者:W(信安之路新成员:投稿文章首次入选发布即为信安之路新成员)

官网地址:

http://dbshop.net/

审计版本:v1.3 20190215(目前 dbshop 的最新版本)

从官网介绍得知,dbshop 是一个基于 ZendFramework 2 开发的。很是蛋疼,这个框架,没用过,草草的找了 本文档边看边审计:

https://www.kancloud.cn/thinkphp/zendframework2-quickstart/35940

系统分析

目录分析

img

路由分析

可以看到,这个 cms 应该是用了自定义路由,其路由文件在模板目录下的 config 文件

其路由规则为:

img

img

http://localhost/list

访问 Shopfront/ 下的 Goodslist 里面的 index

http://localhost/list/ajaxGoodsGroupPrice/

访问 Shopfront/ 下的 Goodslist 里面的 ajaxGoodsGroupPrice

系统初步情况

前台能访问的目录有 ShopfrontMobile

其他都是导入了 admin 相关类库,要登入后台才能访问,而我觉得后台注入就有点鸡肋了。暂时先放一放。

img

先看看 shopfront,作为审计菜鸡,我的审计方法就是一个一个方法去看。比如,寻找 sql 注入,找哪个地方可控参数,拼接 sql,再追踪函数,看看能不能构造 exp。

ZendFramework2 中的常见获取方法有 getQuery 和 getPost

所以全局搜索 $this->request->getPost$this->request->getQuery 看看哪处可控,

img

我只关注前台,所以我只是关注 ShopfrontMobile 这两个下的

img

很多都是用 int 处理,没有 int,则是一些步骤,不进入数据库处理,继续往下看吧

呼,终于找到一处。

漏洞分析

在下面文件中的 ajaxGoodsGroupPrice 函数如图:

ShopfrontsrcShopfrontControllerGoodslistController.php

这里,可以知道 goodsIdStr 是通过 post 传入,userGroupId 则是获取用户登入信息,不过没什么关系,只是普通会员,而不是管理员登入。随便注册一个就好了。判断完之后,则将 where 拼接,传入到 listGoodsUsergroupPrice,跟进到 listGoodsUsergroupPrice

img

这里我用了 xedbug+phpstorm 来一步一步跟进,而且为了分析方便,我把 getPost 改成了 getQuery,同时也删掉了用户信息判断

img

在这里下个断点,单步进行 where:

img

调用了 addPredicates,继续下一步,看看 addPredicates

img

这里可以看到,判断传入的 predicates,如果是数组,则遍历出来。如果数组的值为字符串,就用预处理来处理 sql,否则直接传入:

img

这里我们思路缕一缕。这处注入,问题大概就是产生这里了,传入了数组,但是数组键值没赋值,PHP 则会默认赋值为 0 ,我们来看一看代码

array($where)

img

键值为 0,is_string(0) 则为 false:

img

所以思路回到 addPredicates,这里就绕过了预处理。

让我们来再次验证一下思路是否正确。因为原代码写的是 array($where) , 键值是 0,is_string 判断为 false,所以跳过预处理。所以我修改代码,变成这样子

img

尝试一下 输入 1', 访问:

http://127.0.0.1/safe/DBShop_1.3_Release_20190215/DBShop/list/ajaxGoodsGroupPrice?goodsIdStr=1'

已经执行到了预处理模式

![img](https://ask.qcloud


本文由 信安之路 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论