首先漏洞存在于app\system\message\web\message.class.php文件中,变量{$_M[form][id]} 直接拼接在SQL语句中,且验证码检测函数是在SQL语句查询之后,这也就造成了我们可以无视验证码检测函数,进行SQL注入。具体问题函数代码如下:

$met_fd_ok=DB::get_one("select * from {$_M[table][config]} where lang ='{$_M[form][lang]}' and  name= 'met_fd_ok' and columnid = {$_M[form][id]}");

这行中$_M[form][id]}没有被单引号保护拼接在sql语句中,存在安全隐患。我们跟跟踪这个变量看是否有过滤操作。

首先这个类的基类是web类

跟进web类,没有对用户传入的数据进行过滤等操作,却初始化了common类

我们继续看看common类

在common类初始化时调用了表单过滤的函数load_form()

此函数中又调用了过滤SQL注入的函数sqlinsert

那我们来看看这个sqlinsert函数过滤了什么

可以看到sqlinsert函数对sleep关键字进行了处理,但是我们还是可以使用MYSQL中的benchmark函数轻松绕过。当然我们本文绕过的姿势不是用函数绕过这个函数,而是让代码不执行这个过滤的函数来达到绕过。

我们回到daddslashes函数里:

daddslashes()定义在app/system/include/function/common.func.php第51行,对传递的参数进行addslashes()操作。这里注意,在else语句中,如果之前定义了IN_ADMIN常量,进行trim(addslashes(sqlinsert($string)))操作,反之则进行trim(addslashes($string))。

之前所述的安全隐患点为int型,所以addslashes()函数没有作用,所以这里主要是要绕过sqlinsert(),需要寻找到定义过IN_ADMIN常量的入口。

这里通过搜索找到了admin/index.php,文件第5行定义了IN_ADMIN常量。接着看从admin/index.php入口文件如何调用add()函数的,index.php定义了4个常量,并且包含了app/system/entrance.php。

进入app/system/entrance.php,38-44行,入口文件没有定义M_TYPE,这里会设置M_TYPE常量为system;54-59行,由于定义了M_TYPE为system,进行设置PATH_OWN_FILE常量为PATH_APP.M_TYPE.'/'. M_NAME.'/'.M_MODULE.'/',其中M_NAME、M_MODULE均可控。88-99行包含app/system/include/class/load.class.php,并调用了module()方法。

由于调用module()方法时缺省了参数,因此$path、$modulename、$action均有之前定义的常量赋值,然后再调用_load_class()方法。_load_class()方法可以引用并实例化一个类,

当action为空的时候,只引用文件。当action为new时候,会实例化这个类。当action为do开头时候,会实例化类,并执行这个方法。


那么到这里我们理一下条件:

要想包含app/system/message/web/message.class.php文件,需要满足

M_NAME = $_GET['n'] = message;

M_MODULE = $_GET['m'] = web;

M_CLASS = $_GET['c'] = message;

要想调用add(),必须实例化类并执行方法,但这里限定只能实例化并执行do开头的方法。这里找到了message.class.php中的domessage(),它调用了add()方法。

在调用add()方法前,需要满足$this->check_field();,这里发现只要抓取正常的留言参数填充就可以了,验证码的判断是在add()方法中执行完漏洞语句之后。

为了实现布尔注入而不是时间盲注,需要正常时$met_fd_ok的值不为空,从而绕过46行判断,弹出"验证码错误",而异常时$met_fd_ok值为空,弹出"反馈已关闭"。

在数据库中执行一下存在漏洞的SQL语句,看看符合条件的id参数有哪些,满足的columnid有42和44。

mysql> select * from met_config where name = 'met_fd_ok' and lang='cn';

+-----+-----------+-------+--------------+----------+---------+------+

| id  | name      | value | mobile_value | columnid | flashid | lang |

+-----+-----------+-------+--------------+----------+---------+------+

| 470 | met_fd_ok | 1     |              |       44 |       0 | cn   |

| 490 | met_fd_ok | 1     |              |       42 |       0 | cn   |

+-----+-----------+-------+--------------+----------+---------+------+

最终可以构造如下GET请求注入,注入点为id:

admin/index.php?m=web&n=message&c=message&a=domessage&action=add&lang=cn¶137=1¶186=1@qq.com¶138=1¶139=1¶140=1&id=42 and 1=1
sqlmap.py -u "192.168.5.172/admin/index.php?m

=web&n=message&c=message&a=domessage&action=add&lang=cn¶137=1¶186=1@qq.com¶138=1¶139=1¶140=1&id=42"

最后附上一个思维导图,更好理解逻辑

代码审计-MetInfo 6.0.0 sql注入漏洞的更多相关文章

  1. 代码审计(1):sql注入漏洞

    挖掘经验:sql注入经常出现在登录界面.获取HTTP请求头.订单处理等地方.而登录界面的注入现在来说大多是发生在HTTP头里面的client-ip和x-forward-for,一般用来记录登录的ip地 ...

  2. [代码审计]DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入

    0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...

  3. DT6.0关于SQL注入漏洞修复问题

    阿里云安全平台提示:Destoon SQL注入,关于: Destoon的/mobile/guestbook.php中$do->add($post);这行代码对参数$post未进行正确转义,导致黑 ...

  4. Joomla!3.7.0 Core SQL注入漏洞动态调试草稿

    参考joolma的mvc框架讲解:http://www.360doc.com/content/11/1219/18/1372409_173441270.shtml 从这个页面开始下断点:Joomla_ ...

  5. joomla 3.7.0 (CVE-2017-8917) SQL注入漏洞

    影响版本: 3.7.0 poc http://192.168.49.2:8080/index.php?option=com_fields&view=fields&layout=moda ...

  6. 网站sql注入漏洞修复方案之metinfo 6.1.0系列

    近日,我们SINE安全对metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞对网站的代码进行sql注入攻击,伪造恶意的sql非法语句,对网站的数 ...

  7. 【代码审计】五指CMS_v4.1.0 copyfrom.php 页面存在SQL注入漏洞分析

      0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...

  8. 【代码审计】五指CMS_v4.1.0 后台存在SQL注入漏洞分析

      0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...

  9. 【代码审计】iCMS_v7.0.7 admincp.app.php页面存在SQL注入漏洞分析

      0x00 环境准备 iCMS官网:https://www.icmsdev.com 网站源码版本:iCMS-v7.0.7 程序源码下载:https://www.icmsdev.com/downloa ...

  10. 【代码审计】iCMS_v7.0.7 apps.admincp.php页面存在SQL注入漏洞分析

      0x00 环境准备 iCMS官网:https://www.icmsdev.com 网站源码版本:iCMS-v7.0.7 程序源码下载:https://www.icmsdev.com/downloa ...

随机推荐

  1. Spring MVC+ajax进行信息验证

    本文是一个ajax结合Spring MVC使用的入门,首先我们来了解一下什么是Ajax AJAX 不是新的编程语言,而是一种使用现有标准的新方法.AJAX 最大的优点是在不重新加载整个页面的情况下,可 ...

  2. Nginx安装及详解

    Nginx简介: Nginx(发音engine x)专为性能优化而开发的开源软件,是HTTP.反向代理.邮件代理.TCP/UDP协议代理软件,由俄罗斯的作者Igor Sysoev开发,其最知名的优点是 ...

  3. java架构之路-(12)JVM垃圾回收算法和垃圾回收器

    接上次JVM虚拟机堆内存模型来继续说,上次我们主要说了什么时候可能把对象直接放在老年代,还有我们的可能性分析,提出GCroot根的概念.这次我们主要来说说垃圾回收所使用的的算法和我们的垃圾回收器,需要 ...

  4. Elastic Stack 笔记(四)Elasticsearch5.6 索引及文档管理

    博客地址:http://www.moonxy.com 一.前言 在 Elasticsearch 中,对文档进行索引等操作时,既可以通过 RESTful 接口进行操作,也可以通过 Java 也可以通过 ...

  5. C. Anadi and Domino

    题目链接:http://codeforces.com/contest/1230/problem/C C. Anadi and Domino time limit per test: 2 seconds ...

  6. [Link 2005]vs2015 LNK2005 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl printR(class std::basic_ostream<char,struct std::char_traits<char> > &,class QueryResult const &)" (?

      vs2015 LNK2005 "class std::basic_ostream<char,struct std::char_traits<char> > &am ...

  7. 判断dom原始是否在可视区域内

    isElementInViewport (el, offset = 0) { const box = el.getBoundingClientRect(), top = (box.top >= ...

  8. Salesforce学习之路-admin篇(三)role hierarchy & sharing

    1. Role Hierarchy 在私有或者混合模型中,如果在organization-wide defaults设置某个对象为Private,那么对象的记录只有拥有者可以查看.但是,role hi ...

  9. Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例

    在Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们看到了XMLConfigBuilder(xml配置解析器)的实例化.而且这个实例化过程在文章:Mybatis源码解析,一步一步从浅 ...

  10. 2018年蓝桥杯java b组第三题

    标题:复数幂 设i为虚数单位.对于任意正整数n,(2+3i)^n 的实部和虚部都是整数.求 (2+3i)^123456 等于多少? 即(2+3i)的123456次幂,这个数字很大,要求精确表示. 答案 ...