ICMSv7.0.1 admincp.class.php sql注入分析
代码审计学习中
下载地址:ICMSv7.0.1
漏洞分析
出现漏洞的地方在 app\admincp\admincp.class.php 的init函数
在用户登陆验证,调用members::check_login(),跟进,其代码如下:
$a
和$p
分别是用户名和密码,会先经过escapeStr的过滤,若不为空且通过了self::check($a,$p)的检查即可登陆成功。若为空,则会从cookie里获取值,并通过list($a,$p) = explode($sep,authcode($auth,'DECODE'));
获取到用户名和密码,并进行检查self::check($a,$p)。
self::check()的部分代码:
通常情况下,要从登陆口进行注入,传入的参数会进行escapeStr()的过滤,而escapeStr()是比较严格的:
对单双引号都做了过滤,因此若是直接注入,会闭合失败。
考虑从cookie获取参数的路径,即下面这段代码:
从cookie中恢复的$a
和$p
没有再进行检查。所以假设我们能构造一个cookie,使得从explode恢复出来的$a
和$p
包含引号能够闭合,那就能引发sql注入了。
假设username为' or 1=1%23
,password为随意,则期望的sql注入语句为:
生成的对应的cookie即为:
可以看到已经登陆成功。
cmsPoc里提供了python版本的poc,对应命令如下:
修补方案
官方在 v7.0.2中修复了该漏洞,在members::check_login()函数中,当从cookie中获取到$a,$p后先进行了一次addslashes,之后才进行查询。