BurpSuite暴力破解和防御实战
burpsuite暴力破解
工具准备
burp suite
用于攻击web 应用程序的集成平台
jsEncrypter
一个用于前端加密Fuzz的Burp Suite插件,支持base64、sha、md5、RSA等加密
phantomjs
可用于网络监测、网页截屏、无界面 Web 测试、页面自动化的命令行工具
上述文件已打包存储:链接:https://pan.baidu.com/s/1CqYT7toC_qxF0pJn0kWrxQ 提取码:9bl8
本次使用相关工具版本为:Burp_Suite_Pro_v1.7.37、jsEncrypter.0.3.2、phantomjs-2.1.1,各软件安装配置自行网上查找,配置完成后应如下方截图:


接口抓取
- 浏览器配置代理
- burp 启动代理
- 访问对应系统分析接口

当我们随便输入了账号密码点击了登录之后,发现传输的参数是被加密了。
分析加密方法

所以接下来我们需要做的就是实现此加密方法后在爆破请求时把请求的参数信息对表单信息尽心加密。并且得知加密过程为:
# 1. 把输入的账号密码转为对象
loginInfo = {account:unamebalabala,password:pwdbalabala}
# 2. 把上面的对象进行RSA加密
ency_text=JSEncypt.encypt(loginInfo)
# 3. 对加密后的字符进行base64加密
ciphertxt=Base64.encode(ency_text)
# 4. 生成新的对象后调用接口
data={'ciphertxt':ciphertxt}
使用phantomjs进行本地调试
启动报错

查看phantomjs_server.js文件,同级目录下没有script-1.js文件,需要把依赖文件放在同级目录下。
查看官网加密例子
在jsEncrypter-master\test\TestScript\RSA 目录下可以看到RSA加密的例子

已经实现的RSA加密方法

通过官方的例子我们可以看到phantomjs使用jsencrypt加密的过程:
# 1. phantomjs运行加密js文件,即: phantomjs jsEncrypter_rsa.js
# 2. 加密js文件引入了封装好的加密方法的js,即 phantom.injectJs('jsencrypt.js')
# 3. 引入文件后启动一个本地服务,供调用测试(burp在爆破前也是调用此服务接口对参数进行加密的)
抄官方的例子,实现加密方法


在burp中验证加密方法 (或者在postman中也可以验证)


爆破过程
- 添加接口到爆破模块

添加爆破点
此处仅添加了一个爆破点即账号密码加密后的

- 添加参数处理方法

开始爆破并定位成功请求
可根据请求状态或者响应长短来定位不同请求的结果,例子中根据响应内容长度来确定破解状态。

补充:攻击类型
针对爆破点有四种攻击类型,以账号密码两个爆破点为例:

若爆破点1的枚举值个数为8个,爆破点2的枚举值个数为9个,则下列攻击类型分别产生的攻击次数为:
Sniper:仅需设置一个值域,所有爆破点用一个枚举值域进行爆破。
仅针对一个爆破点进行爆破,即爆破过程中其他爆破点的值保持不变。则分别对爆破点1和爆破点2进行8+8=16次爆破。
Battering ram:仅需设置一个值域,所有爆破点用一个枚举值域进行爆破。
同时对多个爆破点使用值域中的同一个值进行爆破。则总爆破次数为值域的个数,即8次(此处使用账号值域)
Pitchfork:分别设置值域,同时对多个爆破点使用对应爆破点的值域进行爆破。
即账号密码一一的对应取值爆破,则总爆破次数为值域少的爆破点的次数,即8次。
Cluster bomb:分别设置值域。同时对多个爆破点的值域取笛卡尔积进行爆破。
则总爆破次数为8*9=72次。
注:爆破过程可分别对各爆破点参数进行参数处理。
爆破过程总结
对于未加密的参数,可以直接使用自带的枚举域根据类型进行爆破,也可以根据一定规则导入数据
对于简单参数加密,burp自带了参数修改方法:正则替换、前后缀、加解密等
复杂的参数处理、加密等需要从页面查找加密方法,
实现后通过phantomjs启动代理服务,在请求发起时对参数进行处理后请求接口a. 本质上是启动了一个服务,调用接口返回加密结果,ip127.0.0.1 port 1664 body={"playload":para}
b. 可通过jsEncrypter使用js编写加密方法
c. 也可以使用其他脚本语言编写接口实现加密方法
本次使用的是JsEncrypt插件进行的加密,可使用python编写插件
补充:使用python编写服务的时候的坑
- 坑1:在burp中测试连接的时候连接不上

虽然不影响加密调用但是心里慌啊,分析jsencrypt例子

原来不发post就直接返回就好了,所以需要多写一个get请求

坑2:还以为只是一个简单的post带form就完了,结果写的时候不知道消息体参数呀
只能在原来的JsEncrypt中找消息体了:加上请求的日志

分析请求的数据:请求方法、类型、数据、都出来了

坑3:以为写个post参数模型就能搞定json请求,结果postman能访问,但是burp的JsEncrypt请求不了。。。仔细看上面的请求Content-type,不是json啊,,,继续优化

最后终于搞定了...上码:(文中的加密方法参考https://blog.csdn.net/Orangesir/article/details/114990606)
# -*- coding:utf8 -*-
"""
@ Author: 吕文举 wjlv4
@ File: Encrypt.py
@ Time: 2021/11/03
@ Contact: wjlv4@iflytek.com
@ Desc: Encrypt.py 加密实现
"""
import base64
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pksc1_v1_5
from Crypto.PublicKey import RSA
def _encrpt(string, public_key):
rsakey = RSA.importKey(public_key) # 读取公钥
cipher = Cipher_pksc1_v1_5.new(rsakey)
# 因为encryptor.encrypt方法其内部就实现了加密再次Base64加密的过程,所以这里实际是通过下面的1和2完成了JSEncrypt的加密方法
encrypt_text = cipher.encrypt(string.encode()) # 1.对账号密码组成的字符串加密
cipher_text_tmp = base64.b64encode(encrypt_text) # 2.对加密后的字符串base64加密
# 源码除了encryptor.encrypt加密外,又一次对密文进行了Base64加密,所以我们这里也再次加密
cipher_text = base64.b64encode(cipher_text_tmp)
return cipher_text.decode()
def gen_body(account, pwd, public_key=None):
'''根据账号密码生成请求的body然后调用_encrpt方法加密'''
if not public_key: public_key = 'MIGfMA0GxxxxxxxxxxEBAQUAA4+QKBgQCFa8mE++++++++++hMrwZ7+++Vbtb7Rcnjw9Pxxxx++xxabG6QL0G2++++xxxx++JH6Q++++W+BqH920D+++++++++++kG0Z+++++BuSZNH++++xxxx++WX1NHHDDMwSOS3PqFJ+BVOm++++++DAQAB'
key = '-----BEGIN PUBLIC KEY-----\n' + public_key + '\n-----END PUBLIC KEY-----'
encrypt_res = _encrpt("{'account': '%s','password':'%s'}" % (account, pwd), key)
return encrypt_res
# -*- coding:utf8 -*-
"""
@ Author: 吕文举 wjlv4
@ File: server.py
@ Time: 2021/11/03
@ Contact: wjlv4@iflytek.com
@ Desc: server.py 用于burp通过JsEncrypt请求的服务
"""
from typing import Optional
from fastapi import FastAPI, Body
from pydantic import BaseModel
from Encrypt import gen_body
app = FastAPI()
class Payload(BaseModel):
payload: str
@app.post('/')
async def get_encrypt_body(payload: Optional[str] = Payload, payload_info: Optional[str] = Body(None)):
"""
获取生成加密参数
- payload: 支持json传参
- payload_info: 支持body传参,传的是字符串payload=xxxx
- return 加密后的字符串
"""
if payload_info:
print(payload_info)
payload_k, payload = payload_info.split('=')
pub_key = 'MIGfMA0GC++++++++QCFa++++3F+7c+++++++iEKAOW+eabG6QL+++++++++bFhW+BqH92+++++kG++++CZVH3OBuSZNHYz++++++++BVOmlz++++DAQAB'
encrypt_str = gen_body(payload, payload, pub_key)
return encrypt_str
@app.get('/')
async def get_encrypt_status():
"""
随便返回点什么,让burp的jsEncrypt能连上就行
"""
return 'hello jsEncrypter!'
if __name__ == '__main__':
import uvicorn
uvicorn.run('server:app', host='127.0.0.1', port=1664, reload=True)
postman么得问题

burp使用JsEncryptor也么得问题

爆破防御
针对爆破的防御有如下措施:
- 密码强度增强——不要用常见密码
- 网站对请求加密
- 前端增加重试验证码校验
- 前端项目打包不允许查看项目源码
- 限制ip对接口的访问频率
本次演示的系统使用了nginx代理,直接在nginx中配置访问频率即可 (参考资料https://www.w3cschool.cn/nginxsysc/nginxsysc-limit-req.html)


再次通过burp爆破,查看是否生效。

可以看到上方已经限制了攻击ip的请求
思考
- 接口参数加密可单独对某参数加密,或分别使用不同的加密方法,建议组合参数为新的消息体后加密
- 接口提示信息不要明确到账号错误、密码错误,建议使用账号或密码错误
- 这里仅演示了js和python复写了对于参数加密的方法,依赖的是JSEncrypt,但是是可以使用Jython单独写插件的,有时间再多研究
- 插件除参数加解密还能操作请求头、响应头,增加sql注入等,还有很多要学
BurpSuite暴力破解和防御实战的更多相关文章
- SSH密码暴力破解及防御实战
SSH密码暴力破解及防御实战 一.Hydra(海德拉) 1.1 指定用户破解 二.Medusa(美杜莎) 2.1 语法参数 2.2 破解SSH密码 三.Patator 3.1 破解SSH密码 四.Br ...
- 用burpsuite暴力破解后台
[实验原理] Burp Suite是Web应用程序测试的最佳工具之一,其多种功能执行各种任务.请求的拦截和修改,扫描web应用程序漏洞,以暴力破解登录表单,执行会话令牌等多种的随机性检查. Burp ...
- Burpsuite暴力破解
神器:burpsuite 闲话不多说,直接开搞 1.打开文件BurpLoader.jar,进入Proxy--Options,启用代理 2.打开浏览器(IE),进入Internet选项-连接-局域网设置 ...
- burpsuite暴力破解之四种方式
给出字典排列.详情: 1. 2. 第一项:snipper(中译:狙击手) 1.为两个参数添加payload并且选中snipper,同时指定一个字典. 2.开始attack,并且给出响应结果. 可见有两 ...
- burpsuite暴力破解dvwa的登录密码
前提准备条件: 1.下载安装dvwa,下载链接地址:http://www.dvwa.co.uk/. 2.安装php+mysql环境,我用的是这个软件(phpStudy)下载地址:https://www ...
- Web攻防之暴力破解(何足道版)
原创文章 原文首发我实验室公众号 猎户安全实验室 然后发在先知平台备份了一份 1 @序 攻防之初,大多为绕过既有逻辑和认证,以Getshell为节点,不管是SQL注入获得管理员数据还是XSS 获得后台 ...
- 教你用免费的hihttps开源WEB应用防火墙阻止暴力破解密码
教你用免费的hihttps开源WEB应用防火墙阻止暴力破解密码 很多企业都有自己的网站,需要用户登录后才能访问,但有大量的黑客攻击软件可以暴力破解网站密码,即使破解不了也非常恶心.有没有免费的解决办法 ...
- BP暴力破解
BurpSuite暴力破解 1.设置代理 首先要用phpstudy打开Mysql和Apache,然后将设置浏览器代理,地址127.0.0.1 端口8080 2.进入dvwa靶场 进入dvwa时,要用 ...
- Burpsuite教程与技巧之HTTP brute暴力破解
Burpsuite教程与技巧之HTTP brute暴力破解 Gall @ WEB安全 2013-02-28 共 19052 人围观,发现 32 个不明物体收藏该文 感谢Gall投递 常规的对usern ...
- 安全性测试入门:DVWA系列研究(一):Brute Force暴力破解攻击和防御
写在篇头: 随着国内的互联网产业日臻成熟,软件质量的要求越来越高,对测试团队和测试工程师提出了种种新的挑战. 传统的行业现象是90%的测试工程师被堆积在基本的功能.系统.黑盒测试,但是随着软件测试整体 ...
随机推荐
- JSP过滤器、Session监听器、Servlet控制器的关系和执行顺序
1.首先配置好过滤器和监听器,访问index.jsp页面(在index.jsp中设置session的Attribute属性.session的失效时间,查看的顺序是什么?); 1.运行Tomact的结果 ...
- 记录 springboot 整合swagger2 出现documentationPluginsBootstrapper&&NullPointerException异常
记录 由于springboot版本高 整合swagger2出现null异常 springboot 版本: swagger2 依赖版本: 出现的异常: 解决方案: application 添加如下依赖 ...
- Netty实战学习笔记
第一部分 Netty的概念及体系结构 1.Netty异步和事件驱动 2.你的第一款Netty应用程序 3.Netty的组件和设计 4.传输 5.ByteBuf 6.ChannelHandler和Cha ...
- Pytorch实战学习(一):用Pytorch实现线性回归
<PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili P5--用Pytorch实现线性回归 建立模型四大步骤 一.Prepare dataset mini-batch:x.y ...
- D - Pair of Topics
D - Pair of Topics 思路: 这个题需要一点思路,ai+aj>bi+bj可以转换成ai-bi+aj-bj>0,也就是c[i]=a[i]-b[i],只需要找c[i]+c[j] ...
- SQL开窗函数用法
开窗函数分类: 根据使用的目的,开窗函数可以分为两类:聚合开窗函数和排序开窗函数. 下面主要解析四种常用的排序开窗函数: 1.ROW_NUMBER() OVER () : 对相等的值不进行区分,序号连 ...
- 日志分析查看—— cat+grep+awk+uniq+sort+wc+join
有个统计日志信息的需求,下面是使用到的命令 //按 \t 对文件每一行进行切割,正则匹配第二列为32896时,输出第一列:再进行排序并去重,最后统计行数 cat file.log|awk -F '\t ...
- vite + vue3 + js + xlsx 导出excel
安装依赖 1 npm install xlsx --save 使用版本 封装js /* 导出excel文件 */ /** * 导出excel文件实现思路分析 * * 1.通过XLSX插件的 XLSX. ...
- idea的操作快捷键
IDEA调试快捷键 F8 跳到下一步 相当于eclipse的F6 F7 进入到方法 相当于eclipse 的F7 F9 恢复程序到下一个断点 相当于eclispe的 进入下一个断点 shift+F8 ...
- webssh
目录 使用 jupyter notebook 使用webssh GateOne 使用 jupyter notebook pip install jupyter ipyton # 启动 jupyter ...