freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Burp Suite API插件开发指北 | Part 2 篡改HTTP请求头
2025-01-02 13:42:21
所属地 重庆

写在前面的话

正如开篇结尾时说的,我们这个系列文章会更接近实际问题来进行讲解

现在我们假设一个场景:目标站点在HTTP 请求头中有一个SHA256的Hash值需要校验,如果我们在拦截修改请求之后没有对这个哈希值重新计算,那么该请求会被目标站点的后端拒绝。
当然,我们也可以通过Proxy以及Repeater中手动给每一个请求替换哈希值。手动替换一两个倒还没啥,数量多了显然就不是一个明智之举。当前最优的解决方案就是写一个插件,让插件来完成这个繁琐的任务。

场景模拟

用flask Web框架快速创建一个模拟场景:

import flask
from flask import request
from hashlib import sha256

app = flask.Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def handle_request():
    hash = request.headers.get('Hash')
    body = request.get_data()
    calculated_hash = sha256(body).hexdigest()
    if hash is not None:
        if str(hash).strip() == calculated_hash:
            data = request.form.get('data')
            if data is not None:
                return data
            else:
                return "No data provided."
        else:
            return "Invalid signature!"
    else:
        return "No hash provided."

app.run(host="127.0.0.1", port=5000, debug=True)

从请求头提取Hash值,然后与计算得出的请求体的哈希值进行比对,校验通过就返回请求体中data字段内容,否则后端就返回失败消息。

以下是正常通过校验的请求以及响应

GET / HTTP/1.1
Host: 127.0.0.1:5000
Connection: keep-alive
Hash: 8897c835cf0001adff74ddf1953bc2f24d36fb3448ec180528ae0640f55f42e0
Content-Type: application/x-www-form-urlencoded
Content-Length: 20
data=Attack+succeed!
HTTP/1.1 200 OK
Server: Werkzeug/3.1.3 Python/3.12.6
Date: Mon, 23 Dec 2024 03:46:38 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 15
Connection: close

Attack succeed!

以下是我们修改了请求体内容,却没有重新计算生成新的hash,导致无法通过后端校验的请求及响应

GET / HTTP/1.1
Host: 127.0.0.1:5000
Connection: keep-alive
Hash: 8897c835cf0001adff74ddf1953bc2f24d36fb3448ec180528ae0640f55f42e0
Content-Type: application/x-www-form-urlencoded
Content-Length: 20
data=Attack+succeed!+1
HTTP/1.1 200 OK
Server: Werkzeug/3.1.3 Python/3.12.6
Date: Mon, 23 Dec 2024 03:58:26 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 18
Connection: close

Invalid signature!

编写插件

直接照搬我们上一章的内容,先把插件框架写出来

package arr;

import burp.api.montoya.BurpExtension;
import burp.api.montoya.MontoyaApi;
import burp.api.montoya.logging.Logging;

public class HelloWorld implements BurpExtension {

    MontoyaApi api;
    Logging logging;

    @Override
    public void initialize(MontoyaApi api) {
        api.extension().setName("Hello World");
        this.api = api;
        this.logging = api.logging();
        this.logging.logToOutput("*** Freebuf.com - Hello World loaded ***");
# Burpsuite插件
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录