0%

SQL入门篇

SQL注入入门

从零开始学习SQL注入。以下内容从nep冬令营SQL注入讲解视频以及对应课件中整理。

数据库基础

基础操作

mysql基础操作

登录数据库:

1
mysql -uroot -p

查看库名:

1
mysql> show databases

创建库、删除库、使用库

1
mysql> create database mrkaixin
1
mysql> drop database mrkaixin
1
mysql> use mrkaixin
1
2
3
4
mysql> create table user(
-> `id` int(11)
-> `name` varchar(255)
-> );

mysql表的一些基本操作(增删查改)

Insert :

1
insert into mrkaixin values('1','nepnep');

Delete

1
delete from mrkaixin where xxxx;

Update

1
update mrkaixin set name = 'x' where id = 3;

Select

1
select * from mrkaixin;

备注:*表示输出全部字段。

mysql的常用的变量(函数)

1
2
3
4
5
1. Database()    //查看当前的用户名
2. User() //用户
3. Version() //mysql版本
4. @@basedir //安装路径

mysql中的常用的符号

逻辑运算符

1
2
3
1. &   and
2. || or
3. ^ xor

mysql中常用的函数

字符串截取函数

1
2
3
4
Substr(database(),1,1)
Subtring
Mid(database(),1,1)
Left(database(),1)

编码函数

1
2
3
Ascii()
Hex()
Char() //ascii()的逆函数

文件函数

1
Load_file()   //读取文件内容

SQL注入

SQL注入起手式

闭合

常见的注释符

1
2
3
4
1. #(%23)
2. --+
3. ;%00
4. `

思考:

如果在CTF中,把常用的注释符,以及单引号都按了,那么又该怎么闭合呢?

这里我们通过使用在"\"来将$username后面的单引号转义。然后我们想办法在$password部分注释掉后面的单引号。

1
2
3
select * from data where username = '\'and password = ' or 1=1 ;%00'
//第二个单引号被\转义了。第一个和第三个单引号之间的值为username的值
//or后面是输入的password的值,;%00可以用来闭合后面的单引号。

SQL注入的常见姿势

联合查询注入

联合查询的基本要求:

1、查询列数必须一致

2、查询语句的查询的各列类型、顺序最好一致

联合查询的步骤

1、闭合

2、判断字段数

注意:order by操作

Order by : 如果后面接的是整形的话,根据第几个字段进行排序。

简单介绍一下SQL union操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION语法:

1
2
3
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法

1
2
3
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

image-20210501122431780

判断结果输出位置

这里我们可以看到,如果是1的话,如果数据库中是存在id = 1 ,那么就会返回两行数据,但是由于limit 0,1 。Mysql总会返回第一条数据。所以自然是返回原来查询的,所以这里我们id = -1 或者其他不存在的列,那么第一行就一定是我们自己控制的了。

image-20210504121547474

爆库、爆表、爆列

讲爆X之前,我们先来认识一下information_schema这一个数据库
这个库中我们先来看看这两个表

TABLE表 :提供了关于数据库中的表的信息(包括视图)
COLUMNS表:提供了表中的列信息。

爆破库名

1
union select 1,2,database()

爆表名

1
2
union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
union select 1,2, group_concat(table_name) from information_schema.columns where table_schema=database()

爆Column名

1
union select 1,2, group_concat(column_name) from information_schema.columns where table_schema=database()

表名列名都有了之后,我们便可以通过,自由构造语句来获取获取每一个表中的信息了。

报错注入

原理

在没法使用union联合查询时使用,前提是不能过滤一些关键函数。

报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。

路径写入其他格式,就会报错并且会返回我们写入的非法格式内容,我们可以利用这个得到我们想得到的内容

报错注入常用到的函数

Updatexml:更新xml文档的函数。
语法:updatexml(文档类型,xpath路径,更新的内容)

Extractvalue:对XML文档进行查询的函数
语法: extractvalue(文档类型,xpath路径)

image-20210509115330629

TIPS

报错注入有长度限制,不同的函数限制不一样。只能截32位。

如果超过32位,可以分开截,先截32,再截32 。

或者从后往前反着截。

盲注

布尔盲注

image-20210509120057993

image-20210509120121018

只有2种回显,永真&永假。

永假:程序报错、查询为空

永真:查询正常,但不返回值

这种可以通过网页上的两种不同的回显的注入,称为布尔盲注。

时间盲注

BP抓包,根据页面响应的时间来判断结果。

-------------本文结束感谢您的阅读-------------