πŸ”HTTP request smuggling

HTTP request smuggling = HRS

What is HTTP request smuggling?

Theo Δ‘α»‹nh nghΔ©a ở portswigger thΓ¬ HTTP request smuggling lΓ  kα»Ή thuαΊ­t can thiệp vΓ o cΓ‘ch trang web xα»­ lΓ½ trΓ¬nh tα»± cα»§a HTTP request mΓ  được nhαΊ­n tα»« mα»™t hoαΊ·c nhiều người dΓΉng. NΓ³i dα»… hiểu hΖ‘n lΓ  HTTP request smuggling (HRS) lΓ  mα»™t kα»Ή thuαΊ­t tαΊ₯n cΓ΄ng nhαΊ±m vΓ o cΓ‘c HTTP server (web server, proxy server). BαΊ₯t cα»© khi nΓ o mα»™t HTTP request cα»§a client được phΓ’n tΓ­ch bởi nhiều hΖ‘n mα»™t hệ thα»‘ng thΓ¬ đều cΓ³ khαΊ£ nΔƒng bα»‹ HRS.

Lα»— hα»•ng nΓ y thΓ¬ thường rαΊ₯t nguy hiểm, nΓ³ cho phΓ©p kαΊ» tαΊ₯n cΓ΄ng cΓ³ thể bypass secuirty controls, Δ‘αΊ‘t được nhΖ° truy cαΊ­p trΓ‘i phΓ©p tα»›i cΓ‘c data nhαΊ‘y cαΊ£m hoαΊ·c can thiệp trα»±c tiαΊΏp tα»›i α»©ng dα»₯ng người dΓΉng khΓ‘c.

What happens in an HTTP request smuggling attack?

NgΓ y nay cΓ‘c trang web thường dΓΉng cΓ‘c chuα»—i mΓ‘y chα»§ HTTP giα»―a người dΓΉng vΓ  α»©ng dα»₯ng logic cuα»‘i cΓΉng. Người dΓΉng gα»­i request tα»›i mα»™t mΓ‘y chα»§ front-end (Δ‘Γ΄i khi cΓ³ thể gọi lΓ  load balancer hoαΊ·c reverse proxy) vΓ  server nΓ y sαΊ½ gα»­i request tα»›i mα»™t hoαΊ·c nhiều sever back-end.

NhΖ° trΓͺn hΓ¬nh αΊ£nh thΓ¬ kαΊ» tαΊ₯n cΓ΄ng sαΊ½ gα»­i mα»™t request phα»₯ chΓ¨n thΓͺm vΓ o request chΓ­nh, khai thΓ‘c tα»« việc xα»­ lΓ½ bαΊ₯t Δ‘α»“ng bα»™ cα»§a server thΓ¬ dαΊ«n tα»›i lα»— hα»•ng HRS nhΖ° trΓͺn.

How do HTTP request smuggling vulnerabilities arise?

HαΊ§u hαΊΏt lα»— hα»•ng HRS xαΊ£y ra do HTTP specification cung cαΊ₯p hai cΓ‘ch để chỉ Δ‘α»‹nh nΖ‘i mα»™t request kαΊΏt thΓΊc, nΓ³ rΓ΅ ra lΓ  trong gΓ³i tin HTTP cΓ³ hai header: Content-Length vΓ  Transfer-Encoding

  1. Content-Length:

  • Content-Length lΓ  mα»™t header HTTP được sα»­ dα»₯ng để chỉ Δ‘α»‹nh kΓ­ch thΖ°α»›c (Δ‘Ζ‘n vα»‹ byte) cα»§a nα»™i dung yΓͺu cαΊ§u hoαΊ·c phαΊ£n hα»“i.

  • NΓ³ được sα»­ dα»₯ng trong cΓ‘c yΓͺu cαΊ§u HTTP cΓ³ phΖ°Ζ‘ng thα»©c POST, PUT, PATCH để xΓ‘c Δ‘α»‹nh kΓ­ch thΖ°α»›c cα»§a dα»― liệu gα»­i Δ‘i.

  • VΓ­ dα»₯: Content-Length: 11. Header nΓ y cho biαΊΏt rαΊ±ng nα»™i dung yΓͺu cαΊ§u 11 byte.

  1. Transfer-Encoding:

  • Transfer-Encoding lΓ  mα»™t header HTTP dΓΉng để chỉ Δ‘α»‹nh cΓ‘ch mΓ£ hΓ³a vΓ  truyền tαΊ£i nα»™i dung yΓͺu cαΊ§u hoαΊ·c phαΊ£n hα»“i qua mαΊ‘ng.

  • NΓ³ được sα»­ dα»₯ng để hα»— trợ truyền tαΊ£i nα»™i dung dΖ°α»›i nhiều dαΊ‘ng mΓ£ hΓ³a khΓ‘c nhau nhΖ° chunked, gzip, deflate, vv.

  • VΓ­ dα»₯: Transfer-Encoding: chunked. Header nΓ y cho biαΊΏt rαΊ±ng nα»™i dung yΓͺu cαΊ§u hoαΊ·c phαΊ£n hα»“i được truyền tαΊ£i dΖ°α»›i dαΊ‘ng cΓ‘c phαΊ§n (chunks) vα»›i Δ‘α»™ dΓ i được chỉ Δ‘α»‹nh cho mα»—i phαΊ§n.

How to perform an HRS attack

TαΊ₯n cΓ΄ng HTTP Request Smuggling nΓ³i chung đều xoay quanh Δ‘αΊΏn hai header lΓ  Content-Length vΓ  Transfer-Encoding trΓͺn cΓΉng mα»™t gΓ³i tin HTTP để mΓ‘y chα»§ front-end vΓ  back-end xα»­ lΓ½ yΓͺu cαΊ§u theo cΓ‘ch khΓ‘c nhau. Sau Δ‘Γ’y lΓ  mα»™t sα»‘ β€œcombo” thường gαΊ·p cα»§a HTTP Request Smuggling:

  • CL.TE: mΓ‘y chα»§ front-end sα»­ dα»₯ng header Content-Length vΓ  mΓ‘y chα»§ back-end sα»­ dα»₯ng header Transfer-Encoding.

  • TE.CL: mΓ‘y chα»§ front-end sα»­ dα»₯ng header Transfer-Encoding vΓ  mΓ‘y chα»§ back-end sα»­ dα»₯ng header Content-Length.

  • TE.TE: mΓ‘y chα»§ front-end vΓ  back-end đều hα»— trợ header Transfer-Encoding, nhΖ°ng mα»™t trong hai loαΊ‘i mΓ‘y chα»§ khΓ΄ng xα»­ Γ½ được header nΓ y, do gΓ³i tin HTTP Δ‘Γ£ bα»‹ lΓ m xΓ‘o trα»™n header theo mα»™t cΓ‘ch nΓ o Δ‘Γ³.

This lab involves a front-end and back-end server, and the front-end server doesn't support chunked encoding. The front-end server rejects requests that aren't using the GET or POST method.

To solve the lab, smuggle a request to the back-end server, so that the next request processed by the back-end server appears to use the method GPOST.

Ở bΓ i nΓ y chΓΊng ta tαΊ₯n cΓ΄ng dαΊ‘ng CL.TE thΓ¬ payload sαΊ½ kiểu nhΖ° nΓ y:

Đầu tiΓͺn chΓΊng ta chuyển HTTP/2 -> HTTP/1.1

ChΓΊng ta sαΊ½ sα»­a Δ‘α»•i Δ‘α»™ dΓ i cα»§a Content vα»›i giΓ‘ trα»‹ lΓ  6 bαΊ―t Δ‘αΊ§u tα»« giΓ‘ trα»‹ 0 tα»›i G.

Ở Δ‘Γ’y dα»… hiểu rαΊ±ng khi gα»­i request Δ‘αΊ§u tiΓͺn thΓ¬ server sαΊ½ hiểu rαΊ±ng body gα»“m 6 byte vΓ  xα»­ lΓ½ nhΖ°ng khi xα»­ lΓ½ tα»›i 0 thΓ¬ Δ‘Γ’y lΓ : mα»™t chunk rα»—ng, được sα»­ dα»₯ng để Δ‘Γ‘nh dαΊ₯u kαΊΏt thΓΊc cα»§a body request.

Khi Δ‘Γ³ kΓ½ tα»± G sαΊ½ được ghΓ©p vα»›i request tiαΊΏp theo lΓ  G->GPOST. ChΓΊng ta sαΊ½ sang lab tiαΊΏp theo để lΓ m mα»™t dαΊ‘ng khΓ‘c!

Ở lab thΓ¬ phΓ­a server front-end sα»­ dα»₯ng Transfer-Encoding header vΓ  server back-end sα»­ dα»₯ng Content-Lenght header. Khi Δ‘Γ³ chΓΊng ta cΓ³ thể Δ‘oαΊ‘n HTTP Request Smuggling nhΖ° sau:

Chunked Transfer Encoding lΓ  mα»™t cΖ‘ chαΊΏ được sα»­ dα»₯ng trong giao thα»©c HTTP/1.1 để gα»­i dα»― liệu tα»« mΓ‘y chα»§ Δ‘αΊΏn client. CΖ‘ chαΊΏ nΓ y cho phΓ©p mΓ‘y chα»§ gα»­i dα»― liệu trong nhiều phαΊ§n hoαΊ·c "chunks", mα»—i chunk được gα»­i riΓͺng lαΊ». Điều nΓ y cΓ³ thể hα»―u Γ­ch trong cΓ‘c tΓ¬nh huα»‘ng mΓ  kΓ­ch thΖ°α»›c cα»§a dα»― liệu khΓ΄ng được biαΊΏt trΖ°α»›c hoαΊ·c dα»― liệu cαΊ§n được tαΊ‘o vΓ  gα»­i Δ‘α»“ng thời.

Mα»—i chunk bao gα»“m kΓ­ch thΖ°α»›c cα»§a chunk (tΓ­nh bαΊ±ng sα»‘ byte), sau Δ‘Γ³ lΓ  dα»― liệu thα»±c sα»±, vΓ  cuα»‘i cΓΉng lΓ  mα»™t dΓ²ng mα»›i. PhiΓͺn truyền dα»― liệu kαΊΏt thΓΊc bαΊ±ng mα»™t chunk cΓ³ kΓ­ch thΖ°α»›c bαΊ±ng 0.

MΓ£ hΓ³a chunked được chỉ Δ‘α»‹nh trong header HTTP bαΊ±ng cΓ‘ch sα»­ dα»₯ng trường Transfer-Encoding:

VΓ­ dα»₯:

GiαΊ£ sα»­ mΓ‘y chα»§ muα»‘n gα»­i chuα»—i sau: "Hello, World!"

TrΖ°α»›c tiΓͺn, chuα»—i nΓ y được chia thΓ nh cΓ‘c chunks. Trong vΓ­ dα»₯ nΓ y, chΓΊng tΓ΄i sαΊ½ chia nΓ³ thΓ nh 2 chunks: "Hello, " vΓ  "World!". Mα»—i chunk sau Δ‘Γ³ được gα»­i Δ‘i kΓ¨m vα»›i kΓ­ch thΖ°α»›c cα»§a nΓ³ (tΓ­nh bαΊ±ng sα»‘ byte hexa).

GΓ³i tin HTTP cΓ³ thể trΓ΄ng nhΖ° sau:

Ở Δ‘Γ’y, 7 vΓ  6 lΓ  kΓ­ch thΖ°α»›c cα»§a hai chunks (tΓ­nh bαΊ±ng sα»‘ byte), vΓ  0 kαΊΏt thΓΊc phiΓͺn truyền dα»― liệu. \r\n lΓ  kΓ½ tα»± xuα»‘ng dΓ²ng CR-LF (Carriage Return-Line Feed).

LΖ°u Γ½: /r/n ở cuα»‘i cΓΉng Δ‘Γ‘nh dαΊ₯u kαΊΏt thΓΊc request.

SΖ‘ qua nhΖ° thαΊΏ rα»“i chΓΊng ta sαΊ½ vΓ o bΓ i lab luΓ΄n cΓ³ description nhΖ° sau:

Content-length: 4, nghΔ©a lΓ  cΓ³ 4 kΓ­ tα»± 59\r\n β†’ PhαΊ§n cΓ²n lαΊ‘i sαΊ½ được gΓ‘n vΓ o Δ‘αΊ§u request sau.

Sau Δ‘Γ³, yΓͺu cαΊ§u chα»©a dα»― liệu gα»­i Δ‘i. Dα»― liệu nΓ y được chia thΓ nh hai phαΊ§n:

  1. PhαΊ§n dα»― liệu khα»‘i Δ‘αΊ§u tiΓͺn:

    • 59: ĐÒy lΓ  Δ‘α»™ dΓ i cα»§a dα»― liệu khα»‘i Δ‘αΊ§u tiΓͺn (59 byte).

    • GPOST / HTTP/1.1: ĐÒy lΓ  nα»™i dung cα»§a dα»― liệu khα»‘i Δ‘αΊ§u tiΓͺn. Trong trường hợp nΓ y, dα»― liệu lΓ  "GPOST / HTTP/1.1".

  2. PhαΊ§n dα»― liệu khα»‘i thα»© hai:

    • Content-Type: application/x-www-form-urlencoded

      • Content-Type header xΓ‘c Δ‘α»‹nh kiểu dα»― liệu cα»§a dα»― liệu được gα»­i Δ‘i. Trong trường hợp nΓ y, dα»― liệu được gα»­i dΖ°α»›i dαΊ‘ng "application/x-www-form-urlencoded", cΓ³ nghΔ©a lΓ  dα»― liệu được mΓ£ hΓ³a theo Δ‘α»‹nh dαΊ‘ng URL-encoded.

    • Content-Length: 9

      • Content-Length header xΓ‘c Δ‘α»‹nh Δ‘α»™ dΓ i cα»§a dα»― liệu khα»‘i thα»© hai (9 byte).

    • x: ĐÒy lΓ  nα»™i dung cα»§a dα»― liệu khα»‘i thα»© hai. Trong trường hợp nΓ y, dα»― liệu lΓ  "x".

Sau phαΊ§n dα»― liệu khα»‘i thα»© hai, yΓͺu cαΊ§u kαΊΏt thΓΊc bαΊ±ng sα»‘ 0, chỉ Δ‘α»‹nh kαΊΏt thΓΊc dα»― liệu mΓ£ hΓ³a chunked.

Ở Δ‘Γ’y server front-end vΓ  back-end đều hα»— trợ Transfer-Encoding header, nhΖ°ng mα»™t trong nhα»―ng servers cΓ³ thể được yΓͺu cαΊ§u khΓ΄ng xα»­ lΓ½ nΓ³ bαΊ±ng cΓ‘ch lΓ m xΓ‘o trα»™n header nΓ y

VΓ­ dα»₯, mα»™t mΓ‘y chα»§ web cΓ³ thể thα»±c hiện "obfuscating the TE header" bαΊ±ng cΓ‘ch thay Δ‘α»•i TE header thΓ nh mα»™t giΓ‘ trα»‹ ngαΊ«u nhiΓͺn hoαΊ·c mΓ£ hΓ³a TE header bαΊ±ng cΓ‘ch sα»­ dα»₯ng mα»™t thuαΊ­t toΓ‘n mΓ£ hΓ³a Δ‘αΊ·c biệt. Điều nΓ y cΓ³ thể lΓ m cho TE header trở nΓͺn khΓ³ hiểu hoαΊ·c che giαΊ₯u thΓ΄ng tin về cΓ‘c phΖ°Ζ‘ng phΓ‘p mΓ£ hΓ³a thα»±c sα»± được hα»— trợ bởi mΓ‘y chα»§ web.

ChΓΊng ta sαΊ½ Δ‘i vΓ o bΓ i lab nΓ y luΓ΄n, miΓͺu tαΊ£ cα»§a lab nΓ y nhΖ° sau:

ChΓΊng ta sαΊ½ xem xΓ©t rαΊ±ng Transfer-Encoding vαΊ«n nhαΊ­n nhΖ°ng sau 2-3 lαΊ§n request thΓ¬ header nΓ y khΓ΄ng được phΓ­a back-end xα»­ lΓ½. XΓΊc nΓ y chΓΊng ta sαΊ½ thΓͺm mα»™t header tΖ°Ζ‘ng tα»± nhΖ° nΓ y vα»›i mα»™t giΓ‘ trα»‹ bαΊ₯t kα»³.

ChΓΊng ta sαΊ½ giαΊ£i thΓ­ch qua tαΊ‘i sao phαΊ£i double Transfer-Encoding header. Đầu tiΓͺn nαΊΏu thay Δ‘α»•i vα»‹ trΓ­ giΓ‘ trα»‹ cα»§a header nΓ y thΓ¬ nΓ³ sαΊ½ trαΊ£ về lα»—i 500. CΓ³ nghΔ©a lΓ  phΓ­a front-end hoαΊ·c phΓ­a back-end khΓ΄ng xα»­ lΓ½ được vΓ  quan trọng khΓ΄ng sα»­ dα»₯ng được Content-Length

Khi Δ‘Γ³ cαΊ§n sαΊ―p xαΊΏp lαΊ‘i giΓ‘ trα»‹ vΓ  để backend khi xα»­ lΓ½ TE sαΊ½ khΓ΄ng xΓ‘c Δ‘α»‹nh được vΓ  chuyển qua dΓΉng CL chung nhΖ° hΓ¬nh trΓͺn.

Khi Δ‘Γ³ mα»™t request khΓ‘c tα»« người dΓΉng khΓ‘c sαΊ½ được gΓ‘n vα»›i kΓ½ tα»± hoαΊ·c request tiαΊΏp theo cα»§a kαΊ» tαΊ₯n cΓ΄ng.

VαΊ­y thΓ¬ chΓΊng ta sαΊ½ dΓΉng kα»Ή thuαΊ­t Lab2 để solve lab nΓ y.

Finding HTTP request smuggling valnerabilities.

Sau 3 lab chα»©ng ta sαΊ½ xem xΓ©t lαΊ‘i cΓ‘ch để tΓ¬m lα»— hα»•ng nΓ y:

TΓ¬m lα»— hα»•ng dαΊ‘ng CL.TE sα»­ dα»₯ng kα»Ή thuαΊ­t timming.

NαΊΏu mα»™t α»©ng dα»₯ng chα»©a lα»— hα»•ng cΓ³ variant CL.TE, thΓ¬ chΓΊng ta gα»­i request nhΖ° sau:

Khi front-end server sα»­ dα»₯ng Content-Length header, nΓ³ sαΊ½ chỉ chuyển tiαΊΏp mα»™t phαΊ§n cα»§a request nΓ y mΓ  bỏ qua X. Back-end sαΊ½ sα»­ dα»₯ng Transfer-Encoding header.

NhΓ¬n vΓ o hΓ¬nh αΊ£nh chΓΊng ta sαΊ½ rΓ΅ khi gα»§i giΓ‘ trα»‹ thΓ¬ ở FE dΓΉng CL vα»›i length lΓ  6 khi Δ‘Γ³ nΓ³ sαΊ½ drop X Δ‘i vΓ  gα»­i qua backend vΓ  khi BE nhαΊ­n thΓ¬ nΓ³ giα»― time để nhαΊ­n X cΓ²n thiαΊΏu vΓ  đợi lΓΊc tα»›i timeout trαΊ£ về.

Tìm lỗ hổng dẑng TE.CL

NαΊΏu lα»— hα»•ng HRS cΓ³ variant TE.CL thΓ¬ cΓ³ thể gα»­i request theo nhΖ° nΓ y:

Ở dαΊ‘ng nΓ y thΓ¬ front-end sα»­ dα»₯ng Content-Length cΓ²n back-end sαΊ½ sα»­ dα»₯ng Content-Length

Khi FE cΓ³ TE xα»­ lΓ½ chunk Δ‘αΊ§u size bαΊ±ng 0 sau Δ‘Γ³ lΓ  mα»™t dΓ²ng trα»‘ng, cΓ³ nghΔ©a nΓ³ hiểu kαΊΏt thΓΊc vΓ  bỏ qua X gα»­i qua BE vΓ  ở BE dΓΉng CL vα»›i length chung lΓ  6 mΓ  dα»― liệu tα»›i BE chỉ cΓ³ 5 byte vΓ  BE sαΊ½ đợi byte thα»© 6, sau mα»™t thời gian nΓ³ quyαΊΏt Δ‘α»‹nh timeout.

Mình đã giải thích qua cÑc thức và cƑ chế của hai variant CL.TE và TE.CL, tiếp theo chúng ta sẽ tới với lab tiếp theo.

Về lab nΓ y thΓ¬ chΓΊng xΓ‘c Δ‘α»‹nh rαΊ±ng nΓ³ lΓ  variant CL.TE thΓ¬ chΓΊng ta sαΊ½ gα»­i payload nhΖ° sau:

MΓ¬nh giαΊ£i thΓ­ch lαΊ‘i về gΓ³i tin HTTP trΓͺn thΓ¬ CL gα»“m 49 byte tα»« giΓ‘ trα»‹ e->x vΓ  ở BE dΓΉng TE thΓ¬ cΓ³ 2 chunk, chunk Δ‘αΊ§u cΓ³ size lΓ  e(14 trong hệ 10) cΓ³ giΓ‘ trα»‹ q=smuggling&x=, chunk thα»© 2 cΓ³ size 0 vΓ  khi nΓ³ check dΓ²ng tiαΊΏp thΓ¬ trα»‘ng thỏa mΓ£n chunk size 0. LΓΊc nΓ y request sαΊ½ kαΊΏt thΓΊc vΓ  trαΊ£ về resp vΓ  Δ‘oαΊ‘n thα»«a sau sαΊ½ được ghΓ©p vΓ o Δ‘αΊ§u request tiαΊΏp theo.

Vα»›i bΓ i lab nΓ y dΓΉng burp suite bαΊ―t req sαΊ½ nhΖ° nΓ y:

Vα»›i lab nΓ y sα»­ dα»₯ng TE.CL khi Δ‘Γ³ payload sαΊ½ nhΖ° sau:

GiΓ³i tin HTTP ở trΓͺn sαΊ½ cΓ³ TE được dΓΉng ở FE khi Δ‘Γ³ cΓ³ chunk Δ‘αΊ§u gα»“m 5b (91 hệ 10) vΓ  chunk thα»© 2 cΓ³ size vΓ  0 vΓ  giΓ‘ trα»‹ trα»‘ng. ThΓ¬ khi tα»›i BE thΓ¬ BE sα»­ dα»₯ng CL cΓ³ giΓ‘ trα»‹ lΓ  4 nΓͺn nΓ³ sαΊ½ chỉ xα»­ lΓ½ 5b/r/n vΓ  để phαΊ§n cΓ²n lαΊ‘i ghΓ©p cho request sau. CΓ²n giαΊ£i thΓ­ch chi tiαΊΏt thΓ¬ cΓ³ thể xem lαΊ‘i cΓ‘c lab trΓͺn về dαΊ‘ng nΓ y.

Đôi khi chΓΊng ta cαΊ§n nhα»―ng thα»© to lα»›n hΖ‘n nhΖ° lαΊ₯y thΓ΄ng tin tα»« mα»™t endpoint nΓ o Δ‘Γ³ hoαΊ·c lαΊ₯y thΓ΄ng tin nhαΊ‘y cαΊ£m nhΖ°ng để lαΊ₯y được thΓ¬ chΓΊng ta cαΊ§n phαΊ£i bypass được access controls, khi Δ‘Γ³ chΓΊng ta cΓ³ thể sα»­ dα»₯ng lα»— hα»•ng nΓ y để chuyển tiαΊΏp cΓ‘c router chΓΊng ta muα»‘n. Oke bαΊ―t Δ‘αΊ§u vα»›i lab nΓ y thΓ΄i.

Để solve được lab nΓ y chΓΊng ta cαΊ§n truy cαΊ­p vΓ o endpoint admin để xΓ³a Δ‘i tΓ i khoαΊ£n carlos nhΖ°ng FE Δ‘Γ£ block truy cαΊ­p cα»§a chΓΊng ta nΓͺn cαΊ§n bypass nΓ³.

RΓ΅ rΓ ng Δ‘Γ£ bα»‹ block, dα»±a vΓ o dαΊ‘ng CL.TE vΓ  xem giao diện chΓΊng ta sαΊ½ build được body gΓ³i tin nhΖ° sau:

CΓ³ vαΊ₯n đề ở Δ‘Γ’y lΓ  khΓ΄ng được duplicate header, tαΊ‘i sao lαΊ‘i xαΊ£y ra vΓ¬ khi Δ‘oαΊ‘n GET được ghΓ©p vα»›i header tiαΊΏp theo cα»§a req nΓͺn sαΊ½ kiểu nhΖ° nΓ y:

RΓ΅ rΓ ng dΓ²ng 12 vΓ  13 Δ‘Γ£ lαΊ·p lαΊ‘i nΓͺn server trαΊ£ về status 400, vαΊ­y lΓΊc nΓ y cΓ³ cΓ‘ch nΓ o khΓ΄ng?

CΓ’u trαΊ£ lời lΓ  cΓ³, chΓΊng ta cΓ³ thể tΓ‘ch nΓ³ ra để thΓ nh phαΊ§n header cα»§a request sau thuα»™c body nhΖ° sau:

Chỉ cαΊ§n thΓͺm mα»™t giΓ‘ trα»‹ x vΓ o vΓ  phαΊ§n Content-Length mọi người tα»± fix nhΓ©. Khi Δ‘Γ³ resp sαΊ½ trαΊ£ về cho chΓΊng ta nhΖ° nΓ y:

LΓΊc nΓ y chΓΊng ta cΓ³ thể solve được dα»±a vΓ o source tα»« resp:

Ở lab nΓ y theo dαΊ‘ng TE.CL, chΓΊng ta dα»±a vΓ o lab sα»‘ 6 sαΊ½ build lαΊ‘i theo dαΊ‘ng TE.CL nhΖ° sau:

ChΓΊng ta thαΊ₯y rαΊ±ng nhΖ° tiΓͺu đề cα»§a lab thΓ¬ cαΊ§n reveal request cα»§a server. NhΖ° lab nΓ y chΓΊng ta trΖ°α»›c tiΓͺn cαΊ§n xΓ‘c Δ‘α»‹nh Δ‘Γ’y lΓ  dαΊ‘ng gΓ¬? Sα»­ dα»₯ng kα»Ή thuαΊ­t timming để check vΓ  nhαΊ­n ra nΓ³ dαΊ‘ng CL.TE

TiαΊΏp theo xΓ‘c Δ‘α»‹nh trang web cΓ³ chαΊ·n endpoint /admin gα»“m cαΊ§n cΓ³ Δ‘iều kiện gΓ¬?

Để truy cαΊ­p được path nΓ y cαΊ§n request tα»« IP 127.0.0.1, vαΊ­y chΓΊng ta sαΊ½ thΓͺm mα»™t header X-Forwarded-For

CΓ³ vαΊ» header trΓͺn khΓ΄ng cΓ³ trong config cα»§a server nΓͺn mα»›i khΓ΄ng thể fake được ip, chΓΊng ta chΓΊ Γ½ rαΊ±ng trang web nΓ y cΓ³ mα»™t nΖ‘i cΓ³ thể reflect được data lΓ  endpoint /search.

ChΓΊng ta sαΊ½ tαΊ₯n cΓ΄ng vΓ o path nΓ y để leak được header cαΊ§n thiαΊΏt ra, thα»±c hiện nhΖ° sau:

ChΓΊng ta thαΊ₯y rαΊ±ng khi request tiαΊΏp theo thΓ¬ header kia được leak ra vΓ  chΓΊng ta sαΊ½ tαΊ₯n cΓ΄ng nhΖ° lab 6, chỉ thay header nhΖ° trΓͺn để bypass.

NgoΓ i ra chΓΊng ta cΕ©ng cΓ³ thể sα»­ dα»₯ng mα»™t vΓ i header khΓ‘c để bypass access control nhΖ°:

VΓ¬ cΓ‘c tiΓͺu đề nΓ y được cho lΓ  hoΓ n toΓ n αΊ©n Δ‘α»‘i vα»›i người dΓΉng nΓͺn chΓΊng thường được cΓ‘c mΓ‘y chα»§ phα»₯ trợ hoΓ n toΓ n tin cαΊ­y. GiαΊ£ sα»­ bαΊ‘n cΓ³ thể gα»­i kαΊΏt hợp Δ‘ΓΊng tiΓͺu đề vΓ  giΓ‘ trα»‹, Δ‘iều nΓ y cΓ³ thể cho phΓ©p bαΊ‘n bỏ qua kiểm soΓ‘t truy cαΊ­p.

X-SSL-CLIENT-CN: administrator

NhΖ° tiΓͺu đề cα»§a lab chΓΊng ta biαΊΏt rαΊ±ng ở lab nΓ y chΓΊng ta cαΊ§n lαΊ₯y thΓ΄ng tin cα»§a người khΓ‘c tα»« request vΓ­ dα»₯ nhΖ° cookie, tooken, ......

Sau mα»™t lΓΊc xem xΓ©t thΓ¬ cΓ³ vαΊ» nhΖ° lab nΓ y giα»‘ng lab 7 cΓ³ mα»™t nΖ‘i để leak được data lΓ  ở comment.

XΓ‘c Δ‘α»‹nh được bΓ i nΓ y dαΊ‘ng CL.TE, khi nΓ y chΓΊng ta cαΊ§n exploit ở path comment để cΓ³ thể leak được data cα»§a request người dΓΉng khΓ‘c.

Ở Δ‘Γ’y mΓ¬nh cΓ³ Δ‘oαΊ‘n gΓ³i tin nhΖ° ở dΖ°α»›i chỉ cΓ³ Δ‘iều comment để cuα»‘i vΓ¬ nΓ³ sαΊ½ nα»‘i vα»›i gΓ³i tin cα»§a request tiαΊΏp theo, Δ‘αΊ·c biệt phαΊ§n CL:920 để Δ‘α»™ dΓ i resp cΓ³ thể trαΊ£ về Δ‘α»§ session.

Sau khi gα»­i đợi mα»™t lΓΊc thΓ¬ request victim sαΊ½ tα»›i nhΖ° hΓ¬nh dΖ°α»›i.

Đầu tiΓͺn chΓΊng ta cαΊ§n xem lab nΓ y thuα»™c dαΊ‘ng nΓ o Δ‘Γ£ vΓ o xem data được reflect ở Δ‘Γ’u.

Oke chΓΊng ta xΓ‘c Δ‘α»‹nh rαΊ±ng hai dα»―a liệu ở Δ‘Γ’u cΓ³ thể thα»±c hiện khai thΓ‘c:

  • Ở form cΓ³ mα»™t trường αΊ©n lΓ  user-agent chΓΊng ta cΓ³ thể thay Δ‘α»•i được

  • NΓ³ thuα»™c dαΊ‘ng CL.TE

ĐÒy lΓ  payload cuα»‘i cΓΉng bypass qua thαΊ» input vΓ  nhΓΊng JS vΓ o code, tα»« Δ‘Γ’y chΓΊng ta build lαΊ‘i Δ‘oαΊ‘n HTTP chα»©a User-Agent. (CαΊ§n tΓ‘ch phαΊ§n header tiαΊΏp theo lΓ  body bαΊ±ng cΓ‘ch thΓͺm mα»™t giΓ‘ trα»‹ x=1)

Using HTTP request smuggling to turn an on-site redirect into an open redirect

Nhiều α»©ng dα»₯ng thα»₯c hiện chuyển hΖ°α»›ng tαΊ‘i chα»— tα»« mα»™t url tα»›i mα»™t url khΓ‘c vΓ  cα»₯ thể lΓ  ở header Host chuyển hΖ°α»›ng tα»›i URL khΓ‘c.

VΓ­ dα»₯:

NhΖ° Δ‘oαΊ‘n gΓ³i tin HTTP ở trΓͺn được xem nhΖ° vΓ΄ hαΊ‘i nhΖ°ng Δ‘iều gΓ¬ sαΊ½ xαΊ£y ra kαΊ» tαΊ₯n cΓ΄ng khai thΓ‘c lα»— hα»•ng HRS để lΓ m request tiαΊΏp theo chuyển hΖ°α»›ng tα»›i domain cα»§a kαΊ» tαΊ₯n cΓ΄ng.

VΓ­ dα»₯ sau dΓΉng dαΊ‘ng CL.TE

NαΊΏu cuα»™c tαΊ₯n cΓ΄ng nΓ y thΓ nh cΓ΄ng thΓ¬ request tiαΊΏp theo sαΊ½ nhΖ° sau:

TrΖ°α»›c hαΊΏt cαΊ§n hiểu sΖ‘ về HTTP/2 thΓ¬ cΓ‘c request tα»« http/2 khΓ΄ng cαΊ§n Δ‘α»‹nh nghΔ©a rΓ΅ rΓ ng CL, cΓ²n Δ‘α»‘i vα»›i server cΓ³ hαΊ‘ cαΊ₯p tα»« 2 xuα»‘ng 1 thΓ¬ nΓ³ sαΊ½ lαΊ₯y CL để Δ‘o Δ‘α»™ dΓ i nα»™i dung cαΊ§n gα»­i.

Khi ở Front-end (HTTP/2)

Back-end(HTTP/1)

SΖ‘ qua thαΊΏ thΓ΄i, bΓ’y giờ chΓΊng ta sαΊ½ Δ‘i vΓ o lab nΓ y, nhΖ° tiΓͺu đề thΓ¬ lab nΓ y sα»­ dα»₯ng http/2 vΓ  phΓ­a FE dΓΉng CL.

NhΖ° αΊ£nh thα»© 2 chΓΊng ta Δ‘Γ£ biαΊΏt rαΊ±ng nΓ³ dαΊ‘ng CL, bΓ’y giờ chΓΊng ta tΓ¬m được mα»™t path resources cΓ³ chα»©a cΓ‘c image vΓ  file js. Ở Δ‘Γ’y mΓ¬nh test qua path /resources để xem nhΖ° nΓ o.

PhαΊ§n Location header cα»§a res bα»‹ thay Δ‘α»•i, nαΊΏu chΓΊng ta dΓΉng lα»— hα»•ng HRS để chuyển hΖ°α»›ng tα»›i mα»™t domain khΓ‘c thΓ¬ sao nhỉ.

ChΓΊng ta thαΊ₯y rαΊ±ng tα»›i request thα»© 2 Location Δ‘Γ£ bα»‹ Δ‘α»•i, bΓ’y giờ chΓΊng ta sαΊ½ tαΊ‘o mα»™t server chα»©a mΓ£ Δ‘α»™c để solve lab nΓ y.

Sau Δ‘Γ³ thay host ở http request smuggling thΓ nh server chΓΊng ta vα»«a tαΊ‘o vΓ  gα»­i nΓ³ lαΊ‘i.

Ở lab nΓ y chΓΊng ta sαΊ½ khai thΓ‘c HRS thΓ΄ng qua CRLF injection. NαΊΏu cΓ‘c bαΊ‘n chΖ°a đọc CRLF injection thΓ¬ cΓ³ thể đọc ở Δ‘Γ’y.

Đối vα»›i lab nΓ y sαΊ½ cΓ³ hαΊ‘ cαΊ₯p xuα»‘ng trΖ°α»›c khi gα»­i tα»›i back-end.

Xem qua thΓ¬ bΓ i nΓ y khΓ΄ng phαΊ£i dαΊ‘ng H2.CL hay H2.TE, nhΖ° tiΓͺu đề cΓ³ sα»­ dα»₯ng CRLF thΓ¬ Δ‘α»‘i vα»›i HTTP/2 chΓΊng ta sαΊ½ thΓͺm mα»™t giΓ‘ trα»‹ ở phαΊ§n request header

NhΖ° ở lab 13 Δ‘Γ£ cho thαΊ₯y rαΊ±ng ở Front-end thΓ¬ http/2 cΓ³ dαΊ‘ng khΓ‘c vΓ  khi chΓΊng ta thΓͺm mα»™t trường header nΓ y dΓΉng CRLF vΓ o để khi hαΊ‘ cαΊ₯p thΓ¬ nΓ³ hiểu cΓ³ thΓͺm mα»™t trường TE: chunked vΓ  gα»­i tα»›i back-end.

YΓͺu cαΊ§u cα»§a lab lΓ  cαΊ§n lαΊ₯y giΓ‘ trα»‹ session cα»§a victim, lΓΊc nΓ y qua mα»™t lαΊ§n xem xΓ©t thΓ¬ cΓ³ chα»— search thΓ¬ reflect data được.

ChΓΊng ta sαΊ½ lợi dΓΉng parameter search nΓ y để reflect gΓ³i tin HTTP cα»§a victim ra, nhΖ° trΓͺn sau khi thΓͺm mα»™t header nhΖ° sau:

name: foo

value: bar\r\nTransfer-Encoding: chunked

LΖ°u Γ½: Chα»— \r\n cΓ³ thể viαΊΏt ở ngoΓ i rα»“i Δ‘Ζ°a vΓ o hoαΊ·c khi viαΊΏt liền chỉ cαΊ§n dΓΉng phΓ­m tαΊ―t Shift+Enter

BΓ’y giờ thΓͺm phαΊ§n body vΓ¬ sau khi hαΊ‘ cαΊ₯p gα»­i tα»›i Back-end thΓ¬ nΓ³ dΓΉng TE. LΓΊc nΓ y Δ‘oαΊ‘n body sαΊ½ nhΖ° sau (CαΊ§n cΓ³ cookie vΓ¬ nΓ³ phαΊ£i leak ở tΓ i khoαΊ£n chΓΊng ta)

Sau khi gα»­i đợi mα»™t lΓΊc thΓ¬ victim sαΊ½ gα»­i tα»›i, nhΖ° đề bΓ i thΓ¬ victim sαΊ½ 15s gα»­i mα»™t request.

NhΖ° tiΓͺu đề thΓ¬ lab nΓ y cΓ³ thể dΓΉng CRLF để gαΊ―n mα»™t request khΓ‘c vΓ o giΓ‘ trα»‹ cα»§a header nΓ o Δ‘Γ³ trong HTTP/2 nαΊΏu nhΖ° ở Back-End khΓ΄ng hα»— trợ Transfer-Encoding.

BΓ’y giờ hΓ£y tα»›i vα»›i lab, trΖ°α»›c tiΓͺn hΓ£y xem yΓͺu cαΊ§u cα»§a lab nΓ y.

YΓͺu cαΊ§u chΓΊng ta lαΊ₯y được cookie admin vΓ  try cαΊ­p để xΓ³a tΓ i khoαΊ£n carlos. Ý tưởng ở Δ‘Γ’y sαΊ½ vαΊ«n nhΖ° cΕ© nhΖ°ng cΓ‘ch thα»©c thα»±c hiện khΓ‘c so vα»›i lab trΓͺn.

Ở Δ‘Γ’y cΓ³ mα»™t path /admin khi chΓΊng ta truy cαΊ­p thΓ¬ nΓ³ lΓ  yΓͺu cαΊ§u phαΊ£i lΓ  admin, thΓ¬ nhΖ° tiΓͺu đề thΓ¬ chΓΊng ta sαΊ½ khai thΓ‘c lα»— hα»•ng nΓ y theo cΓ‘ch split header HTTP/2 thΓ΄ng qua CRLF vΓ¬ mα»™t phαΊ§n BE khΓ΄ng cΓ²n hα»— trợ TE, nhΖ° trΓͺn lab Δ‘Γ£ nΓ³i rαΊ±ng Admin sαΊ½ request 10s mα»™t lαΊ§n nΓͺn chỉ cαΊ§n tαΊ‘o mα»™t smuggling vΓ  chờ request cα»§a admin thΓ¬ chΓΊng ta cΓ³ thể lαΊ₯y được cookie cα»§a admin.

Đầu tiΓͺn chΓΊng ta sαΊ½ sα»­ dα»₯ng mα»™t path khΓ΄ng cΓ³ để dα»… thαΊ₯y status 302 khi admin truy cαΊ­p hΖ‘n.

Xem qua gΓ³i tin trΓͺn sαΊ½ chia thΓ nh 2 phαΊ§n request, sau khi hαΊ‘ cαΊ₯p thΓ¬ request Δ‘αΊ§u tiΓͺn sαΊ½ do chΓΊng ta request sαΊ½ trαΊ£ về notfound sau Δ‘Γ³ khi admin truy cαΊ­p thΓ¬ request cα»§a admin sαΊ½ thay thαΊΏ bαΊ±ng Δ‘oαΊ‘n http request smuggling cα»§a chΓΊng ta lα»“ng vΓ o vΓ  khi chΓΊng ta request thΓ¬ request cα»§a admin sαΊ½ được submit bởi chΓΊng ta vΓ  trαΊ£ về tΓ i khoαΊ£n admin.

NΓ³i dα»… hiểu hΖ‘n khi hαΊ‘ cαΊ₯p thΓ¬ request smuggling chΓΊng ta lα»“ng vΓ o name:foo thΓ¬ sαΊ½ được Δ‘Ζ°a vΓ o hΓ ng đợi để xα»­ lΓ½ sau khi cΓ³ request tiαΊΏp theo sαΊ½ được xα»­ lΓ½.

Last updated