贴接上一回,之前写了下某电商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_id
和uid=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以内的数据进行爆破一下即可,等同于无。