Web hacking 的基礎文已經是蓋濟矣,咱佇遮的文會當做逐家已經攏有遐的基礎智識(HTTP、frontend、backend、injection etc.),若是講你是初學者,遮的文無定就較無適合你看,會當先去 splitline/How-to-Hack-Websites(華,繁)做伙補充一下智識!
逐年 Portswigger 攏有出 Top 10 web hacking techniques,聽起來毋但鑠奅閣誠重要,毋過咱敢逐个攏共伊看予齊透矣?閣毋但彼爾爾,逐冬攏有幾若个 conference 咧發表,逐禮拜攏有 CTF 選手咧舞新撇步,閣免講逐工獎金獵人攏有新的成果——欸,恁敢攏有咧綴?
我佇遮就是想欲來參逐家逐工來分享恁無定落勾去,抑是單純因為貧惰無去看的奇巧 Web 攻擊相關的新招、舊招——啊我家己嘛無一定每一个攏看過,嘛算是予家己來罔補一下。
咱這擺是欲講 Web hacking 無毋著——毋過,有一个上大的問題是,逐家認為啥物款的攻擊才會當算做是「Web hacking」咧?
著啦,毋免閣講咱攏已經知影 Web hacking 有啥物 command injection、XSS、SSRF 遐橐個束個已經夆講甲喙角專泡的招數,雖然攏會得算是 Web hacking 無錯,毋過彼敢干焦會發生佇咧 Web?其實除了 XSS 彼款是誠實倚 Web 前端彼層咧行的,其他咱若共伊想予斟酌——其實嘛無絕對啦乎。Emm,若按呢咱有一个上重要的元素是啥——好,咱來問一个仔 Gemini 予伊共咱說分明……
Q. 借問,具體來講啥物款兮攻擊會當共伊算做是 Web hacking? 技術彼層愛有啥款兮元素?
著啦,就是 HTTP!若有經過 HTTP 彼層,毋管按怎,咱攏愛加減共伊罔算做是 Web 矣 :P 咱若是會當佇 HTTP 的彼層揣著處理理路走精去、出重耽的所在,咱毋但當算做是揣著一个正港的「Web hacking attack surface」,嘛有機會佇較大範圍造成傷害。
總·是,HTTP 就是咱 Web 一切的基礎,就算咧教 Web hacking 嘛定定是對遐開始,所以咱這擺嘛綴咧對遮開始講起!
其實這幾冬 PortSwigger 的 Top 10 web hacking techniques,逐年攏有出現 HTTP 相關的漏縫、攻擊,下跤是這幾冬佮 HTTP 本體相關的招數:
2024
2023
2022
2021
好——按呢已經足濟,講袂了矣。
咱會發現,遮的 HTTP web hacking 招數,足大的部份攏是參 HTTP smuggleing 有牽磕的,這一切的起因,咱凡勢愛對 2019
James Kettle 這位 sia̋n-pái 的 HTTP Desync Attacks: Request Smuggling Reborn 講起。
正是因為這篇研究,才予 request smuggling 閣再予世人注意著,閣再成做現代時行的 web hacking 招數的。雖然自伊發表到 tsín 已經過欲了五、六冬去矣,毋過若佮其他傳統的 tricks 相比,應該原仔是有足濟人猶袂去共伊斟酌去理解的——所以,咱佇這个系列的頭一篇,就先來紹介一个仔這个現代 Request Smuggling 的起頭,予逐家罔知影一寡 request smuggling 的基礎!
這馬的網站,通常攏會用一組以上的 server 來處理使用者的請求。頭前會有一台前端 server,親像 load balancer抑是反向代理(reverse proxy),了後才閣有「後端伺服器」(back-end server)咧處理真正的執行理路。
為著效率,前端會共真濟無仝的使用者請求,透過仝一條網路連線,一包一包連紲送去到後端。問題就出佇遮:前端佮後端伺服器,愛對「第一包請求佇佗位結束、第二包對佗位開始」有仝款的想法。若無,攻擊者就有法度送出一个「定義無清楚」的請求,予前端佮後端產生無同的解讀。
簡單講,攻擊者會當共一个惡意的請求「走私」搢去入一个正常的請求內底。前端遐看起來,伊講感覺這是仝一个請求;毋過後端咧處理的時,煞共這个偷渡的部份,當做是後一个使用者的請求的頭。按呢,攻擊者就有才調影響、甚至直接控制著別个使用者的操作。
這个問題的根本是因為 HTTP/1.1 RFC 內底,用兩款無仝的 header 來定義請求的長短:一个是 Content-Length
(CL),閣一个是 Transfer-Encoding
(TE)。按呢,咱就來看這會造成啥款的問題。
這个「CL.TE」的意思是:Content-Length vs. Transfer-Encoding。
Content-Length
。Transfer-Encoding
。攻擊的時,會送出一个像按呢的請求:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 13
Transfer-Encoding: chunked
0
SMUGGLED
Content-Length: 13
,伊就認為這个請求的內容有 13 个 bytes 遐爾仔長,也就是算到 SMUGGLED
為止。對伊來講,這規个攏是正常的請求,所以就就按呢直接轉送去入後端。Content-Length
,伊干焦看 Transfer-Encoding: chunked
。照這个規則,伊會開始處理一段一段的資料(chunk)。伊讀著第一个 chunk 的長度是 0
,就代表這个請求已經結束矣。SMUGGLED
的資料就留落來,袂去處理。後端會共這段資料,當做是後一个入來的請求的頭。這个「TE.CL」的意思是:Transfer-Encoding vs. Content-Length。
Transfer-Encoding
。Content-Length
。攻擊的時,會送出一个像按呢的請求:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 3
Transfer-Encoding: chunked
8
SMUGGLED
0
Transfer-Encoding: chunked
,伊就知影愛用 chunk 的方式來讀。伊讀著第一个 chunk 有 8
个位元組長(也就是 SMUGGLED
),閣讀著第二个 chunk 是 0
,代表請求結束。規个請求對伊來講攏合法,就轉送到後端。Content-Length: 3
,認為這个請求的內容干焦 3 个 bytes 長。所以伊干焦讀到 8
後壁的換逝號就煞。SMUGGLED
佮後壁的資料,就攏予後端當做是後一个請求的內容。這个「TE.TE」的意思是:前後端攏支援 Transfer-Encoding
,毋過會當想辦法予其中一台「看毋捌」這个頭。
這招是利用無仝 server 對 HTTP 規格的實作無完全仝款,會當接受一寡仔無標準的寫法。攻擊者會當刁工共 Transfer-Encoding
標頭寫了較奇怪,譬論講:
Transfer-Encoding: xchunked
Transfer-Encoding : chunked
(注意冒號後壁的空白)Transfer-Encoding:[tab]chunked
(用 tab 字元)這个攻擊的目標是揣出一个「變體」的標頭,會予一台 server(譬論講前端)當做是正常的 Transfer-Encoding
來處理,毋過別台(譬論講後端)煞因為看無這个奇怪的寫法,就直接共伊擲掉,轉去看 Content-Length
。
若揣著這款變體,是後端共 TE 標頭落勾去,這个攻擊就會變作親像 TE.CL 彼款;若顛倒爿,是予前端落勾去,就會變作 CL.TE 彼款攻擊。
以上,就是基礎 HTTP smuggling 的介紹。其實,論真講彼幾个攏是相𫝛的概念,攏是想空想縫揣一寡 header,予前後端欲解說 HTTP 資料的時有無仝款的想法。這款「無一致」的行為咱定定攏會佇 web hacking 內底看著,算是一个誠重要的觀念!
紲落來佇咱的後一篇文章,咱會來繼續討論著其他對這个招數湠生出來的佮 HTTP 有關係的新招。