information_schema过滤与无列名注入

前言

在手工SQL注入时,我们常常会想着利用 information_schema库 来进行爆数据库名、表名、字段名,但如果 information_schema库 被禁用了怎么办?

正好遇到了这样一道题,所以来记录一下学习

简单介绍一下information_schema库

mysql中的information_schma这个库是干嘛的,在sql注入中它的作用是什么,那么有没有可以替代这个库的方法呢?

简单来说,information_schma库就像是mysql的信息数据库,它保存着mysql服务器所维护的所有其他数据库的信息,当然也就包括了数据库名、表名、列名。

在注入时,infromation_schema库的作用就是获取table_schema、table_name、column_name这些数据库内的信息。

MySQL5.7的新特性

在mysql在5.7版本中新增了sys.schema,基础数据来自于 performance_chema 和 information_schema 两个库,本身数据库不存储数据

所以就有了几个可以代替infromation_schema注入是的作用

sys.schema_auto_increment_columns 对表自增ID的监控

在这里插入图片描述

查询表的统计信息,其中还包括Innodb缓冲池统计信息,默认情况下按照增删改查操作的总表I/O延迟时间(执行时间)降序排序

sys.schema_table_statistics_with_buffer
sys.x$schema_table_statistics_with_buffer

在这里插入图片描述
在这里插入图片描述
但是 sys.schema_auto_increment_columns这个库有些局限性,一般要超级管理员才可以访问sys。

<think>好的,我现在需要解决用户提出的关于SQL注入information_schema不存在的问题。首先,我得回顾一下用户提供的引用内容,看看有没有相关线索。 引用[4]提到一个案例,使用了sea_admin来替代information_schema,这可能意味着目标数据库是非MySQL的,或者权限受限。用户遇到的情况可能是数据库类型不同,比如PostgreSQL或SQL Server,它们的系统名称不同。或者,用户可能没有权限访问information_schema,导致无法利用常规的注入方法。 接下来,我需要思考替代方案。当information_schema不可用时,可以考虑其他系统或视图。例如,MySQLmysql.db(引用[2])可能提供部分信息,但需要权限。另外,像sys数据库中的视图也可能有用,但同样受权限限制。 用户的问题还可能涉及数据库类型不同。比如,在PostgreSQL中,可以使用pg_catalog.pg_tables,而在SQL Server中使用sys.tables。因此,确定目标数据库类型是关键,可能需要利用数据库特有的函数或错误信息来推断类型。 另外,引用[4]中的示例使用了布尔盲注,可能需要通过错误回显或时间盲注来获取数据。当系统不可用时,可以尝试直接查询应用程序中的已知结构,例如猜测名和列名。比如,用户提供的案例中使用了sea_comment和sea_admin,可能说明应用程序有特定的命名习惯,可以尝试类似的前缀。 还有一种方法是利用联合查询或子查询来获取元数据。例如,如果知道某个的列数,可以通过联合查询将数据泄露到可见字段中。不过,这需要了解目标的结构,可能需要试错。 此外,引用[1]和[3]提到过滤information_schema的情况,可能需要绕过黑名单。例如,使用大小写变异、注释或编码绕过正则过滤。但用户的问题不是过滤,而是不存在,所以重点在替代方法上。 总结解决方案步骤:首先确定数据库类型,寻找替代的系统;若权限不足,尝试其他方式获取元数据;或者利用已知应用结构进行盲注。同时,在注入时可能需要使用特定于数据库的函数或语法,比如PostgreSQL的version(),MySQL的@@version等来识别数据库类型。</think>针对SQL注入中`information_schema`不存在的问题,以下是系统级解决方案: ### 问题背景 `information_schema`是MySQL默认的系统,存储数据库元数据。但在某些场景下可能不可用: 1. 数据库类型非MySQL(如PostgreSQL、SQL Server等)[^2] 2. 权限限制禁止访问系统 3. 数据库版本或配置特殊(如云数据库托管服务) ### 解决方案 #### 1. 判断数据库类型 通过特定函数识别数据库类型: ```sql # MySQL识别 ' AND @@version LIKE '%MySQL%' -- # PostgreSQL识别 ' AND version() LIKE '%PostgreSQL%' -- # SQL Server识别 ' AND @@version LIKE '%Microsoft SQL Server%' -- ``` #### 2. 使用替代系统 不同数据库的元数据: - **PostgreSQL**:`pg_catalog.pg_tables`、`pg_catalog.pg_attribute` ```sql SELECT table_name FROM pg_catalog.pg_tables WHERE schemaname='public' ``` - **SQL Server**:`sys.tables`、`sys.columns` ```sql SELECT name FROM sys.tables ``` - **Oracle**:`all_tables`、`all_tab_columns` #### 3. 利用已知结构盲注(以MySQL为例) 若无法访问系统,但已知应用名(如引用[4]中的`sea_admin`): ```sql # 布尔盲注猜测字段名 ' AND (SELECT SUBSTRING(COLUMN_NAME,1,1) FROM 已知名 LIMIT 1)='i' -- # 时间盲注获取数据 ' AND IF(ASCII(SUBSTR((SELECT COLUMN_NAME FROM 已知名 LIMIT 1),1,1))=105,SLEEP(5),0) -- ``` #### 4. 利用数据库特性 - **MySQL 5.7+**:尝试访问`sys`库视图(需权限) ```sql SELECT table_name FROM sys.schema_table_statistics ``` - **SQLite**:使用`sqlite_master` ```sql SELECT name FROM sqlite_master WHERE type='table' ``` ### 防御建议 1. 白名单过滤:验证输入参数格式(如数字型参数强制类型转换)[^3] 2. 最小权限原则:数据库连接账户禁用系统访问权限[^2] 3. 预编译语句:使用参数化查询彻底杜绝注入可能性[^1]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paidx0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值