python 模擬http請求走私

筆者準備使用python嘗試模擬下http請求走私的一些情況(CL-TE)触机,我看網(wǎng)上用brup的比較多哈畜普。
首先準備一個WebServer砸脊,筆者這里準備使用python和tornado (tornado這里是支持keep-alive的)涡匀, 都用最新的吧拴事。

  1. tornado起一個簡單的web服務(wù)蒋伦。
# -*- 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發(fā)送http協(xié)議的數(shù)據(jù)
# -*- 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("響應(yīng)內(nèi)容如下:")
        print(response_data.decode())

    except Exception as e:
        print(e)


if '__main__' == __name__:
    main()

這里如果同時啟用Transfer-Encoding和Content-Length弓摘,tornado會出現(xiàn)報錯(Response with both Transfer-Encoding and Content-Length)因此請求頭內(nèi)只給chunked,注釋掉了length痕届。

分析結(jié)果首先 /get_demo 請求成功韧献,但是后續(xù)的 GGET /get_demo 請求會報405(405: Method Not Allowed)。
查看tornado源碼研叫,會發(fā)現(xiàn)httputil.py文件里的parse_request_start_line會被反復(fù)調(diào)用锤窑,直到解析http協(xié)議出錯。
一次http請求讓后端執(zhí)行了兩次解析嚷炉。第二次請求其實就類似于協(xié)議走私渊啰,因為第一次請求里面夾帶了私貨嘛~~~

關(guān)于Content-Length的長度問題,筆者還想分享下申屹。
一般而言绘证,如果length的長度大于實際body內(nèi)容的長度,會導(dǎo)致后端服務(wù)器一直等待哗讥;如果長度小于body內(nèi)容嚷那,會導(dǎo)致后端報錯(Malformed HTTP request line)。如果內(nèi)容為 "abc"杆煞, 則長度為5魏宽。要注意 特殊符號 "\r\n"占了2字節(jié)腐泻,需要放在"abc"后面。也就是body實際內(nèi)容為 "abc\r\n"队询,如果想包含最后一個換行和空格派桩,也行(也就是7)。但是超過7就不行了蚌斩,會導(dǎo)致后端一直等待窄坦。

筆者這里列出content-length分別為 1至8的全部結(jié)果,僅供參考凳寺。

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: 無響應(yīng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市彤侍,隨后出現(xiàn)的幾起案子肠缨,更是在濱河造成了極大的恐慌,老刑警劉巖盏阶,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晒奕,死亡現(xiàn)場離奇詭異,居然都是意外死亡名斟,警方通過查閱死者的電腦和手機脑慧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砰盐,“玉大人闷袒,你說我怎么就攤上這事⊙沂幔” “怎么了囊骤?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冀值。 經(jīng)常有香客問我也物,道長,這世上最難降的妖魔是什么列疗? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任滑蚯,我火速辦了婚禮,結(jié)果婚禮上抵栈,老公的妹妹穿的比我還像新娘告材。我一直安慰自己,他們只是感情好古劲,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布创葡。 她就那樣靜靜地躺著,像睡著了一般绢慢。 火紅的嫁衣襯著肌膚如雪灿渴。 梳的紋絲不亂的頭發(fā)上洛波,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音骚露,去河邊找鬼蹬挤。 笑死,一個胖子當著我的面吹牛棘幸,可吹牛的內(nèi)容都是我干的焰扳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼误续,長吁一口氣:“原來是場噩夢啊……” “哼炎辨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暂衡,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤青自,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后栽烂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躏仇,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年腺办,在試婚紗的時候發(fā)現(xiàn)自己被綠了焰手。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡怀喉,死狀恐怖书妻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躬拢,我是刑警寧澤驻子,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站估灿,受9級特大地震影響崇呵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜馅袁,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一域慷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汗销,春花似錦犹褒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至削茁,卻和暖如春宙枷,著一層夾襖步出監(jiān)牢的瞬間掉房,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工慰丛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卓囚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓诅病,卻偏偏與公主長得像哪亿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贤笆,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容