python 模拟http请求走私

笔者准备使用python尝试模拟下http请求走私的一些情况(CL-TE),我看网上用brup的比较多哈。
首先准备一个WebServer,笔者这里准备使用python和tornado (tornado这里是支持keep-alive的), 都用最新的吧。

  1. tornado起一个简单的web服务。
# -*- coding: utf-8 -*-
import tornado.ioloop
import tornado.web
import logging

logging.basicConfig(level=logging.DEBUG)


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        try:
            data = self.request.body.decode()
            print('data: ', data)
            self.write({"code": 2000, "msg": "get ok", "data": data})
        except Exception as e:
            print(e)

    def post(self):
        try:
            data = self.request.body.decode()
            self.write({"code": 2000, "msg": "post ok", "data": data})
        except Exception as e:
            print(e)


def make_app():
    return tornado.web.Application([
        (r"/get_demo", MainHandler),
        (r"/post_demo", MainHandler)
    ])


if '__main__' == __name__:
    app = make_app()
    app.listen(address="127.0.0.1", port=9000)
    print('listen 9000 success')
    tornado.ioloop.IOLoop.current().start()
  1. python使用socket发送http协议的数据
# -*- coding: utf-8 -*-
import socket
import time

server_host = "127.0.0.1"
server_port = 9000


def main():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((server_host, server_port))
    try:
        http_request = (f"GET /get_demo HTTP/1.1\r\n"
                        f"Host: {server_host}\r\n"
                        f"Transfer-Encoding: chunked\r\n"
                        f"\r\n"
                        f"3\r\n"
                        f"abc\r\n"
                        f"0\r\n"
                        f"\r\n"
                        f"GGET /get_demo HTTP/1.1\r\n\r\n"
                        )

        client_socket.send(http_request.encode())
        response_data = b""
        time.sleep(1)
        data = client_socket.recv(1024)
        response_data += data
        print("响应内容如下:")
        print(response_data.decode())

    except Exception as e:
        print(e)


if '__main__' == __name__:
    main()

这里如果同时启用Transfer-Encoding和Content-Length,tornado会出现报错(Response with both Transfer-Encoding and Content-Length)因此请求头内只给chunked,注释掉了length。

分析结果首先 /get_demo 请求成功,但是后续的 GGET /get_demo 请求会报405(405: Method Not Allowed)。
查看tornado源码,会发现httputil.py文件里的parse_request_start_line会被反复调用,直到解析http协议出错。
一次http请求让后端执行了两次解析。第二次请求其实就类似于协议走私,因为第一次请求里面夹带了私货嘛~~~

关于Content-Length的长度问题,笔者还想分享下。
一般而言,如果length的长度大于实际body内容的长度,会导致后端服务器一直等待;如果长度小于body内容,会导致后端报错(Malformed HTTP request line)。如果内容为 "abc", 则长度为5。要注意 特殊符号 "\r\n"占了2字节,需要放在"abc"后面。也就是body实际内容为 "abc\r\n",如果想包含最后一个换行和空格,也行(也就是7)。但是超过7就不行了,会导致后端一直等待。

笔者这里列出content-length分别为 1至8的全部结果,仅供参考。

f"Content-Length: 1\r\n"
f"\r\nabc\r\n\r\n"

Content-Length 1: {"code": 2000, "msg": "get ok", "data": "a"}HTTP/1.1 400 Bad Request
Content-Length 2: {"code": 2000, "msg": "get ok", "data": "ab"}HTTP/1.1 400 Bad Request
Content-Length 3: {"code": 2000, "msg": "get ok", "data": "abc"}HTTP/1.1 400 Bad Request
Content-Length 4: {"code": 2000, "msg": "get ok", "data": "abc\r"}HTTP/1.1 400 Bad Request
Content-Length 5: {"code": 2000, "msg": "get ok", "data": "abc\r\n"}
Content-Length 6: {"code": 2000, "msg": "get ok", "data": "abc\r\n\r"}
Content-Length 7: {"code": 2000, "msg": "get ok", "data": "abc\r\n\r\n"}
Content-Length 8: 无响应

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容