回來講講其他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等等。
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呢?