前端伺服器和後端伺服器對於一個HTTP請求在哪裡結束的判斷不一致
請求邊界看法不同攻擊者利用這個落差
把惡意請求偷渡進去
IPAS 115-1 Q24
關於「HTTP 請求走私攻擊(HTTP Request Smuggling)」的成因,下列何項說明最為適切?
D :攻擊者利用前端代理伺服器(Proxy Server)與後端伺服器對HTTP請求邊界解析不一致,導致請求邊界混淆
為什麼邊界會不一致
首先要知道 判斷body到哪裡結束的標頭有兩種
- Content-Length (看長度)
- Transfer-Encoding: chunked (看結束標記)
如果前端用一種,結果後端用另一種
攻擊者就能做出前端看成一個但後端看成兩個的封包
這樣就能繞過保護、劫持流量、汙染快取
防禦
前端與後端應該用一致且嚴格的規則解析 HTTP 請求Request
寫入的資料超過緩衝區能容納的資料量,造成資料溢出,破壞程式執行,嚴重時可能被利用取得程式甚至系統控制
緩衝區通常都有固定的容量 假設:
程式執行時,會使用一塊記憶體空間作為緩衝區暫存資料
這塊緩衝區可能是位於堆疊或是堆積等不同記憶體區域
假設配置了一塊 8bytes的空間
緩衝區容量有8格
假設:
[ 8 bytes ] [ 4 bytes ] [ 4 bytes ] [ 4 bytes ]
buffer 其他變數 saved EBP Return Address
可是攻擊者透過程式本身的輸入框把資料硬塞到17格
超過緩衝區邊界Boundary
假設攻擊者隨便亂打沒有輸入任何惡意指令
結果就是->程式直接當機
假設攻擊者有目的的寫入惡意指令
結果攻擊者將資料溢出到最後一格(返回地址)並把那個地址寫成攻擊者的地方
攻擊者輸入AAAAAAAABBBBCCCC惡意位址
[ 8 bytes ] [ 4 bytes ] [ 4 bytes ] [ 4 bytes ]
[ AAAAAAAA] [ BBBB ] [ CCCC ] [ 惡意位址 ]
整個舉例流程就是
配置 buffer → 溢出 → 蓋掉 Return Address → 跳去執行惡意指令
這些是Stack-Based 堆疊型
Heap-Based 堆積型
堆疊型是已經知道溢出後下一個區域是什麼
就像擺盤子一樣,你知道下一個盤子擺在哪裡,是整齊好猜的
而堆積型是像一個倉庫一樣,裡面東西的擺放方式不像堆疊型那麼整齊,它有一套自己的規則
所以你並不知道要破壞到哪裡才會是有效區域
原理一樣都是溢出,差別只在攻擊的位置和手法不同
IPAS 115-1 Q15
某研究人員發現一個 OS kernel 的漏洞:惡意程式可經由某個 syscall 觸發 kernel 中的緩衝區溢位,但要成功利用此漏洞必須先取得或推測核心記憶體位址。下列何種安全機制最能有效降低該攻擊的成功率?
C :ASLR/KASLR
位址隨機化正面對上題幹的前提,位址一亂,攻擊者就算觸發溢位也跳不到想去的地方
這也是DAY30-31有講到的內容
IPAS 114-2 Q20
下列哪一種攻擊手法試圖利用作業系統對於記憶體存取的管理不當,透過將惡意程式碼注入到應用程式的記憶體空間中,從而執行未經授權的操作?
B :緩衝區溢位攻擊
這題對應剛剛的舉例
記憶體存取管理不當:
buffer 只有 8bytes,但程式不檢查,讓你寫超過
注入惡意程式碼:AAAAAAAABBBBCCCC惡意位址
執行未經授權的操作:
程式跳去惡意位址
執行 shellcode(攻擊者取得控制權)惡意位址 = 去哪裡
shellcode = 到了要幹嘛