Burp Suite API插件开发指北 | Part 2 篡改HTTP请求头
本文由
创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载
写在前面的话
正如开篇结尾时说的,我们这个系列文章会更接近实际问题来进行讲解
现在我们假设一个场景:目标站点在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 ***");
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
文章目录