渗透测试小练习(1)尝试一个图形验证码绕过的复现
渗透测试小练习(1)尝试一个图形验证码绕过的复现
原创 catfish 透明魔方 2024-12-11 11:30
今天一起练习一个好玩简单的东东——尝试一下图形验证码绕过的复现。
图形验证码一般在登录处都会有,所以这招我感觉可以一招鲜吃遍天。
反正都快速试一下,说不定就挖个小低危,对于刚入行还未独立开始测试的工程师来说掌握一下也不错的。
这个测试点主要是看图形验证码是不是重复有效的,比如我们指定一个固定的弱口令12345678,可以遍历账户尝试,总有账户使用这个弱口令。
上图中验证码是5003,我们使用BurpSuite抓包,然后使用用户名字典进行暴力破解。
然后发现这个验证码没有起到实际的作用,我们可以不断遍历账号。
发现能遍历就说明问题了,我们不需要真正遍历出来一个使用123456弱密码的账号。
那么,这种问题怎么解决呢?以下是一个修复建议。
1、判断
SessionID为空的情况;确保每次用户请求时,服务器都能提供一个有效的SessionID,并且在图形验证码校验后,无论结果如何,都能强制刷新SessionID,防止会话固定攻击和验证码重用。
下面给伪代码看看:
def request_handler(request):
session_id = request.get_cookie('SessionID')
if not session_id or not is_valid_session_id(session_id):
session_id = generate_session_id()
request.set_cookie('SessionID', session_id, http_only=True)
# 其他业务逻辑...
if 'captcha' in request and request.captcha_valid:
session_id = generate_session_id()
request.set_cookie('SessionID', session_id, http_only=True)
return handle_request_with_captcha(request)
else:
return error_response('Invalid captcha')
2、图形验证码校验应与操作数据校验同时进行,不可以分步校验,确保图形验证码的校验与用户的操作数据(如登录信息)同时进行,防止分步校验导致的安全漏洞。
def login_request_handler(request):
user_data = request.get_user_data()
captcha = request.get_captcha()
if not validate_captcha(captcha) or not validate_user_data(user_data):
return error_response('Invalid credentials or captcha')
# 如果验证码和用户数据都有效,继续处理登录逻辑
return handle_login(user_data)