zabbix注入过程分析

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

    当我们的参数可以使得程序按我们所需的流程进行走下去的话,必定会产生注入。

    理解了上述过程然后开始下面的实验

    按照上述注入分析,构造出注入语句以及参数。

posted @ 2016-08-20 23:51  小秒  阅读(938)  评论(0编辑  收藏  举报