iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
Security

讓Web開發者森77的Hacking Trick系列 第 8

[Day8] HTTP Response Splitting - HTTP回應拆分

前言

回來講講其他HTTP攻擊吧!

正文

簡介

在Day2的HTTP基礎中,我們已經知道發送一個Request的格式,也知道Request的結尾會有一組CRLF,當Web Application沒有檢查/過濾來自使用者的某些input時,攻擊者可以透過客製化Request,來增加、設置任意Header、控制body或將Web Server的Response拆成多個Response。

範例

下面是一個網站的Response場景:

...
Name: Craig      <--網站開發者自定義的Header
...

如果網站開發者沒有進行正確的URL Encode而且透過get參數直接將這個Header反映在Header中,攻擊者就可以插入兩個CRLF,告訴Web Server接下來是Request Body。

GET /name=Craig%0d%0a%0d%0a<script>alert("XSS")</script>
Host: example.com

就可以作為XSS利用的一個管道。

或是

GET /name=Craig%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2019%0d%0a%0d%0a<html>XXXXXX</html>

註: %0d%0a是\r\n的URL encode

decode:

GET/name=Craig

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 19

<html>XXXXXX</html>

Response Result:

HTTP/1.1 302 Move Temporarily
... <-
... <- 網站原始的response
HTTP /1.1 200 OK <--從這行開始是上面寫的payload,被spilt的部分
Content-Type: text/html
Content-Length: 19
<payload>
Server: XXX

<payload>部分可以塞很多東西,可以讓攻擊者接管User的Browser、steal cookie、redirect到攻擊者架設的web service、Web Cache Poison等等。

Case Study

Drupal

在Drupal Core的一些版本中,允許用戶提供的input data成為response header的一部分,這讓攻擊者可以利用它來進行HTTP Response Splitting,這會導致除了上面講過的Web Cache Poison外,還有跨用戶竄改(cross-user defacement)和任意程式碼注入(injection of arbitrary code)

從Drupal發出的patch當中可以看出端倪

Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.611.2.9
diff -u -F^f -r1.611.2.9 common.inc
--- includes/common.inc	26 Jul 2007 19:16:45 -0000	1.611.2.9
+++ includes/common.inc	17 Oct 2007 19:28:03 -0000
@@ -267,10 +267,6 @@ function drupal_get_destination() {
  * 'user login'-block in a sidebar. The function drupal_get_destination()
  * can be used to help set the destination URL.
  *
- * It is advised to use drupal_goto() instead of PHP's header(), because
- * drupal_goto() will append the user's session ID to the URI when PHP is
- * compiled with "--enable-trans-sid".
- *
  * This function ends the request; use it rather than a print theme('page')
  * statement in your menu callback.
  *
@@ -302,6 +298,8 @@ function drupal_goto($path = '', $query 
   }
 
   $url = url($path, $query, $fragment, TRUE);
+  // Remove newlines from the URL to avoid header injection attacks.
+  $url = str_replace(array("\n", "\r"), '', $url);
 
   // Before the redirect, allow modules to react to the end of the page request.
   module_invoke_all('exit', $url);

可以看原本的22行,在未進行任何檢查和過濾的狀況下,直接引入了url的path,query和fragment做使用。新增的24行則是直接做replace CRLF的過濾。


下篇預告: ORM Injection
你聽過SQL Injection,那ORM呢?


上一篇
[Day7] Local File Inclusion / Remote File Inclusion
下一篇
[Day9] ORM Injection
系列文
讓Web開發者森77的Hacking Trick30

尚未有邦友留言

立即登入留言