Zabbix jsrpc.php sql 注入过程分析
漏洞公开详情(https://support.zabbix.com/browse/ZBX-11023)中提示在insertDB() 中的insert方式存在SQL注入漏洞,如下图:
我们来逐步分析下
直接定位到cprofile:flush()函数所在的文件cprofile.php,代码如下。
在inserDB方法中。直接将self::$insert里的数组进行拆分遍历后放入了insert 语句中进行拼接。我们学过那么多的sql注入课程后,很快就能判断,如果在$insert值可控,那么我们就能在此处构造出sql注入
我们搜索下,调用了flush静态方法的有哪些文件:
看看page_footer.php这个文件吧。
现在要想进入到CProfile::flush()函数,还必须满足前提条件是CProfile::isModified()函数为真,再次回到CProfile.php文件,经过仔细分析,我们可以看到,当CProfile.php中的self::$insert 不为空,才可以正确走向我们预定的流程中,CProfile.php中的CProfile::update函数会将self::$insert进行赋值,搜索源码后,很多地方调用了CProfile::update,为此我们只要挑出可以被guest权限访问的即可。在Include/classes/screens/CScreenBase.php中如下代码
的calculateTime 函数中有调用。并且没有对$options进行过滤。对此我们需要顺藤摸瓜,构造出相应的参数来进行注入 。
接着,我们回到jsrpc.php可以看到如何调用到CScreenBase
在
中调用了CScreenBuilder::getScreen函数
当CScreenBuilder 中
接着
最终,我们可以构造出一条完成的调用链
如下所示:
Jsrpc.php->CScreenBuild.php : getScreen -> CScreenHistory -> CScreenBase
当我们的参数可以使得程序按我们所需的流程进行走下去的话,必定会产生注入。
理解了上述过程然后开始下面的实验
按照上述注入分析,构造出注入语句以及参数。