Mysql注入知识点_length(database())

目录

注释

SQL语句

查询语句

UNION

LIMIT

ORDER BY

information_schema

SCHEMATA

TABLES

COLUMNS

常用函数

基本函数

盲注(字符串处理函数)

报错注入

时间盲注


本篇文章介绍sql注入时数据库是Mysql时需要掌握的知识点。以Navicat、mysql 5.7.4为例。

注释

#或–空格是单行注释

/**/是内联注释
请添加图片描述

SQL语句

查询语句

SELECT〈目标列组〉
FROM〈数据源〉
[WHERE〈元组选择条件〉]
[GROUP BY〈分列组〉[HAVING 〈组选择条件〉]]
[ORDER BY〈排序列1〉〈排序要求1〉 [,…n]];

UNION

用于union注入攻击

UNION [ALL | DISTINCT]
SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions];

参数:

  • expression1, expression2, … expression_n: 表达式,sql注入时通常是database()函数等我们需要的信息。
  • tables: 要检索的数据表。
  • WHERE conditions: 可选, 检索条件。
  • DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
  • ALL: 可选,返回所有结果集,包含重复数据。

LIMIT

语法:

limit m,n

从m位置开始,取n条记录

ORDER BY

order by 后面可以加列名,也可以加数字,数字应是小于等于查询结果的列数,所以可以慢慢增加,当出错时,查询结果就是出错时的数字-1。

information_schema

mysql 5.0之后有这个数据库,包含数据库的很多信息,常用表SCHEMATA、TABLES、COLUMNS。

SCHEMATA

SCHEMATA表存储数据库名,字段为SCHEMA_NAME

SCHEMATA表

sql语句

SELECT schema_name FROM information_schema.schemata

查询结果

TABLES

TABLES表存储表名及表所属数据库,字段为TABLE_NAME、TABLE_SCHEMA

TABLES表

一般是查询当前数据库或者从上面得到的数据库中指定一个。

查询当前数据库sql语句

SELECT table_name FROM information_schema.`TABLES` WHERE table_schema=database()

当前数据库的表

指定数据库sql语句,以pikachu为例

SELECT table_name FROM information_schema.`TABLES` WHERE table_schema='pikachu'

结果

COLUMNS

COLUMNS表存储列名及所属数据库名、所属表名,字段为COLUMN_NAME、TABLE_SCHEMA、TABLE_NAME

COLUMNS表

查询当前表的列,sql语句

SELECT COLUMN_NAME FROM information_schema.columns WHERE table_name=table_name

结果

查询指定表的列,通过上面,我们已经知道pikachu数据库有表users,以这个为例。

sql语句

SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema='pikachu' AND table_name='users'

结果

字段值

通过利用这个数据库我们已经知道了所有的数据库、表、列,接下来我们就可以得到想要的数据了。以数据库pikachu的users表的username和password为例。

sql语句

SELECT username,password FROM pikachu.users

结果:

结果

当然,实际的sql注入没有这么简单,本篇文章列出所有知识点,接下来的文章以本地靶机讲解几种注入技术,然后再分析dvwa的过滤代码以及绕过,都学完后差不多就可以解决中低级的sql注入问题,然后可以去一些CTF在线靶场来进一步提高了。

常用函数

在上面的Sql语句中,我们提到了databse(),这是mysql的函数,接下来我们就看看在sql注入时常用到的函数。

基本函数

1.返回当前使用数据库的用户
user()/system_user()/current_user()/session_user()
2. 返回当前数据库的版本
version()/@@version
3. 返回当前使用的数据库
database()
4. 返回当前数据库所在位置
@@datadir
5. 返回当前操作系统版本
@@version_compile_os
6.将多个字符串连接成一个字符串

concat(s1,s2…sn)
7.将多行字符串拼接成一行
group_concat()语法如下:

group_concat(

[DISTINCT] 要连接的字段

[Order BY 排序字段 ASC/DESC]

[Separator ‘分隔符’]

)

主要用来处理一对多的查询结果,通常会结合GROUP BY一起使用。

盲注(字符串处理函数)

length(s) :返回目标字符串的长度
常用于盲注时数据库等信息的判断,sql语句

select length(database());

结果

substr(),substring(),mid():用法基本相同,截取字符串的一部分,会一个就可以了

SUBSTR(s, start, length)

SUBSTRING(s, start, length)

MID(s, start, length)

从字符串s的start(包含且>=1)位置开始截取length个字符。

常用于盲注时截取字符串的某一个字符,判断是什么,例如使用substr(database(),1,1)获取数据库的第一个字符进行判断,再结合length函数,最后拼接成整个数据库名。

ascii(s)/ord(s):返回字符串s的第一个字符对应的ASCII码,记一个就可以了

常用于盲注,结合substr函数

sql语句

SELECT ascii(substr(database(),1,1))

结果

再查询ascii码表就知道105对应的是字符i。

char(num):返回ASCII码对应的字符

上面函数的逆函数
sql语句

SELECT char(97)

97对应的是字符a

结果

hex():将目标字符串装换成16进制格式的数据
select hex(“dvwa”)
返回结果:70696B61636875
unhex():将16进制格式的数据装换成原字符串
语句:unhex(64767761)
解释:返回结果:dvwa

left()/right() :从规定字符串的左边/右边开始截取字符串
LEFT(s,n) 、RIGHT(s,n)
从字符串s左/右边开始截取n位字符串

报错注入

UPDATEXML函数

UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,一般写1就可以了
第二个参数:XPath_string (Xpath格式的字符串) ,不必了解Xpath语法,我们一般是写sql语句查询表名等,通过报错信息显示出来。
第三个参数:new_value,String格式,替换查找到的符合条件的数据,一般写1就可以了
作用:改变文档中符合条件的节点的值

还有floor、extractvalue等函数也可以用于报错注入

时间盲注

sleep(N)函数

运行N秒。

IF(expr,v1,v2)函数

如果表达式expr成立,返回v1,否则返回v2。与sleep函数结合通过网页多久后返回来判断结果。

sql语句

SELECT ascii(substr(database(),1,1)) and if(length(database())>17,sleep(2),1)

等待2秒后,返回0

2秒后返回

SELECT ascii(substr(database(),1,1)) and if(length(database())>18,sleep(2),1)

立刻返回

数据库长度>17但不>18,即数据库长度为18。

喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

### MySQL 数据库核心概念 #### 字符集配置 对于 MySQL 5.7 版本,在安装过程中需要特别注意字符集的设置,如果不做特殊配置,默认字符集将是 latin1 (ISO 8859-1),这并不支持中文字符。为了确保能够正常处理多语言文字,建议在初始化实例时指定合适的字符编码,比如 utf8mb4[^1]。 ```sql [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci ``` #### 创建与查看数据库信息 可以利用 `CREATE DATABASE` 语句来建立新的数据库,并通过 `SHOW CREATE DATABASE` 来检索已存在数据库的具体定义语句。例如: ```sql -- 创建名为 'example_db' 的新数据库并设定其默认字符集为utf8mb4 CREATE DATABASE example_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 查看 'db_name' 数据库是如何被创建的信息 SHOW CREATE DATABASE db_name; ``` #### Information Schema 使用简介 Information Schema 是一个特殊的只读数据库,它包含了有关其他数据库结构的数据(即元数据),如表名、列名称及其属性等重要细节。开发者可以通过查询这些预定义好的视图表获得所需的各种元数据信息[^2]。 ```sql SELECT * FROM information_schema.tables WHERE table_schema='your_database'; ``` 上述命令会返回给定模式下的所有表格列表;如果想要进一步了解某个特定表内的字段,则可执行如下 SQL 查询: ```sql SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = 'target_table'; ``` 此段代码片段展示了如何从 INFORMATION_SCHEMA 中提取目标表内各列的名字以及它们对应的数据类型和最大长度限制。 --- ### 相关问题-- 1. 如何优化 MySQL 表性能? 2. 在什么情况下应该考虑使用分区表? 3. 解释下 InnoDB 和 MyISAM 存储引擎之间的区别是什么? 4. 怎样备份和恢复整个 MySQL 数据库? 5. 能否举例说明什么是存储过程?有何优势?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值