逻辑漏洞渗透与攻防(一)之身份验证漏洞

时间:2023-01-04 10:51:20

目录

逻辑漏洞概要

漏洞的根因:

逻辑漏洞的分类:

身份验证漏洞

暴力破解漏洞

1.1 未限制爆破

1.2 爆破-验证码爆破

1.3 暴力破解漏洞-限制IP爆破

1.4 暴力破解漏洞-限制密码错误次数来爆破

1.5 暴力破解漏洞-多字段爆破

1.6 限制登录频率爆破

1.7 Authorization爆破(密文爆破)

1.8 密文传输爆破

1.9 Session固定攻击(未授权)

1.10 Cookie欺骗漏洞

1.11 未进行登陆凭证验证


逻辑漏洞概要

逻辑漏洞就是基于开发人员设计程序的时候,逻辑不严密,导致攻击者可以修改、绕过或者中断整个程序,让程序按照开发人员的预料之外去执行。比如某一网页的登录验证逻辑如下:输入用户名验证--验证成功后输入密码--输入验证码--数据包前端传到后端处理--数据库匹配--匹配成功回包
由于整体网站可能采用前端验证,黑客可以直接篡改或者绕过某些流程,如下:BP抓取用户名,密码、验证码特定格式--发送给后端匹配,由于网站采用前端验证,导致攻击者可以直接抓取数据包,从而绕过用户名验证的过程,直接爆破,简单来讲,只要你能修改、绕过、中断整个开发者运行软件的整体逻辑,这个便是逻辑漏洞,只是绝大部分逻辑漏洞的危害性并不高,比如:开发人员需要你先输入账号,在输入密码;但是你改变了这个逻辑,可以先输入密码,在输入账号,其实这个也是逻辑漏洞,这个漏洞没有任何危害;但是也有可能在某些特定情况下可以结合其他的漏洞可能产生新的风险。

漏洞的根因:

比如SQL注入:
程序的开发者也没有想过你可以拼接他的语言产生他预料之外的危害,他不过是按照程序逻辑完成了整个查询的动作,那么为什么会产生逻辑漏洞就很容易理解了:研发只负责满足客户的需求,大部分的研发并不懂安全,所以并不会带着黑客的思维考虑这个软件的安全,程序的本质就是按照研发设计的逻辑运行,这个过程中出现的所有漏洞,皆可以为逻辑漏洞。


逻辑漏洞的分类:


从漏洞的本质上,我习惯将逻辑漏洞分为两类:

  1. 软件(系统)设计之初便存在的漏洞
  2. 使用者未能安全使用软件所产生的

1、第一点很好理解,比如永恒之蓝,sql注入漏洞、文件上传等等,均为设计的时候未能按照安全设计的方法进行,所产生的,攻击者只需要找到特定的点,执行特性的代码即可产生研发预料之外的现象。
2、第二点的关键在于使用者,比如弱口令,比如匿名用户;程序开发者会设计很多便捷的功能,但是由于使用者使用不当,产生了新的问题。

身份验证漏洞

暴力破解漏洞

渗透测试中最简单也最有效的攻击方式就是弱口令攻击,web 服务中最好用的爆破神器 就是 burpsuite 的 intruder 的模块,如果有验证码的话,如果验证码相对简单,就可以就用 pkav工具来试下,如果 bp 解决不了的话,就需要自己写脚本来爆破。


当然,遇见复杂的但是又需要的爆破的需要自己根据实际的网站,进行脚本的编写,更好的达到爆破的目的:验证码识别可以参照 kuls大佬的文章:

https://mp.weixin.qq.com/s/wUpKG7uifU_aj8oWYEPqqQ


实战中各种稀奇古怪的身份验证漏洞:

1.1 未限制爆破

未限制爆破,即对于用户登录的地方没有做什么限制爆破的策略,因此对于这个地方可以直接使用bp来抓包放进intruder模块爆破,参考dvwalow关卡或者pikachu《基于表单的暴力破解》,不做详述。
逻辑漏洞渗透与攻防(一)之身份验证漏洞

1.2 爆破-验证码爆破

以下,我们先来讲解一个pkav的爆破验证码的案列: PKav HTTP Fuzzer 爆破带验证码的网站
字典方面,可以参考自行到github上去收集常见的密码本,最好可以形成自己的密码库。

首先我们打开织梦CMS的网站登录页面,进行爆破:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

我们随便输入账号及密码和验证码,然后后台BurpSuite开启代理抓数据包:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后进入到我们的BurpSuite中找到我们刚刚的数据包:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后打开我们的 PKav HTTP Fuzzer工具:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

将我们的数据包全部选中然后复制到 PKav HTTP Fuzzer中:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后将我们要爆破的密码添加标记:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

再将我们要爆破的验证码添加标记:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后添加字典:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后我们进入验证码识别模块:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

逻辑漏洞渗透与攻防(一)之身份验证漏洞

回到网站,右键验证码,查看验证码的地址:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后将其复制到url一栏:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

识别范围改为不限定:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后我们来到发包器模块:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 启动开始爆破:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 在有验证码的情况下成功完成爆破:逻辑漏洞渗透与攻防(一)之身份验证漏洞

 1.3 暴力破解漏洞-限制IP爆破

某些具有安全意识的开发人员或运维人员,针对账户爆破问题就会使用限制攻击者IP的方式,当在短时间内有大量来自该IP的尝试登录现象时就会*该IP,导致该IP无法使用,针对这种情况,建议自己写脚本,调用git开源的代理API来爆破,当然也可以直接用别人的*,自建*的方法:首先需要新建一个代理池:现在好用的一般是收费版本,这里可以自行购买,我这里拿一个代理
举例,然后使用python调用代理池进行爆破:

import requests
import re

def post():
    curl = "你网站靶机的IP"
    proxy = {'http':'127.0.0.1:8080'}   #代理地址以及端口,现在估计已经失效,如果需要使用,可以自建资源池
    post = requests.get(curl,headers=header,proxies=proxy).text   #请求报文
    print(post)  #打印网站

if __name__ == '__main__':
    post()
 

#实验要求,bp能抓到python发送的报文即可,靶机IP可以选择pikachu的或者sqli的,ip不要写环回地址如127.0.0.1或者locahost

这里关键就是在proxy这里,实战中,我们可以改变这里为你的代理池,让你的每次访问从中抽取一个IP去访问目标网站,这样就能够防止因为一个IP多次爆破而导致该IP被*的情况。

我们进行实验,后台BurpSuite在8080端口开启抓包,然后我们运行代码:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后我们可以看到整个网站的信息被返回来了:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

我们可以到后台Burp上看看这些抓到的数据包:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

1.4 暴力破解漏洞-限制密码错误次数来爆破

有些网站管理员会限制某个账号的登录次数,如果超过限制次数,账号就会被锁定,除非管理员解锁或者设定一段时间过后自动解锁。

由于他限制了一个账号,比如只允许输入5次,但是不限制你换个账号又可以输错5次,对于这种情况,通常可以采用弱密码反过来爆破账户的方式,即设置任意的不超过爆破次数的弱密码数量来反过来爆破用户名。

如下图:通过12345678弱口令来爆破用户,可以比对长度后发现,test和admin账号存在,如果账号足够多,总会有弱口令的。

逻辑漏洞渗透与攻防(一)之身份验证漏洞

1.5 暴力破解漏洞-多字段爆破

多字段爆破即需要爆破多个字段大于等于2,比如说:需要同时爆破:账号密码验证码,当我
们爆破一个网站时返回信息是用户名或密码错误时,大多数时候仍然使用burpsuite的Intruder模块,只是与单个字段爆破选择的模式不同,但是当某几个字段相同的情况下,例如在不仅在post内容中确定,还要在cookie或者session或者token中确定的时候,也可以自己写脚本解决问题,如下为pikachutoken爆破的脚本: 

实验案列为:pikachu的token爆破
我们都知道token是什么,你的客户端向服务器发送了一次登录请求,服务端响应了你,并发给了你一个token,服务器后端会保存着这个token,然后客户端带着账号,密码还有服务端发送给你的token再一次请求服务器,服务器对你的token值进行验证,假如你发送过来的token值和服务器发送给你的token一样时,校验通过,然后token销毁。客户端和服务器每一次请求和响应都会重复这个步骤。
1、BP爆破
我们拿pikaqiu靶场来做实验:
逻辑漏洞渗透与攻防(一)之身份验证漏洞
我们通过BP代理获得数据包

逻辑漏洞渗透与攻防(一)之身份验证漏洞 将其发送到Repetaer模块:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 我们可以看到这里提示token值不正确:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 因为token值在每一次数据包中都是唯一的,所以用重放模块去爆破带有token验证功能的网站通常都会因为这个token值而无法爆破,那我们该如何使用BP来绕过这种情况呢?

我们可以看到我们重放数据包的token值和服务端响应给我们的token值是不同的,我们要想去爆破,每一次都必须拿着网站返回给我们的token值去爆破,而不是原分不动的一直拿着一个token去爆破。

逻辑漏洞渗透与攻防(一)之身份验证漏洞

我们将这个数据包发送给Intruder模块:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后将我们要爆破的密码和token部分添加上:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后爆破模式选着交叉:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 然后我们填写有效负载:

因为这里第一个是密码,所以我们在这里添加上字典。

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后我们来到第二个,也就是我们的token:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 这个token是哪来的呢?是服务器每次响应发送给你的,所以我们要重服务器每次返回给你的响应中去获取这个token。

关于这点,BP给我们提供了很好的工具,首先我们到选项里去选则匹配规则:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

逻辑漏洞渗透与攻防(一)之身份验证漏洞

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 在服务端返回给我们的响应中,我们去找到这个token:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 然后双击它,BP为我们提供了一个很好的正则匹配功能,只要双击,他就能够为我们自动添加正则表达式:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后继续回到我们的有效负荷:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

在类型这里选择递归匹配,他会将我们之前设置的正则自动填写:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 因为你通过正则获取到的token是服务器重新响应给你的,在你的所有和服务端的请求中属于是第二次响应,所以我们还要在这里填写上第一次也就是你第一次抓数据包时服务器发送给你的token,否者两个token值是不匹配的,然后会导致你的第一次报文是无效的。

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 我们设置线程:

逻辑漏洞渗透与攻防(一)之身份验证漏洞  如下因为我们刚刚没有设置第一次的token,所以导致了第一次的爆破是无效的。

逻辑漏洞渗透与攻防(一)之身份验证漏洞 然后我们可以通过长度去分析,那些有问题,这里我们只要去看长度异常的就可以了:

来看我们的token爆破成功了:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 2、脚本爆破

那万一有些网站正则识别不到,或者过滤了正则怎么办呢?,遇到这种情况的话就需要我们自己去编写脚本爆破了,下面给出一个脚本给大家进行参考:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

这一张图里的user_token值就是填第一次服务端发给我们的token,不过也可以不填,无非也就导致第一次的报文失效而已,后果并不严重。

逻辑漏洞渗透与攻防(一)之身份验证漏洞 我们运行这个脚本试试看:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

结果:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 1.6 限制登录频率爆破

限制登录频率爆破即限制在一定的时间内爆破的次数,比如10分钟内只允许爆破10次,对于这种方式,可以采用延时爆破的方式,但是可能需要时间比较久,但总比手工爆破舒服,在bp上如下文设置,该 时间以ms为单位(1000ms=1S)
逻辑漏洞渗透与攻防(一)之身份验证漏洞

 1.7 Authorization爆破(密文爆破)

Authorization爆破,狭义上单纯指basicbase64爆破,比如tomcat的密码在传输的时候,是采用
base64编码的,而广义上可以泛指经过编码过后的用户名与密码
下面我们以tomcat的basic爆破举例:
环境可以采用vulhub的tomcat8环境

逻辑漏洞渗透与攻防(一)之身份验证漏洞

实验演示:BP爆破

我们打开路劲,输入账号和密码,后台BP抓数据包:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

我们将我们抓到的报文发送给Repeater模块:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

逻辑漏洞渗透与攻防(一)之身份验证漏洞 可以看到这里是密文的部分,我们将其复制下来,到base64网站上进行解码:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

我们可以看到他加密的格式如上所示,那我们遇到这种加密的情况的话,该如何进行爆破?

我们将其发送给Intruder模块:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

将你需要爆破的密文添加上payload位置:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 我们来到有效载荷,选择自定义迭代器:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 在1这里添加上我们要爆破的用户名:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

由于我们之前看到的密文机密后的格式是这样的admin:123456,所以在位置2这里我们要加上:号。 

逻辑漏洞渗透与攻防(一)之身份验证漏洞

在位置3这里添加上我们的密码:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 然后我们对我们的payload做一个处理:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 添加规则,对我们刚刚的payload进行一个base64加密:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后开始我们的爆破:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

不过我们的网站有一个功能,当我们尝试重复登录时,为了防爆破,限制了我们的登录次数,所以导致我们的响应都401了:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 正常情况下来说,如果网站没有这种功能,一般都是可以密文爆破成功的。

1.8 密文传输爆破

渗透测试中,有时会遇到密码从客户端到服务端中间通过前端 js 代码将密码加密后,在发送给服务器,所以这个时候,我们可以采用bp上自带的加密方法进行加密
常见的加密手法有MD5或者RSA,如果需要JS的复杂加密,也可以读懂JS的加密逻辑自定Python进行爆破,或者使用python的 pyexecjs包来帮助你执行JS文件复现加密方法
BP演示:
我们登录,后台BP开启抓包:
逻辑漏洞渗透与攻防(一)之身份验证漏洞

我们将我们抓到的数据包发送到Repeater模块:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

如图,可以看到我们的账号密码经过了加密处理:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

那我们如何知道网站前端的加密方式呢?

我们回到我们的网站,打开F12,到密码一栏里,去找他的name字段:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

这里的name字段的值是txt_password,然后我们去搜索和txt_password有关联的代码:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 将其复制出来,放到我们的编辑器中,方便看清,然后继续找txt_password:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后我们对这里的加密方式做一个分析,然后复现他的加密方式,可以看到这里他先获取密码,然后对密码进行了一个md5加密:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后他将 tmp_pwd_md5通过toUppreCase()函数进行了全大写,然后加了一个":"号 ,再加上了cookie值,也就是我们报文里的cookie值:

逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后再将其进行一次MD5加密赋值给submitStr_md5,然后在进行大写转换,最后用用户名+":"号+submitStr_md5,这就是他的加密流程:

逻辑漏洞渗透与攻防(一)之身份验证漏洞 整个加密逻辑如下所示:

 逻辑漏洞渗透与攻防(一)之身份验证漏洞

然后我们就可以通过这串加密逻辑自己设置爆破模式或者写脚本去爆破了。

1.9 Session固定攻击(未授权)

这里之前,我们先来复习一下session,你的客户端跟服务器之间进行通信,你输入账号和密码发送给服务器,服务器验证你的账号和密码,成功后,服务器会发送给你一个seesion。你的客户端会保存着这个seesion,在下一次你的客户端去访问这个服务器时,你的客户端会带着这个seesion去访问服务器,服务器就知道你是谁了,假如没有这个session,那么进同一个网站,你每登录一次这个网站,就得输入一次账号和密码,session为我们解决了这个难题。

漏洞介绍:会话固定攻击是利用服务器的session不变机制,借他人之手获得认证和授权,然后冒充他人
漏洞原理:在请求登录过程时 候,URL带有一个session,登录成功之后会将登录成功的信息绑定到这个session中,攻击者可以发送带有session的URL给相关工作人员诱 导其登录,相当于获取了其身份信息
漏洞点:在GET方法请求登录时候带有session值
修复思路: 只要避免在URL中带入session信息即可比较有效的防御
另外也要注意POST请求中带有sessionid进行session固定攻击,虽然可利用性比较低,但是建议修复 ,如下,测试方法可以直接赋值session 然后更换浏览器打开或者使用无痕模式打开即可,如果直接访问,不需要登录,说明存在该漏洞 。
如下图所示的我们发现了一个有Get请求携带的Session,实战中,我们可以利用这种Session直接去访问目标服务器,服务器会直接显示登录成功,不需要我们输入账号和密码。
逻辑漏洞渗透与攻防(一)之身份验证漏洞

1.10 Cookie欺骗漏洞

漏洞介绍:通过伪造cookie信息能够伪造其他用户进行登录。
漏洞原理:开发者为了方便将身份信息/登录信息明文或者只是简单编码、哈希之后存放在cookies中,网站通过获取得到的cookies进行 授权或者身份验证
漏洞点:cookie中有明显或者只是简单编码、哈希的字段时候 修改lsLogin值为1可以判定为用户已经登录
漏洞修复: Cookie不应该存储可理解的身份信息和登录信息 按照规定,cookie对身份信息和登录信息的存储只能通过存储足够长度的随 机字符串进行,避免篡改
如果某网站的cookie:asp163=admin,那我们只需要等待管理员登录成功后,网站存在登录信息后即可进行登录,构造报文进行登录, 安装editthiscookie可以迅速看到cookie值如下
逻辑漏洞渗透与攻防(一)之身份验证漏洞
cookie 设计存在缺陷 : Cookie 的效验值过于简单。有些web 对于cookie的生成过于单一或者简单,导致黑客可以对cookie 的效验值进行一个枚举,如下图所示

 逻辑漏洞渗透与攻防(一)之身份验证漏洞

这家网站对于cookie的较验只单纯的采用了一组数字,并且数值为常量,不会改变,这样非常容易遭到黑客的枚举。
甚至有一些网站做的更简单,直接以用户名,邮箱号或者用户ID 等来作为cookie的判断标准。
cookie 设置存在被盗风险 : 有一些厂商为了图方便,没有对用户的cookie 做太多的加密工作,仅仅是单纯的做一个静态加密就完事了。

逻辑漏洞渗透与攻防(一)之身份验证漏洞

 1.11 未进行登陆凭证验证

有些业务的接口,因为缺少了对用户的登陆凭证的较验或者是验证存在缺陷,导致黑客可以未经授权访问这些敏感信息甚至是越权操作。
后台页面访问 : 某电商后台主页面,直接在管理员web 路径后面输入main.php 之类的即可进入。
逻辑漏洞渗透与攻防(一)之身份验证漏洞

逻辑漏洞渗透与攻防(一)之身份验证漏洞

逻辑漏洞渗透与攻防(一)之身份验证漏洞