1.逻辑漏洞的概要
逻辑漏洞是基于开发人员设计程序时,逻辑不严密,导致攻击者可以修改,绕过,中断整个程序,让程序按照开发人员的预料之外去执行
如某一网页的登录验证逻辑:
输入用户名,密码------输入验证码----数据包前端传到后端处理----数据库匹配---匹配成功回包
破解:BP抓取用户名,密码,验证码特定格式-----发送给后端匹配
只要你能修改,绕过,中断整个开发者运行软件的整体逻辑,就是逻辑漏洞
2.逻辑漏洞的分类
1.软件(系统)设计之初便存在的漏洞(如SQL注入,文件上传,永恒之蓝)
2.使用者未能安全使用软件产生的(如弱口令,匿名用户)
1.身份验证漏洞:暴力破解漏洞
利用BP的intruder的模块,绕过有验证码且验证码相对简单,就可以用pkav工具来试下,如果bp解决不了,就得自己写脚本来破解
以pkav工具为例
1.通过bp抓包
2.将bp抓到的包复制到pkav中,给要爆破的字段添加标价
3.找到验证码的路径
4.将验证码路径放到验证码识别模块中进行识别
5.去发包器重发起攻击并且在返回包中查看结果
2.暴力破解漏洞----未限制爆破
未限制爆破,即对于用户登录的地方没有做什么限制爆破的策略。因此对于这个地方可以直接使用bp来抓包放进intruder模块爆破(和上一个相比,就是省了验证码而已)
3.暴力破解漏洞----限制ip爆破
有些网站,针对账户爆破问题会采用限制ip的方式。当短时间内,如果有大量来自该ip的尝试登录现象时就会封锁该ip,导致该ip无法使用,针对这种情况,可以直接写脚本,调用git开源的代理api来爆破,当然也开源直接用别人的轮子
自建轮子的方法:首先新建一个代理池,现在好用的一般是收费版本的,这里开源自行购买。以一个代理举例
通过python调用代理池,结合bp抓包进行爆破
#python代码如下
import requests
import re
def post():
curl = "你网站靶机的IP"
proxy = {'http':'127.0.0.1:8080'} #代理地址以及端口,如果需要使用,可以自建资源池
header = { 报文头 } #f12查看,复制黏贴即可 如 'User-Agent':'asdfasfd'
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
原理: 通过python代码向代理池发送数据包,每次的proxy都不一样(proxy是从代理池中随机抽一个出来的),假设一个ip有5次机会,10000个IP就有 50000个机会进行爆破
4.暴力破解漏洞---限制密码错误次数来爆破
假设网站限制了某个账号的登录次数,假设超过登录次数,账号就会被锁定,过一段时间会自动解锁;
假设他限定了一个账号在规定时间内只能输入5次,那么我们可以拿5个弱密码,对不同的账号进行爆破;即爆破用户名
5.暴力破解漏洞----多字段爆破
多字段爆破即爆破的字段>=2,比如说需要同时爆破 账号,密码,验证码
当我们爆破一个网站时返回信息是用户名或密码错误时,大多数仍然使用burpsuite的intruder模块。
多字段爆破的范围: 账号,密码,验证码,cookie,session,token
以账号密码token为例,为什么会有token?
当我们访问网站时,网站会下发一个token,当我们登陆时,得带着token一起,服务器会对账号密码token这三个字段进行验证。token是一次性的
以pikaqiu靶场为例
当爆破时,需要带上服务器的token
bp抓包,并送到intruder模块,对需要爆破的password和token进行标记,并选择 Pitchfork模式
对于password字段,就采用simplist的payload
对token字段,采用Recursive grep(递归) 就是这个值为上一次服务器的返回包中的值
关于token的配置
双击token的value,bp会自动帮你匹配到位置
由于每一次的token不一样,所以我们需要去资源池中改一下线程
补充:如果想要让第一个payload有效,则需要人工的去获取第一个token
配置完成后直接开启攻击
看返回包-----通过长度进行筛选:正确的密码长度只要一个
如果字段非常多,而且获得也非常的复杂,就需要我们自己编写脚本
import requests
import re
purl = "http://192.168.1.157/pikachu/vul/burteforce/bf_token.php" #这里需要修改
user_token = "27536628ca8f3b0818871451285" #第一次的token值
proxy = {'http':'127.0.0.1:8080'} #可以集合bp看看发送的报文
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0',
'Cookie': 'PHPSESSID=17u0i2fakm84eq9oc24boc8715'} #以实际情况
def token(response):
user_token = re.findall('value=".*."', response)[0][7:-1] #通过正则取出token
return user_token
def uandp(user_token):
f = open('result.csv', 'w') #把爆破结果储存到文件里,这里为csv格式
f.write('用户名' + ',' + '密码' + ',' + '包长度' + '\n') #给文件设置标题
sum = len(open("p.txt").readlines())*len(open("u.txt").readlines()) #密码本的总数量,最后得出进度
dan = 0
for u in open("u.txt") :
for p in open("p.txt") :
u = u.replace("\n","") #过滤掉回车符
p = p.replace("\n","")
session = requests.session() #会话保持
data= {'username':u,'password':p,'token':user_token,'submit':'Login'} #初始数据
response = session.post(purl,data=data,headers=header).text
user_token = token(response)
result = u + ',' + p + ',' + str(len(response)) #用户名密码以及响应包长度
f.write(result + '\n') #输出到文件
dan = dan + 1
print("进度:"+str(dan)+'/'+str(sum)) #输出到终端
# print(response)
f.close()
if __name__ == '__main__':
uandp(user_token)
6.暴力破解----限制登录频率爆破
限制登录频率爆破即限制在一定时间内爆破次数,比如10分钟内只允许爆破十次,对于这种方式,可以采用演示爆破的方式,但是可能需要时间比较久。需要在bp上修改设置:
7.Authorization爆破(密文爆破)
Authorization爆破,狭义上单纯指basicbase64爆破,比如tomcat的密码在传输的时候,是采用base64编码的,而广义上可以泛指经过编码后的用户名与密码
找到加密方式----常规的爆破
以加密方式为 base64为例
首先:通过bp抓包
划线的就是我们要爆破的东西,将这个玩意拿去解码看看
可以看到,我们输入的数据将由三个部分组成: 用户名 冒号 密码
回来bp,设置爆破的位置和模式
在位置那一栏 第一个位置填用户名 如 admin
第二个位置填 :
第三个位置填密码,如 1234556
最终结果
7.密文传输爆破
渗透测试中,有时会遇到密码从客户端到服务端中间通过前端js代码将密码加密后,在发送给服务器,这个时候,我们可以采用bp上自带的加密方式进行加密。
常见的加密手法有MD5或者RSA,如果是较为复杂的JS加密,就需要读懂JS的加密逻辑,通过自定义的python脚本进行爆破,或者使用python的pyexecjs包来帮助执行JS文件复现加密方式
怎么找加密方式?
通过f12拿到密码的name,然后去js代码中通过name查找
对name的值进行搜索,可以直接搜索到js的加密
加密方式:将密码先进行md5加密,得到x1,将x1转化为全大写后加上冒号和cookie得到x2
对x2进行md5加密得到x3,将x3转化为全大写得到x4
最后的值为 账号名:x4
Session固定攻击(未授权)
漏洞介绍:会话固定攻击时利用服务器session不变机制,借他人之手获得认证和授权,然后冒充他人
漏洞原理:在请求登录过程时,url带有一个session,登录成功之后会将登录成功的信息绑定到这个session中,攻击者可以发送带有session的url给相关工作人员诱导其登录,相当于获取了其身份信息。
漏洞点:在GET请求登陆时,带有session值
修复思路:只要避免在url中带入session信息即可比较有效的防御,另外注意POST请求中带有sessionid进行session固定攻击。
测试方法:直接赋值session然后更换浏览器打开或者使用无痕模式打开,如果直接访问,不需要登录,说明存在该漏洞
Cookie欺骗漏洞
漏洞介绍:通过伪造cookie信息能够伪造其他用户进行登录
漏洞原理:开发者为了方便将 身份信息/登录信息 明文或者简单编码,哈希之后存放在cookies中,网站通过获取得到的cookies进行授权或者身份验证
漏洞点:cookie中有明显或者只是简单编码,哈希的字段时候修改lsLogin值为1可以判定用户已经登录
漏洞修复:cookie不应该存储可理解的身份信息和登录信息;按照规定,cookie对身份信息和登录信息的存储只能通过存储足够长度的随机字符串进行,避免篡改。
如果某网站的cookie:asp163=admin,那我们只需要等待管理员登录成功后,网站存在登录信息后即可进行登录,构造报文进行登录,安装editthiscookie可以迅速看到cookie值
还有一种可能,就是cookie的校验值过于简单。如,有些网站以用户名,邮箱号或者用户id等来作为cookie的判断标准。为了图方便,直接做了静态加密。
这种情况,我们只需要对用户名进行爆破即可。
限制条件:cookie得对方登录并且没有退出才能生效,因此必须24小时监控着
未进行登录凭证验证
有些业务接口,因为缺少了对用户的登录凭证的校验或者是验证存在缺陷,导致黑客可以未经授权访问这些敏感信息甚至是越权操作
案例1: 在某些电商后台主页面,可以直接输入 main.php直接登录进去
案例2:某航天公司订单ID枚举
仔细看,id固定为 0031003+数字+003+数字+003+数字,其实,需要穷举的就是13位左右,如果能够访问,会泄露大量的用户个人资料