该漏洞CNVD-ID: CNVD-2019-10031
漏洞提交CNVD后,待CNVD公示才发出本文。
测试环境:
CMS版本:v7.0.14
Windows + firefox + burpsuite + apache2 + PHP5.6.27(phpStudy集成环境)
iCMS官网:https://www.icmsdev.com/
一、漏洞分析
/app/article/article.admincp.php 模块的 function do_updateorder()函数 和 /app/content/content.admincp.php模块的function do_updateorder()函数同样的写法,存在同样的SQL注入。这里以article.admincp.php模块来说明。
函数中以POST方式获取sortnum数组变量,本程序有全局过滤,但只过滤参数值没有过滤参数名。
这里的操作把参数名也带入了SQL语句。虽然这里参数值进行了二次过滤,但仍然遗漏了参数名。
所以,可以通过数组的方式在参数名里插入SQL报错语句,实现SQL注入。
二、漏洞测试
这个漏洞需要登陆后台才能测试。
由于这里所有的POST请求都要检测CSRF-token 。找函数的入口点不好找,这里采取获取一个CSRF-token值,并修改HTTP请求包的方式来进入函数。
获取一个CSRF-token值:
登陆后台后进入添加栏目。
开启BurpSuite拦截。任写一个栏目名称后提交。
Burpsuite拦截后修改HTTP包:
修改URI为:
/admincp.php?app=article&do=updateorder 加上拦截到的&frame和&CSRF_TOKEN
修改POST DATA为:
sortnum[3' and (extractvalue(1,concat(0x7e,(select database()),0x7e)))#]=1
然后发到Repeater。
获取数据库名:
获取用户名:
获取数据库版本:
/app/content/content.admincp.php 模块的 function do_updateorder()函数是同样的写法,存在同样的SQL注入。
修复方式都一样:将参数名带入查询前做一次addslashes过滤。