相比SQL注入、XSS漏洞等传统安全漏洞,现在的攻击者更倾向于利用业务逻辑层的应用安全问题。之所以称为逻辑漏洞,是因为代码之后是人的逻辑,人更容易犯错,是编写完程序后随着人的思维逻辑产生的不足。sql注入、xss等漏洞可以通过安全框架等避免,这种攻击流量,非法对原始程序进行了破坏,防火墙可以检测,而逻辑漏洞是通过合法合理的方式达到破坏,这类问题往往危害巨大,可能造成了企业的资产损失和名誉受损,并且传统的安全防御设备和措施收效甚微。
对于逻辑漏洞的分类:
1,软件(系统)设置之初便存在的漏洞;如:永恒之蓝等
2,使用者使用不当;如:弱口令等
一,身份验证漏洞
1,暴力破解
(1),未限制的破解
未限制的破解:对用户登录的地方未做限制爆破的策略;
使用burp即可;
(2),限制IP爆破
在短时间内来自大量的该IP的尝试登录,就会封锁该IP;
使用开源代理池(或付费版本)+python脚本;
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()
(3),限制密码错误次数
超过登录的次数,账号就会被锁定(限制时间/或者管理员);
反向------>根据密码来爆破账号;
通过给定的密码,更换账号,来实现爆破;
(4),多字段爆破
例如需要同时爆破账号,密码和验证码的时候;
案例:pikachu靶场暴力破解token;
使用burp爆破;
采用单线程的爆破方式;
使用python脚本爆破;
import requests
import re
purl = "http://127.0.0.1/pikachu/vul/burteforce/bf_token.php" #这里需要修改
user_token = "27536628ca8f3b0818871451285"
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__':
(5),限制登录频率;
使用burp的延时爆破,使用的时间将会更长;
(6),Authorization爆破;
有些密码在传输过程中可能会使用编码技术,如:tomcat在传输密码的过程中会使用base64编码等;
重点在于破解加密(编码)的方式;
然后使用burp破解;
(7),密文传输爆破;
密码由客户端转向服务器端的时候使用前端的js代码加密(如MD5等),
在前端的页面中搜索看是否对于输入的密码经过处理;
2,session固定攻击
"session" 是一个术语,通常用于描述在网络通信中维护的用户会话状态。在Web开发中,会话(session)是指一系列相关的交互活动,通常涉及用户与服务器之间的通信。会话可以用来跟踪用户的操作、存储用户的状态信息,并确保用户在多个页面之间保持一致的状态。
在Web开发中,服务器会为每个用户创建一个唯一的会话标识符,通常是一个会话ID。这个标识符通常存储在用户的浏览器中,可以通过cookie或URL参数传递。在会话期间,服务器会根据这个会话标识符来识别用户,并在会话中存储和检索用户的状态信息。
会话固定攻击是利用服务器的session不变机制,借他人之手获得认证和授权,然后冒充他人;
漏洞点:在登录时候带有(以get的方式在url中)已经登录成功的session;
3,cookie欺骗漏洞
cookie相当于是"令牌"
保存在客户端;
可以通过伪造或者获取cookie来进行其他用户的登录;
4,未进行登录的凭证验证
有些业务的接口,缺少对于用户登录凭证的校验,或者是验证存在缺陷,导致黑客可以未经授权可以访问这些敏感文件甚至是越权操作;
二,登录验证安全
1,图形验证码
若验证码可以爆破;
验证码过于简单(4位或者说仅仅只有数字)
验证码的复用;
登录失败之后验证码不刷新,仍然可以使用上次的验证码并且有效;
验证码的绕过;
(1),验证码的验证会返回一个状态值,交由前端验证,我们可以使用burp来修改这个状态值;
(2),在点击获取验证码时,在返回包里面会包含正确的验证码;
客户端验证;
验证码的生成,校验全部在前端完成(未经过后端服务器);
依赖于前端的js代码;可以选择禁用js或者删除相应的js代码;
2,短信验证码
无效验证码;
常发生于测试阶段
短信轰炸;
有时间间隔,通常为60s
可以使用python代码,计算间隔时间,实现短信轰炸;
三,登录前端验证漏洞
1,忘记密码
忘记密码--->发送验证信息(手机号或者邮箱)--->进行下一步操作;
如果验证码只有4位,并且没有其他的防御措施;直接爆破即可;
前端的验证其实并不可靠;可能会导致任意账号注册,登录,重置等一些列的问题;
(1),在源代码中直接返回验证码
(2),返回加密后的密码
在修改密码的时候修改参数(手机号/邮箱)从而达到修改其他用户密码的目的;
忘记密码以链接的形式出现;
通过邮箱找回密码时,在邮箱的内部出现一个包含token的url,通过用户的点击,来完成验证;
在登录的状态下;修改自己的密码时,通过抓包,改包从而修改其他用户的密码;
2,重置密码
重置之后改为默认密码;如手机号,身份证号后六位,123456等;
这时可以使用默认密码尝试爆破;
四,任意账号密码
1,未验证邮箱/手机号
开发人员未去验证手机号/邮箱是否有效而直接允许用户注册;
导致账号任意注册;
2,批量注册
使用脚本批量的注册,形成应用层的dos攻击,导致服务器瘫痪;
3,个人信息伪造
对真实身份进行任意填写
4,前端验证审核绕过
对于服务器端返回状态信息交由前端验证;
可以通过抓包,改包实现;
5,用户名覆盖
通过抓包注册admin用户,来覆盖原有的管理员用户;
五,权限(越权)
越权分为水平越权,垂直越权和交叉越权;
水平越权:权限类型不变,权限ID改变
垂直越权:权限ID不变,权限类型改变
交叉越权:权限类型和ID都改变
如下图:
1,水平越权
攻击者可以访问和他具有相同权限的用户的资源;
- 在使用某个功能时,通过用户的唯一标识(ID,用户名等)来访问或者操作对应的数据;
- 通过修改这个唯一的标识,来通过此标识的用户来进行对应的操作;
- 在使用某个功能的时候,通过文件名直接访问文件;
2,垂直越权(提权)
一个低级别的用户尝试访问高级别用户的资源;
比如说由普通用户------>管理员用户
- 由前端的js代码控制,可以禁用某些语句;
- 修改cookie的信息,将usename改为'admin';造成提权;
六,其他类型
1,数据包的重放
通过数据包的重放,造成短信轰炸,邮件轰炸,重复提交订单;
可以使用burp,python脚本自动化生成;
2,条件竞争
条件竞争是指一个系统的运行要依赖于不受事件的先后顺序;
对于这些不受控制的事件,如果没有按照开发人员预定的思路运行,可能就会造成意料之外的结果;
通俗来讲;当一个程序的运行要依赖于线程的顺序时,就会产生条件竞争;
修复:限制同一时间的访问方法只有单一线程;
3,订单金额任意修改
在提交订单时,抓取前端页面,修改金额;
4,接口的无限枚举
有些关键性的接口没有做防御和其他的预防机制;易被爆破;
5,支付漏洞
支付漏洞属于高风险漏洞;
通过修改价钱,数量,状态等参数;
网站接入支付结果有两种方式:
- 浏览器进行跳转通知;(浏览器端的数据更容易被篡改)
- 服务端异步通知;
支付漏洞:
- 首先要抓到关键的数据包;
- 分析数据包;
- pc端,app端,web端都进行尝试;
支付漏洞的防御措施:
- 在后端检查订单的每一个值,包括支付状态;
- 校验价格、数量参数,比如产品数量只能为整数,并限制最大购买数量;
- 与第三方支付平台检查,实际支付的金额是否与订单金额一致;
- 如果给用户退款,要使用原路、原订单退回。比如:退押金,按用户原支付订单原路退回;
- MD5加密、解密、数字签名及验证,这个可以有效的避免数据修改,重放攻击中的各种问题;
- 金额超过指定值,进行人工审核等;