漏洞概要
关注数(24)
关注此漏洞
漏洞标题:Hdphp框架 sql注入漏洞(hdcms,官网演示)
提交时间:2015-01-30 16:01
修复时间:2015-04-02 10:23
公开时间:2015-04-02 10:23
漏洞类型:SQL注射漏洞
危害等级:高
自评Rank:20
漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞
Tags标签:
无
漏洞详情
披露状态:
2015-01-30: 细节已通知厂商并且等待厂商处理中
2015-02-04: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-03-31: 细节向核心白帽子及相关领域专家公开
2015-04-10: 细节向普通白帽子公开
2015-04-20: 细节向实习白帽子公开
2015-04-02: 细节向公众公开
简要描述:
前两天看后盾网的视频教程,突然发现了对hdphp的介绍,便尝试了一下。
详细说明:
下面基于sql注入挑几处重点的部分来说说
首先我们需要看下hdphp中获取参数的函数
代码如下
也就是我们可以通过
$id=Q('uid');
来调取请求中的数字,字符串或者数组 并进行赋值。
如果我们通过上面的方式来获取uid,那么的话会从$_REQUEST中来进行获取。
而且没有对请求的数据进行过滤。
通过上面的介绍,我们可以想到几个利用点。
字符型 这样的话 我们需要添加%27 如果开启gpc会被注释
数字型 这种方式 有的时候会这样写代码Q('uid',0,'intval')
数组型 这个是重点,因为intva和gpc我们都无法绕过,可以在当程序员想获取数字的时候,变量数组key中来填充自己的恶意代码。
了解了获取的函数,我们还需要了解一下sql语句执行的函数。
其主要通过Hdphp/lib/driver/db/db.class.php这个里面的文件来进行执行。
我们需要重点看下where函数。
他的主要作用就是对传递的$where进行拼接。
当我们传递数组的时候,他会将key 和 value 进行拼接。这样的话,我们就可以执行一些key中的命令,从而绕过intval 这个函数。 再就是这个函数对key 的过滤实在是不到位。绕过很简单。
用框架的根本原因就是为了快速开发
最简单的获取一个用户id信息的代码如下
$uid=Q(‘uid’,0,’intval’);
$userinfo=M(‘user’)->find($uid);
如果要是这样写的话,我们可以构造如下的sql语句进行检测注入
Index.php?uid[1 like 2 %23]=1
Index.php?uid[1 like 1 %23]=1
漏洞证明:
下面来说一个hdcms 的实例注入漏洞。
首先我们来看HDCMS\Member\Controller\SpaceController.class.php
关键代码如下
修复方案:
可以尝试全局过滤。
另外,对%27等等也进行过滤,不建议依靠gpc.
漏洞回应
厂商回应:
危害等级:无影响厂商忽略
忽略时间:2015-04-02 10:23
厂商回复:
最新状态:
暂无