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 | mysql> create table user( |
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 | 1. Database() //查看当前的用户名 |
mysql中的常用的符号
逻辑运算符
1 | 1. & and |
mysql中常用的函数
字符串截取函数
1 | Substr(database(),1,1) |
编码函数
1 | Ascii() |
文件函数
1 | Load_file() //读取文件内容 |
SQL注入
SQL注入起手式
闭合
常见的注释符
1 | 1. #(%23) |
思考:
如果在CTF中,把常用的注释符,以及单引号都按了,那么又该怎么闭合呢?
这里我们通过使用在"\"
来将$username
后面的单引号转义。然后我们想办法在$password
部分注释掉后面的单引号。
1 | select * from data where username = '\'and password = ' or 1=1 ;%00' |
SQL注入的常见姿势
联合查询注入
联合查询的基本要求:
1、查询列数必须一致
2、查询语句的查询的各列类型、顺序最好一致
联合查询的步骤
1、闭合
2、判断字段数
注意:order by操作
Order by : 如果后面接的是整形的话,根据第几个字段进行排序。
简单介绍一下SQL union操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION语法:
1 | SELECT column_name(s) FROM table_name1 |
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法
1 | SELECT column_name(s) FROM table_name1 |
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
判断结果输出位置
这里我们可以看到,如果是1的话,如果数据库中是存在id = 1 ,那么就会返回两行数据,但是由于limit 0,1 。Mysql总会返回第一条数据。所以自然是返回原来查询的,所以这里我们id = -1 或者其他不存在的列,那么第一行就一定是我们自己控制的了。
爆库、爆表、爆列
讲爆X之前,我们先来认识一下information_schema这一个数据库
这个库中我们先来看看这两个表
TABLE表 :提供了关于数据库中的表的信息(包括视图)
COLUMNS表:提供了表中的列信息。
爆破库名
1 | union select 1,2,database() |
爆表名
1 | union select 1,2,group_concat(table_name) from information_schema.tables 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路径)
TIPS
报错注入有长度限制,不同的函数限制不一样。只能截32位。
如果超过32位,可以分开截,先截32,再截32 。
或者从后往前反着截。
盲注
布尔盲注
只有2种回显,永真&永假。
永假:程序报错、查询为空
永真:查询正常,但不返回值
这种可以通过网页上的两种不同的回显的注入,称为布尔盲注。
时间盲注
BP抓包,根据页面响应的时间来判断结果。