渗透测试小练习(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)