µ±½ñÍøÂç»·¾³Ï¹¥»÷Êֶβã³ö²»ÇÆóÒµÔÚÆ£ÓÚÓ¦¶ÔAPTµÈ¹¥»÷ʱ£¬²ßÂÔ¼°×ÊÔ´½«»áÂýÂýÇãб£¬µ¼ÖºܶàÆóÒµºöÊÓÁËһЩ±¬³ö½Ï¾Ã¡¢ÀûÓÃΣº¦²»´óµÄ©¶´¡£ÕâÖÖÏë·¨±¾ÉíÊÇ´íÎóµÄ£¬Ç§Íò²»ÒªÇáÊÓÈκÎÒ»¸ö¿´ÆðÀ´Ã»Ê²Ã´Î£Ïյĩ¶´£¬µ«ÕâЩ©¶´´ò³ö¡°×éºÏÈ¡±Ê±£¬ÆäÍþÁ¦Ò²Ï൱¿ÉÅ¡£
±¾ÆÚ»Æ½ð³Ç»Æ½ð³Ç¹ÙÍøÊµÑéÊÒ½«¸ø´ó¼Ò·ÖÎöÒ»Öֺڿͳ£ÓõĹ¥»÷©¶´Ò²¾ÍÊÇHTTP×ß˽©¶´µÄÔÀí¡£
©¶´¼ò½é
HTTP×ß˽©¶´×îÔçÊÇÔÚ2005ÄêÓÉWatchfire¼Ç¼µÄ¡£¿´Â©¶´Ãû×Ö¾ÍÖªµÀ£¬ÕâÊÇÒ»¸öÓëHTTPÐÒéÏà¹ØµÄ©¶´¡£ÔÚĿǰµÄÍøÂç»·¾³Ï£¬ºÜ¶àÍøÕ¾¶¼ÊDzÉÓÃǰºó¶Ë·ÖÀëµÄ·½Ê½½øÐпª·¢µÄ£¬µ«²»Í¬µÄ·þÎñÆ÷¿ÉÄÜ»áÓв»Í¬µÄ·½Ê½ÊµÏÖRFCÐÒé±ê×¼£¬Õâʱºò¹¥»÷Õ߾ͿÉÄÜÀûÓÃǰºó¶Ë·þÎñÆ÷¶ÔÊý¾Ý°üµÄ±ß½çÁ˽ⲻһÖµÄÇé¿ö£¬ÏòÒ»¸öÇëÇóÊý¾Ý°üÖвåÈëÏÂÒ»¸öÇëÇóÊý¾Ý°üµÄÒ»²¿·Ö£¬ÕâÑù¿ÉÄÜÔÚǰ¶Ë¿´À´ÕâÊÇÒ»¸öÍêÕûµÄÊý¾Ý°ü£¬µ«ÔÚºó¶Ë¿´À´ÕâÊÇÁ½¸öÊý¾Ý°ü£¬´Ó¶øÈƹýһЩ»Æ½ð³Ç¹ÙÍø¿ØÖÆ£¬Î´¾ÊÚȨµÄ·ÃÎÊÃô¸ÐÊý¾ÝÉõÖÁÍ»ÆÆ±ß½ç¡£
¼òµ¥À´Ëµ£¬Õâ¸ö©¶´¾ÍÊǹ¥»÷ÕßÔÚ¾¹ý²»¶ÏµØÌ½Ë÷Ö®ºó£¬´ó¸ÅÃþÇåÁËǰºó¶Ë¶ÔÊý¾Ý°üµÄ´¦Àí·½Ê½£¬È»ºóÒÔijÖÖÐÎʽ£¬ÀýÈ罫Á½¸öÊý¾Ý°üºÏ²¢³ÉÒ»¸ö£¬·¢Ë͸øºó¶Ë£¬ºó¶Ë¿ÉÄÜ»á³É¹¦½âÎöÁ½¸öÊý¾Ý°ü£¬´Ó¶øÈƹýÇ°ÃæµÄ»Æ½ð³Ç¹ÙÍø»úÖÆ¡£

©¶´ÐγÉÔÀí
ÄÇô¾¿¾¹ÊÇΪʲô»á²úÉúÕâÖÖÇé¿öÄØ£¿ÕâÀïÎÒÃÇÒªÏȽéÉÜ2¸ö¸ÅÄHTTP PipeliningºÍTransfer-Encoding¡£ÔÚHTTP1.1Ö®ºó£¬ÐÂÔöÁËÒ»¸öÌØÊâµÄÇëÇóÍ·Connection£ºKeep-Alive£¬Õâ¸ö×ֶεÄÒâ˼ÊDZíʾÕâÊÇÒ»¸ö³¤Á¬½Ó¡£Ëµµ½³¤Á¬½Ó£¬¾Í²»µÃ²»ÌáÒ»ÏÂTCPÎÕÊÖÁË£¬ÖÚËùÖÜÖª£¬HTTPÊÇÔËÐÐÔÚTCPÉÏÒ»²ãµÄÐÒ飬¶øTCP±¾Éí¾ÍÓÐÆô¶¯ÂýµÄÌØµã£¬ËùÒÔΪÁ˾¡¿ÉÄÜÌá¸ßHTTPµÄÐÔÄÜ£¬³¤Á¬½Óµ®ÉúÁË¡£
ʹÓÃÒì²½¼¼Êõ¿ÉÒÔ½«¶à¸öhttpÇëÇóÅúÁ¿Ìá½»£¬¶ø²»ÓõÈÊÕµ½ÏìÓ¦ÔÙ¿ªÊ¼ÏÂÒ»¸öÇëÇó¡£
È»ºóÎÒÃÇÔÙ˵Transfer-EncodingÕâÒ»¸ÅÄÔÚÒÔǰÎÒÃÇÓÐÒ»¸öÖ¸±êContent-LengthÄܹ»°ïÖúÎÒÃÇʶ±ðÒ»¸öÊý¾Ý°üµÄ±ß½ç£¬ä¯ÀÀÆ÷¿ÉÒÔͨ¹ýContent-LengthµÄ³¤¶ÈÐÅÏ¢£¬ÅжϳöÏìӦʵÌåÒѽáÊø£¬µ«Ëæ×ÅÏÖÔÚ·þÎñ¶ËΪÁËÓû§µÄÌåÑ飬ÏëÒª»º´æËùÓÐÄÚÈÝÒÔ½µµÍTTFBµÄÖµ£¬ËùÒÔÏÖÔÚÎÒÃǼ±ÐèÒ»¸öеĻúÖÆÄܹ»²»ÒÀÀµÍ·²¿µÄ³¤¶ÈÐÅÏ¢£¬¾ÍÄÜÖªµÀʵÌåµÄ±ß½ç¡£
¶Ôû´í£¬Transfer-Encoding³öÀ´¾È³¡ÁË£¬Transfer-EncodingËäȻҲÊÇÒ»¸öÍ·ÐÅÏ¢£¬µ«ÊÇËûÆäʵ±íʾµÄÊÇ·Ö¿é±àÂ룬µ±ÎÒÃÇʹÓÃÁËÕâ¸ö±¨ÎÄÍ·ºó£¬¾Í´ú±í±¨ÎIJÉÓÃÁË·Ö¿é±àÂ룬Õâʱ±¨ÎÄÖеÄʵÌåÐèÒª¸ÄΪÓÃһϵÁзֿéÀ´´«Ê䡣ÿ¸ö·Ö¿é°üº¬Ê®Áù½øÖƵij¤¶ÈÖµºÍÊý¾Ý£¬³¤¶ÈÖµ¶ÀÕ¼Ò»ÐУ¬³¤¶È²»°üÀ¨Ëü½áβµÄ CRLF£¨
£©£¬Ò²²»°üÀ¨·Ö¿éÊý¾Ý½áβµÄ CRLF¡£×îºóÒ»¸ö·Ö¿é³¤¶ÈÖµ±ØÐëΪ 0£¬¶ÔÓ¦µÄ·Ö¿éÊý¾ÝûÓÐÄÚÈÝ£¬±íʾʵÌå½áÊø¡£
Ok¡£Ïà¹ØµÄ¸ÅÄîÎÒÃǶ¼Çå³þÁË£¬´ÓHTTP1.1¿ªÊ¼£¬¾ÍÒѾ֧³ÖÁËͨ¹ýTCP·¢ËͶà¸öHTTPÇëÇ󣬷þÎñÆ÷½âÎö±êÍ·ÒÔ¼ÆËã³öÿ¸ö½áÊøµÄλÖÃÒÔ¼°ÏÂÒ»¸ö¿ªÊ¼µÄλÖã¬ËäÈ»ÕâÌýÆðÀ´ÊǺܺÏÀíµÄÉè¼Æ£¬µ«×ÐϸÏëÏ룬ÕâÒâζןó¶Ë·þÎñÆ÷Óëǰ¶Ë·þÎñÆ÷¾Íÿ¸öÏûÏ¢µÄ½áÊøÎ»ÖñØÐëҪͳһ£¬·ñÔò£¬Èç¹û¹¥»÷Õß·¢ËÍÒ»¸öÄ£ºý²»ÇåµÄÇëÇ󣬸ÃÇëÇ󱻺ó¶Ë½âÊÍΪһ¸öÍêÕûµÄÇëÇó¼ÓÉϲÐȱµÄÏÂÒ»¸öÇëÇó£¬ÕâÑù¾Í»á²úÉúHTTP×ß˽©¶´¡£
HTTP×ß˽©¶´·ÖÀà
1. Content-Length + Content-LengthÇé¿ö£º
¼ÙÉèǰºó¶ËºóÔÊÐí½ÓÊÕÒ»¸öÊý¾Ý°üÖк¬ÓÐÁ½¸öContent-Length£¬ÇÒǰ¶ËÓÅÏÈ¿¼ÂǵÚÒ»¸öÄÚÈݳ¤¶È£¬¶øºó¶ËÓÅÏÈ¿¼Âǵڶþ¸öÄÚÈݳ¤¶È£¬Òò´Ë¹¥»÷Õß¿ÉÒÔ¹¹ÔìÈçÏÂÊý¾Ý°ü£º
POST /HTTP/1.1
Host: example.com
Content-Length: 5
Content-Length: 4
1234A
ÕâÑùǰ¶Ë¶ÁÈ¡µ½µÚÒ»¸öÄÚÈݳ¤¶ÈΪ5£¬¾Í½«Õû¸öÊý¾Ý°ü·¢Ë͸øºó¶Ë£¬¶øºó¶Ëͨ¹ý¶ÁÈ¡µÚ¶þ¸öÄÚÈݳ¤¶Èºó£¬½«¶ÔÊý¾Ý°üÖкìÉ«ÄÚÈÝ·¢ÆðÏìÓ¦£¬¶øÒÅÁôÏÂÀ´µÄÀ¶É«ÄÚÈÝA,½«±»´æ´¢ÔÚ»º³åÇøÄÚ£¬²¢ÓÚÏÂÒ»¸öÊý¾Ý°ü½øÐÐÆ´½ÓºóÖ´ÐУ¬ÕâÑù¾Í»áµ¼Ö·þÎñÆ÷³ö´í£¬ÒýÆðÒâÍâÏìÓ¦¡£ËäÈ»ÕâÖÖÇé¿ö·¢ÉúµÄÄѶÈÌ«¸ß£¬¶øÇÒRFC7230ÒѾ¹æ¶¨ÁË·þÎñÆ÷µ±ÊÕµ½ÇëÇóÖаüº¬Á½¸öContent-LengthÇÒÁ½ÕßµÄÖµ²»Í¬Ê±£¬ÐèÒª·µ»Ø400´íÎ󣬵«ÄÑÃâ»áÓзþÎñÆ÷²»Ñϸñ×ñÊØ¹æ·¶µÄÇé¿ö·¢Éú¡£
2. Content-Length + Transfer-EncodingÇé¿ö£º
¹ËÃû˼Ò壬һ¸öÊý¾Ý°ü¿ÉÄܼȴæÔÚContent-Length±¨ÎÄÍ·Ò²¿ÉÄÜ´æÔÚTransfer-Encoding±¨ÎÄÍ·£¬¼ÙÉèǰ¶Ë°´ÕÕContent-LengthÀ´¶¨ÒåÊý¾Ý°ü±ß½ç£¬¶øºó¶ËÔòÒÔTransfer-Encoding±¨ÎÄͷΪ׼¡£ÄÇô¹¥»÷Õß¿ÉÄܹ¹ÔìÈçÏÂÊý¾Ý°ü£º
POST /HTTP/1.1
Host£ºexample.com
Content-Length£º6
Transfer-Encoding£ºchunked
0
A
ÕâÑùǰ¶Ë¶ÁÈ¡µ½CL×Ö¶ÎΪ6£¬ËùÒԻὫÕû¸öÊý¾Ý°ü·¢Ë͸øºó¶Ë£¬¶øºó¶Ëͨ¹ý¶ÁÈ¡TEµÄ±êÍ·£¬Ã÷È·Á˱¨ÎÄʵÌå²ÉÓÃÁË·Ö¿é±àÂëµÄ·½Ê½£¬·Ö¿é±àÂëÊÇÓÐÌØ¶¨µÄ¸ñʽ£¬Ç°Ò»ÐÐΪ·Ö¿é±àÂë´óС£¬ºóÒ»ÐÐΪ¾ßÌåµÄÊýÖµ£¬×îÖÕÒÔ0Ϊ½á⣬ËùÒÔºó¶ËÖ»¶ÔÊý¾Ý°üÖеĺìÉ«²¿·Ö½øÐÐÏìÓ¦£¬ÒÅÁôϵÄA»á±»ÁôÔÚ»º³åÇøÖУ¬µÈ´ýºóÐøÇëÇóµÄµ½À´£¬×îÖÕÔì³ÉÒì³£¡£
3. Transfer-Encoding + Content-LengthÇé¿ö£º
ͬµÚ¶þÖÖ·½·¨ÀàËÆ£¬Õâ´ÎÊÇǰ¶Ë¸ù¾ÝTransfer-EncodingÀ´¶¨ÒåÊý¾Ý°ü±ß½ç£¬ºó¶Ë¸ù¾ÝContent-LengthÀ´¶¨Òå±ß½ç¡£ÄÇô¹¥»÷Õß¿ÉÄܹ¹ÔìÈçÏÂÊý¾Ý°ü£º
POST /HTTP/1.1
Host£ºexample.com
Content-Length£º3
Transfer-Encoding£ºchunked
1
A
0
ǰ¶ËÔÚ½ÓÊÕµ½TEµÄ±¨ÎÄÍ·ºó£¬Ã÷È·±¨ÎÄʵÌå²ÉÓÃÁË·Ö¿é±àÂ뷽ʽ£¬²¢ÇÒÒÔ0Ϊ½áÊø£¬·¢Ë͸øºó¶Ë¡£ºó¶ËÔÚ½ÓÊÕµ½Á˱¨ÎÄÖеÄCLºó£¬Ã÷È·±¨ÎÄʵÌ峤¶ÈΪ3£¬Ò²¾ÍÊǵ½ºìÉ«ÄÚÈÝ´¦½øÐÐÏìÓ¦£¬ÒÅÁôÏÂÀ´µÄA
0
½«±»ÁôÔÚ»º³åÇøÖУ¬ÓëÏÂÒ»¸öÇëÇóÆ´½Ó£¬´Ó¶øÔì³ÉÒì³£¡£
4. Transfer-Encoding + Transfer-EncodingÇé¿ö£º
µ±Ò»¸öÊý¾Ý°üÖдæÔÚÁ½¸öTransfer-Encoding±¨ÎÄͷʱ²¢²»»áÒýÆðÈκδíÎó£¬ÒòΪRFCÖй涨ÁË¿ÉÒÔÔÊÐíÕâÖÖÇé¿öµÄ·¢Éú£¬µ«ÕâÑù¾ÍûÓÐʲôÒâÒåÁË£¬ËùÒÔÒ»°ãÇé¿ö¹¥»÷Õß»áÀûÓõڶþ¸öTEÍ·»ìÏý·Ö¿é±àÂëµÄÖ÷Ì壬ÈÃÒþ²ØÔÚÊÇʵÌåÖ®ÖеÄCLÖ´ÐУ¬¼ÙÉèǰ¶Ë½ÓÊÕµÚÒ»¸öTEÖµ¡¢ºó¶Ë½ÓÊܵڶþ¸öTEÖµ£¬¹¥»÷Õß¿ÉÄܹ¹ÔìÈçÏ´úÂ룺
POST/ HTTP/1.1
Host£ºexample.com
Transfer-Encoding£ºchunked
Transfer-Encoding£ºxxx
5c
GPOST / HTTP/1.1
Content-Type£ºapplication/x-www-form-urlencoded
Content-Length:15
A=1
0
ǰ¶ËÔÚ½ÓÊÕµ½µÚÒ»¸öTEʱ£¬Ã÷ȷʵÌå²ÉÓ÷ֿé±àÂ룬²¢Ê¶±ðµ½×îÄ©¶ËÊý¾Ý0±íʾʵÌå½áÊø£¬½«Õû¸öÊý¾Ý°ü´«Ë͸øºó¶Ë£¬ºó¶Ë½âÎöµÚ¶þ¸öTE£¬·¢ÏÖ¸ñʽ´íÎó£¬ÕâʱºòĬÈÏÖ´ÐÐCL±¨ÎÄÍ·£¬ËùÒÔÕâ¸öÊý¾Ý°ü¾Í±»²ð·Ö³ÉÁËÁ½¸öÊý¾Ý°ü±»ºó¶ËÖ´Ðв¢ÏìÓ¦ÁË¡£
©¶´¼ì²â·½·¨
1. ¸ù¾ÝÑÓʱ²éÕÒCL+TE»òTE+CL©¶´£º
¿ÉÒÔ·¢ËÍÈçÏÂÇëÇó£º
POST / HTTP/1.1
Host£ºexample.com
Transfer-Encoding£ºchunked
Content-Length£º4
1
A
X
ÀàËÆµÄÕâÖÖÇëÇó£¬Í¨³£¶¼»áµ¼ÖÂʱ¼äÑÓ³Ù£¬ÒòΪÒÅÁôÔÚ»º´æÇøµÄÄÚÈÝÐèÒªÏÂÒ»¸öÊý¾Ý°üµ½´ï²ÅÄܽáÊøÏìÓ¦£¬Òò´Ë»áÓÐÃ÷ÏÔµÄÑÓ³ÙЧӦ¡£Í¬ÀíÕë¶ÔTE+CL©¶´£¬Ö»ÒªÉÔ΢ÐÞ¸ÄһϲâÊÔÊý¾Ý°ü¼´¿É¡£
2. ¾Ý²îÒìÏìӦȷÈÏHTTPÇëÇó×ß˽©¶´£º
¿ÉÒÔ·¢ËÍÈçÏÂÊý¾Ý°ü£º
POST/search HTTP/1.1
Host: vulnerable-website.com
Content-Length:50
Transfer-Encoding:chunked
e
q=smuggling&x=
0
GET /404HTTP/1.1
Foo: x
ǰ¶Ë·þÎñÆ÷¸ù¾ÝCLµÄ½âÎö£¬½«È«²¿ÄÚÈݶ¼·¢Ë͸øºó¶Ë£¬¶øºó¶Ë¸ù¾ÝTEµÄ´æÔÚ£¬½«Æä·Ö³ÉÁËÁ½¸öÊý¾Ý°ü£º
POST/search HTTP/1.1
Host:vulnerable-website.com
Content-Length:50
Transfer-Encoding:chunked
e
q=smuggling&x=
0
ºÍ
GET /404HTTP/1.1
Foo: x
¿É¼û×îºóÁ½Ðб»±£ÁôÔÚ»º³åÇøÖУ¬Ò»µ©ËûÃÇÓëÏÂÒ»¸öÊý¾Ý°üµÄÐÅϢƴ½ÓÔÚÁËÒ»Æð£¬½«»áµ¼ÖÂÊý¾Ý°ü¸ñʽ´íÎ󣬷µ»Ø404Ò³Ãæ£¬Ö¤Ã÷ȷʵ´æÔÚCL+TE©¶´¡£
·ÀÓùÐÞ¸´·½°¸
ÔÚǰ¶Ë·þÎñÆ÷ͨ¹ýÍ¬Ò»ÍøÂçÁ¬½Ó½«¶à¸öÇëÇóת·¢µ½ºó¶Ë·þÎñÆ÷µÄÇé¿öÏ£¬»á³öÏÖHTTPÇëÇó×ß˽©¶´£¬²¢ÇÒºó¶ËÁ¬½ÓËùʹÓõÄÐÒéÓпÉÄÜ»áÔì³É±ß½ç²»Í³Ò»µÄ·çÏÕ¡£·ÀÖ¹HTTPÇëÇó×ß˽©¶´µÄһЩͨÓ÷½·¨ÈçÏ£º
? ½ûÓúó¶ËÁ¬½ÓµÄÖØÓã¬ÒÔ±ãÿ¸öºó¶ËÇëÇóͨ¹ýµ¥¶ÀµÄÍøÂçÁ¬½Ó·¢ËÍ¡£
? ʹÓÃHTTP / 2½øÐкó¶ËÁ¬½Ó£¬ÒòΪ´ËÐÒé¿É·ÀÖ¹¶ÔÇëÇóÖ®¼äµÄ±ß½ç²úÉúÆçÒå¡£
? ǰ¶Ë·þÎñÆ÷ºÍºó¶Ë·þÎñÆ÷ʹÓÃÍêÈ«ÏàͬµÄWeb·þÎñÆ÷Èí¼þ£¬ÒÔ±ãËüÃǾÍÇëÇóÖ®¼äµÄ½çÏÞ´ï³ÉÒ»Ö¡£