前言

贴接上一回,之前写了下某电商cms低版本前台任意代码执行漏洞分析,这一次讲讲最新版本前台一个无须登录的sql注入与及绕waf,算是一个小0day,没有什么新东西,但是没有什么限制的洞还是很少见的(本人能力有限)。为了不影响厂商,下面涉及到厂商的地方用xxxxx字样进行打码。

系统简介

系统的基础知识就不多讲了,参考之前帖子说的系统简介

高版本的变化主要是调整了配置文件与GET、POST全局变量注册的顺序,与及对传入的数据加了addslashes。(其实就是这里的内容漏洞修复

漏洞分析

看到代码文件:inc\module\apidata.php

顾名思义这是一个api接口调用的处理文件,其整体逻辑也是如此

if代码段就是对API类的创建与调用

跟进xxx_API类:inc\lib\xxxxx_API.php

看到构造方法里面的代码:

OK,注意到内部的access_token是硬编码,那么我们就可以传入相同的数据,轻松通过验证。

接下来就是寻找可以利用的方法。

因为程序使用了addslashes进行过滤,那么我们要sql注入就不能是被单引号或者双引号包裹的,不能被强转数据类型(intval)。

正则匹配一下:[\"|\']\.\$[0-9a-zA-Z_]+[\.|;],匹配用单或双引号包裹的字符串,用点号两边连接变量,或者左边点号连接,右边分号结束的数据。
形如:".$xxx."'.$xxx.',".$xxx;等。

有很多,刷选能用的,因为我们需要在api方法里面用到,需要同时满足两个条件:
1,存在注入
2,在api类里面的方法调用到了

比如inc\lib\users.php文件中的get_fav方法,其中$goods_id变量就没有单双引号包裹,且在方法内变量没有被强转数据类型。

直接拼接存到$where变量,后面又拼接到sql语句中。

查找定位方法,发现用在了api类的goods方法。

分析其逻辑

其中get_goods方法是根据$goods_id来获取商品数据,在拼接到sql语句前会进行intval强转,但这个并不影响,只是在方法内对形参进行强转,不影响原来的参数。

那么只需要找到存在的一个商品的ID,传入到goods_iduid=1即可。

综合漏洞点的sql语句,payload大概为这样子:

http://127.0.0.1/apidata.html?act=goods&goods_id=122+and+updatexml(1,concat(0x7e,user,0x7e),1)--&uid=1&access_token=thisisaccess_token

这样是没有问题,但是底层是有waf过滤的,我们换一个payload,比如去获取管理员的用户名。

就会提示网址有误,原因是用了select from,匹配上了waf。

分析waf代码逻辑

index.php里面的代码逻辑

那么思路就很简单了,我们根本不需要去硬干waf,在GET里面传入admin.html,在POST里面传入p=apidata即可绕过waf,但又能够正常访问到我们的目标函数。

至此,漏洞分析结束。这里只是以一个函数为例,其他函数应该也是有问题,但原理相同,不再一一举例。

总结

总的来说,漏洞的原理就是api接口的access_token用了硬编码,使我们可以直接'绕过'验证,使用api接口里面有漏洞的方法,还有就是waf使用了白名单过滤以及全局变量注册,使得我们可以通过覆盖变量的方式,使请求在白名单内,最终轻松绕过waf。

漏洞没有登录或者是其他特殊的限制,至于商品ID的问题只需要对100~1000以内的数据进行爆破一下即可,等同于无。

源链接

Hacking more

...