WeCenter v3.3.4前台SQL注入漏洞复现
- 2020 年 2 月 18 日
- 筆記
本文是学习 https://xz.aliyun.com/t/7077 结果。
./system/aws_model.inc.php 有个反序列化的利用点:


遍历_shutdown_query的值带入query。
跟入query,直接拼接可造成sql注入漏洞:

现在需要的就是找个反序列化的利用点。这里提下常见的反序列化的利用:
__construct():当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的。
__destruct():当对象被销毁时会自动调用。
__wakeup() :unserialize()时会自动调用。
做个简单的反序列化利用demo。
1.php会接收传参进行反序列化,并把默认的123写入shell.php中,并做包含:

那我们构造恶意的序列化值,2.php:


提交后成功执行魔术方法:

回到WeCenter,作者并未发现unserialize可利用点,后使用了Phar反序列化。那这里再提下Phar反序列化的常规利用,在seebug文章中有提到:

我们可以简单理解为文件操作配合Phar可以进行反序列化。我们改下上面的demo。
3.php做生成phar文件,生成后后缀可随便,我改成了jpg:

4.php做触发phar反序列化操作:

访问4.php,file_get_contents触发phar反序列化,更改test内容为phpinfo:

我们再次回到WeCenter,现在我们就是找能够触发文件操作的地方。
./models/account.php

其中file_get_contents符合我们要找的东西,并$headimgurl参数可控的话,我们就可以利用phar进行反序列化。
我们再看谁调用了
associate_remote_avatar。
./app/account/ajax.php
synch_img_action方法

给入associate_remote_avatar就是上图的$wxuser['headimgurl'],$wxuser来源于:

而$wxuser['headimgurl']来源于这,也就是从users_weixin表里面取出了headimgurl的字段值:

因此我们找操作users_weixin表的地方。
./models/openid/weixin/weixin.php
bind_account方法会把接收到的$access_user['headimgurl']入库:

我们再找哪个地方调用了bind_account。
./app/m/weixin.php
binding_action方法会调用bind_account:

该方法传给bind_account中$access_user的值来源于$WXConnect['access_user']:

$WXConnect来源于这里:

也就是$WXConnect的值就是cookie中json解码后的值(前缀_WXConnect)。
那我们现在理下攻击思路:
1、生成恶意cookie – $WXConnect
2、binding_action取$WXConnect赋给bind_account
3、bind_account得到$WXConnect后,把值中的headimgurl入库
4、synch_img_action读库
5、把读库的结果赋值给associate_remote_avatar
6、associate_remote_avatar把取到的值给file_get_contents,触发phar反序列化
我们先根据一开始提到的出现的漏洞类生成恶意的phar:

我们再根据入库的字段啥的生成json格式的数据:

最后发起攻击,先给binding_action发送恶意数据,让他取到cookie后给bind_account:

bind_account得到$WXConnect后,把值中的headimgurl入库:

synch_img_action读库后赋值给associate_remote_avatar,associate_remote_avatar把取到的值给file_get_contents,触发phar反序列化:
