OpenCart 是近年来国内外非常流行的 PHP 开源电子商务网站系统。该电商网站系统安装方便,功能强大,操作简单。支持多语言、多货币和多店铺。OpenCart 外围开发生态圈发达,更有上万款免费和收费的模块插件和模板主题可供选择。代码完全开源,功能持续更新,代码结构清晰易懂,二次开发容易上手,入门门槛低。基于这些特点使得 OpenCart 快速成为了世界上广泛应用的 电子商务建站系统。
这里直接进入存在漏洞的代码,代码位置为catalog/controller/extension/payment/divido.php第79行开始
这里出现问题的是84行的语句,这里file_get_contents('php://input')实际上就是获取POST传入的值,然后经过一次json解析传入到data参数中
86行判断data中的status参数是否为空,如果为空则返回,那么这里传入的status参数不为空就行
跟入91行,这里$data->metadata->order_id参数构造一下即可,也就是说这里的参数同样是可控的,下面我们跟进这这个getLookupByOrderId函数
这里就出现了问题,这里传入的order_id参数进行直接拼接,那么这里我们传入POST值,然后经过json解析获取order_id参数,实现最终的拼接,因此判断此处存在sql注入漏洞
这里漏洞利用有个前提就是opencart网站需要安装divido这个付款插件,默认是不安装的
这里安装即可,然后我们来到前台访问存在漏洞的页面
漏洞url为
POST参数为
这里经过一次json解析即可获得metadata参数和status参数,然后获取metadata中的order_id参数,最终直接拼接到sql语句里 ,导致了注入漏洞的发生
可以看到获取了数据库用户名为root,漏洞确实存在!
对order_id参数进行检查,或者使用单引号包裹起来,然后加上转义函数。