目录
逻辑漏洞概要
漏洞的根因:
逻辑漏洞的分类:
身份验证漏洞
暴力破解漏洞
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、第一点很好理解,比如永恒之蓝,sql注入漏洞、文件上传等等,均为设计的时候未能按照安全设计的方法进行,所产生的,攻击者只需要找到特定的点,执行特性的代码即可产生研发预料之外的现象。
2、第二点的关键在于使用者,比如弱口令,比如匿名用户;程序开发者会设计很多便捷的功能,但是由于使用者使用不当,产生了新的问题。
身份验证漏洞
暴力破解漏洞
渗透测试中最简单也最有效的攻击方式就是弱口令攻击,web 服务中最好用的爆破神器 就是 burpsuite 的 intruder 的模块,如果有验证码的话,如果验证码相对简单,就可以就用 pkav工具来试下,如果 bp 解决不了的话,就需要自己写脚本来爆破。
当然,遇见复杂的但是又需要的爆破的需要自己根据实际的网站,进行脚本的编写,更好的达到爆破的目的:验证码识别可以参照 kuls大佬的文章:
https://mp.weixin.qq.com/s/wUpKG7uifU_aj8oWYEPqqQ
实战中各种稀奇古怪的身份验证漏洞:
1.1 未限制爆破
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爆破的脚本:
将其发送到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 限制登录频率爆破
1.7 Authorization爆破(密文爆破)
实验演示:BP爆破
我们打开路劲,输入账号和密码,后台BP抓数据包:
我们将我们抓到的报文发送给Repeater模块:
可以看到这里是密文的部分,我们将其复制下来,到base64网站上进行解码:
我们可以看到他加密的格式如上所示,那我们遇到这种加密的情况的话,该如何进行爆破?
我们将其发送给Intruder模块:
将你需要爆破的密文添加上payload位置:
我们来到有效载荷,选择自定义迭代器:
在1这里添加上我们要爆破的用户名:
由于我们之前看到的密文机密后的格式是这样的admin:123456,所以在位置2这里我们要加上:号。
在位置3这里添加上我们的密码:
然后我们对我们的payload做一个处理:
添加规则,对我们刚刚的payload进行一个base64加密:
然后开始我们的爆破:
不过我们的网站有一个功能,当我们尝试重复登录时,为了防爆破,限制了我们的登录次数,所以导致我们的响应都401了:
正常情况下来说,如果网站没有这种功能,一般都是可以密文爆破成功的。
1.8 密文传输爆破
我们将我们抓到的数据包发送到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为我们解决了这个难题。
1.10 Cookie欺骗漏洞