1. 程式人生 > >檔案解析漏洞總結-Apache

檔案解析漏洞總結-Apache

我最為熟悉的便是Apache了,先來研究它的檔案解析漏洞。百度許久,又谷歌一番,最終發覺,Apache關於檔案解析,似乎只有三種“漏洞”。之所以打引號是因為我覺得這三種“漏洞”都不是Apache的漏洞,只是其特性,而很多程式設計師不瞭解這種特性,故而寫出有問題的程式碼,這才給黑客可趁之機,造成漏洞。但大家都稱呼這是Apache的檔案解析漏洞,我也只好隨大流了。

1.多字尾名

先說第一種特性:多字尾名。這是怎麼的一種鮮為人知的特性呢?原來是這樣的,Apache認為,一個檔案可以有多個字尾,如:werner.txt.png.mp3。這一檔案,放在Windows裡,毫無疑問,就是個mp3檔案,Windows只認最後一個“.”及其後面的字元“mp3”,覺得該檔案字尾為“.mp3”,這也是大多數作業系統、應用軟體的處理方式、是正常人習慣。而在Apache中,則可能有所不同,如果有必要,Apache會從後(右)往前(左),一一辨別字尾。何時有必要?當Apache不認識某個字尾時,便有必要。如某檔名為:werner.mp3.html.qwe.arex,Apache在處理時,先讀取最後一個字尾,為“.arex”,一看,這啥玩意啊,不認識,繼續讀取下一個字尾“.qwe”,一看,呀,這又是啥,還是不認識,繼續讀下一個字尾“.html”,一看,哦,這是個超文字標記語言檔案,俗稱網頁檔案,這回認識了,也就不繼續讀下一個字尾了。若是所有後綴都看完了沒有一個認識怎麼辦?此時就會把該檔案當做預設型別進行處理了,一般來說,預設型別是text/plain。據說在Apache的配置檔案中搜索“DefaultType”就能看到預設型別的明確定義了,但我卻不知為何,沒有找到。

哪些字尾Apache認識,哪些不認識?有一個名為mime.types的檔案,其中記錄著Apache認識的字尾。在Ubuntu下,該檔案位於/etc/mime.types,在Windows下,該檔案位於C:/apache/conf/mime.types(類似這樣的,注意Apache的安裝路徑)。該檔案是一個一對多的對映表,定義了某一種檔案型別,對應的幾種字尾。除了該檔案,在Apache的配置檔案中,還可以用AddCharset語句新增對映,如:

  AddCharset us-ascii   .ascii .us-ascii
  AddCharset ISO-2022-CN .iso2022-cn .cis

mime.types是個很長的檔案,大概看了下,Apache認識的字尾比我多多了。節選部分如下所示:

  application/java-archive          jar
  application/m3g                         m3g
  application/java-vm                   class
  application/javascript                js
  application/json                    json
  text/html                             html htm shtml
  text/x-diff
diff patch video/x-flv flv video/x-la-asf lsf lsx video/x-mng mng video/x-ms-asf asf asx video/x-ms-wm wm

這一特性會帶來什麼問題呢?網站往往有上傳檔案的功能,但一定不想讓使用者上傳程式,因為這很可能會危害網站安全,故而會檢查上傳檔案的字尾名,若是.php,則拒絕上傳(假設這是個php站)。此時使用者只需上傳檔案evildoer.php.qwe,若是程式設計師不瞭解Apache的這一特性,編寫的程式檢查字尾時只看“.qwe”,而認為這不是程式檔案,允許上傳,則使用者成功地繞過了上傳時的安全檢查,上傳了php程式檔案。該檔案的最後一個字尾“.qwe”是Apache不認識的,故而Apache會以倒數第二個字尾“.php”為準,把該檔案當做是php檔案,解析執行。

這總是奏效的嗎?按理來說,由於這是特性而不是漏洞,所以適用於所有版本的Apache。這一奇怪的特性,說不定正是Apache的自豪之處呢。但是,在我的測試中卻發現,類似aaa.php.xxx的檔案並不會被作為php程式執行,而是被當成文字檔案,返回給瀏覽器,在瀏覽器中可以看到php原始碼,而不是執行結果。測試環境是Ubuntu14.04+Apache2.4.7+php5。

這是怎麼回事?難道前面幾百字都是廢話,說的是錯的?我們來做個實驗。準備一個檔案,內容隨意,命名為test.jpg.aaa,放置在Apache中,然後在瀏覽器中訪問它,結果如下圖所示:

這裡寫圖片描述

可見瀏覽器是將該檔案作為圖片處理的。瀏覽器為何認為test.jpg.aaa是圖片呢?aaa可不是圖片檔案的字尾。這是因為伺服器的響應HTTP頭中的Content-Type欄位值為image/jpeg,瀏覽器看到image/jpeg,便知這是圖片檔案。這說明伺服器(此處即Apache)是把test.jpg.aaa當做圖片的,也說明,前面分析的Apache的多字尾處理是沒有錯的。

那麼aaa.php.xxx為何沒有被作為php程式碼執行呢?我猜是這樣的,當然只是我的猜測,實在是找不到相關資料,只好猜了。Apache看到檔案aaa.php.xxx,按照多字尾名的解析規則,認為該檔案是php程式檔案,把該檔案作為php程式檔案處理。怎麼處理呢?交給php直譯器,Apache本身並不懂php。而php直譯器卻有著和Apache不同的字尾解析規則,可能只認最後一個字尾,故而認為aaa.php.xxx不是php程式檔案,拒絕執行。在我的測試環境中,php以模組(module)的模式工作於Apache的領導下。這種模式下php接受到領導Apache分配的任務——aaa.php.xxx,一看,不是php程式檔案,沒法執行,但也沒有報錯,而是返回了檔案內容本身。php還可以以FASTCGI的模式工作於Apache中,此種模式下php遇到類似aaa.php.xxx這種不是php程式的檔案,會觸發500錯誤。

php本身是如何識別檔案的呢?我在Apache的模組的配置檔案中找到了php5.conf,內容如下:

  <FilesMatch ".+\.ph(p[345]?|t|tml)$">
      SetHandler application/x-httpd-php
  </FilesMatch>
  <FilesMatch ".+\.phps$">
      SetHandler application/x-httpd-php-source
      # Deny access to raw php sources by default
      # To re-enable it's recommended to enable access to the files
      # only in specific virtual host or directory
      Order Deny,Allow
      Deny from all
  </FilesMatch>
  # Deny access to files without filename (e.g. '.php')
  <FilesMatch "^\.ph(p[345]?|t|tml|ps)$">
      Order Deny,Allow
      Deny from all
  </FilesMatch>

  # Running PHP scripts in user directories is disabled by default
  #
  # To re-enable PHP in user directories comment the following lines
  # (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
  # prevents .htaccess files from disabling it.
  <IfModule mod_userdir.c>
      <Directory /home/*/public_html>
          php_admin_flag engine Off
      </Directory>
  </IfModule>

閱讀上示配置檔案可知,被當做php程式執行的檔名要符合正則表示式:”.+\.ph(p[345]?|t|tml)"”符號在正則中匹配結束,故而可知php本身確實是只看最後一個字尾的。就算Apache把某檔案當php程式,php自己不認它,也是無用。

進一步試驗,把php5.conf檔案中剛剛提到的正則表示式的“$”換成“\.”,即:

  ".+\.ph(p[345]?|t|tml)\."

然後重啟Apache使配置檔案生效,再在瀏覽器中訪問aaa.php.xxx,這次,aaa.php.xxx果然被當做php程式執行了,在瀏覽器中,看到的是程式執行結果而不是原始碼。這也從側面驗證了,我的猜測是正確的。測試完之後,一定要記得改回去。

2.罕見字尾

計算機世界自開天闢地以來,便自由多彩。還記得mime.types檔案嗎?在該檔案中搜索“php”這三個字母,結果如下所示:

  [email protected]:~$ cat /etc/mime.types | grep php
  #application/x-httpd-php          phtml pht php
  #application/x-httpd-php-source           phps
  #application/x-httpd-php3         php3
  #application/x-httpd-php3-preprocessed        php3p
  #application/x-httpd-php4         php4
  #application/x-httpd-php5         php5

還記得正則表示式”.+\.ph(p[345]?|t|tml)$”嗎,該正則表示式匹配的不僅僅有php,還有php3、php4、php5、pht和phtml。

好吧,原來不僅php,就連phtml、pht、php3、php4和php5都是Apache和php認可的php程式的檔案字尾。我原本只知道“.php”的,真是大開眼界。這就好比,不僅py是Python程式檔案的字尾,還有pyc和pyo也都是。寫上傳過濾規則的程式設計師是否博學多識,也知道這些知識呢?我想,大抵是不知道的。利用這些“罕見”的字尾名,也可能繞過安全檢查,幹些“壞事”。

我在Ubuntu14.04+Apache2.4.7中進行測試,先準備檔案text.php,其內容是經典的Hello World:

  <?php echo 'HELLO WORLD'; ?>

然後在瀏覽器中開啟它,成功顯示“HELLO WORLD”。再修改該檔案字尾為各種字尾,進行測試。測試結果是,以php、phtml、pht、php3、php4和php5為字尾,能成功看到“HELLO WORLD”;以phps為字尾,會報403錯誤,Forbidden;以php3p為字尾,會在瀏覽器中看到原始碼。

3.妙用.htaccess

.htaccess是Apache的又一特色。一般來說,配置檔案的作用範圍都是全域性的,但Apache提供了一種很方便的、可作用於當前目錄及其子目錄的配置檔案——.htaccess(分散式配置檔案)。

要想使.htaccess檔案生效,需要兩個條件,一是在Apache的配置檔案中寫上:

  AllowOverride All

若這樣寫則.htaccess不會生效:

  AllowOverride None

二是Apache要載入mod_Rewrite模組。載入該模組,需要在Apache的配置檔案中寫上:

  LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

若是在Ubuntu中,可能還需要執行命令:

  sudo a2enmod rewrite

配置完後需要重啟Apache。

需要注意Apache可能有多個配置檔案,後加載的配置檔案會覆蓋先載入的配置檔案中的配置。所以在某個配置檔案中將AllowOverride設定成All,若是其後載入的某個配置檔案中AllowOverride的設定是None,則也是沒有用的。一般來說,先載入httpd.conf,再載入conf.d/中的配置檔案,最後載入sites-enabled/中的配置檔案。

這意味著,.htaccess並不總是有效的。而且不幸的是,在我的測試環境中.htaccess預設無效。好吧,為了測試,我只好將它改為有效。以下討論均在.htaccess有效的前提下進行。

.htaccess檔案可以配置很多事情,如是否開啟站點的圖片快取、自定義錯誤頁面、自定義預設文件、設定WWW域名重定向、設定網頁重定向、設定圖片防盜鏈和訪問許可權控制。但我們這裡只關心.htaccess檔案的一個作用——MIME型別修改。如在.htaccess檔案中寫入:

  AddType application/x-httpd-php xxx

就成功地使該.htaccess檔案所在目錄及其子目錄中的字尾為.xxx的檔案被Apache當做php檔案。另一種寫法是:

  <FilesMatch "shell.jpg">
    SetHandler application/x-httpd-php
  </FilesMatch>

該語句會讓Apache把shell.jpg檔案解析為php檔案。

下面是一次測試,測試前已經開啟Apache對.htaccess檔案的支援。在網站根目錄中準備如下檔案樹:

  │
  ├── htaccess_test/
  │   ├── .htaccess
  │   ├── shell.jpg
  │   ├── type.xxx
  │   └── test/
  │       ├── shell.jpg
  │       └── type.xxx
  ├── shell.jpg
  └── type.xxx

其中,檔案.htaccess的內容為:

  AddType application/x-httpd-php xxx

  <FilesMatch "shell.jpg">
  SetHandler application/x-httpd-php
  </FilesMatch>

檔案shell.jpg和type.xxx的內容相同,均為:

  <?php echo 'HELLO WORLD'; ?>

然後在瀏覽器中訪問各檔案,結果如下表所示:

訪問路徑 訪問結果
/type.xxx <?php echo ‘HELLO WORLD’; ?>
/shell.jpg 載入失敗的圖片
/htaccess_test/type.xxx HELLO WORLD
/htaccess_test/shell.jpg HELLO WORLD
/htaccess_test/test/type.xxx HELLO WORLD
/htaccess_test/test/shell.jpg HELLO WORLD

這一測試結果和預期是相符的。

但是,按照前面的猜測,就算Apache認為type.xxx是php檔案,php自己不這麼認為,不也是不能執行的嗎?這次怎麼就能執行了,好生奇怪。但不管怎麼說,我們都已經知道,當.htaccess檔案有效時,用.htaccess檔案可以很好地設定檔案字尾的解析方式。

相關推薦

檔案解析漏洞總結-Apache

我最為熟悉的便是Apache了,先來研究它的檔案解析漏洞。百度許久,又谷歌一番,最終發覺,Apache關於檔案解析,似乎只有三種“漏洞”。之所以打引號是因為我覺得這三種“漏洞”都不是Apache的漏洞,只是其特性,而很多程式設計師不瞭解這種特性,故而寫出有問題的

IIS 6.0/7.0/7.5、Nginx、Apache 等Web Service解析漏洞總結 Apache解析漏洞詳解

[+]IIS 6.0 目錄解析:/xx.asp/xx.jpg  xx.jpg可替換為任意文字檔案(e.g. xx.txt),文字內容為後門程式碼 IIS6.0 會將 xx.jpg 解析為 asp 檔案。 字尾解析:/xx.asp;.jpg     /xx

檔案解析漏洞總結

一、IIS 5.x/6.0解析漏洞 IIS 6.0解析利用方法有兩種 1.目錄解析 /xx.asp/xx.jpg 2.檔案解析 cracer.asp;.jpg 第一種,在網站下建立資料夾的名字為 .asp、.asa 的資料夾,其目錄內的任何副

檔案上傳漏洞 --- IIS、Apache、Nginx 檔案解析漏洞

解析漏洞:將格式進行變換解析 解析條件:1.搭建平臺 2.命名規則 iis apache uginx iis6.0 檔案正常地址: 觸發漏洞地址: 資料夾正常地址: 觸發漏洞地址: iis7.x uginx Apache(向上

IIS 6.0/7.0/7.5、Nginx、Apache 等 Web Service 解析漏洞總結

[+]IIS 6.0 目錄解析:/xx.asp/xx.jpg  xx.jpg可替換為任意文字檔案(e.g. xx.txt),文字內容為後門程式碼 IIS6.0 會將 xx.jpg 解析為 asp 檔案。 字尾解析:/xx.asp;.jpg     /xx.asp:.jpg

Apache檔案解析漏洞

我最為熟悉的便是Apache了,先來研究它的檔案解析漏洞。百度許久,又谷歌一番,最終發覺,Apache關於檔案解析,似乎只有三種“漏洞”。之所以打引號是因為我覺得這三種“漏洞”都不是Apache的漏洞,只是其特性,而很多程式設計師不瞭解這種特性,故而寫出有問題的程式碼,這才給

檔案解析漏洞小結

一、IIS 5.x/6.0解析漏洞利用方法有兩種 1.目錄解析 /xx.asp/xx.jpg 漏洞原理:在網站下建立名字為 xx.asp的資料夾,其目錄內的任何副檔名的檔案都被IIS當作asp檔案來解析並執行。(php的也是一樣) 漏洞利用:  例如建立目錄&nb

IIS 6檔案解析漏洞

一:環境 windows server 2003 + iis 6 二:原理 test.asp;.jpg 系統將其當做.jpg,iis 6將其當做asp進行解析 三:危害 在上傳圖片的位置可能存在檔案上

常見的文件解析漏洞總結

不可 can files 影響 漏洞 8.0 名稱 keditor 情況 常見的文件解析漏洞總結 iis解析漏洞 解析漏洞主要是說一些特殊文件被iis,apache,nginx等web容器在特殊情況下被解釋成腳本文件格式 ==iis5.x/6.0解析漏洞:== 1,目錄解析

檔案解析漏洞彙總

解析漏洞正如其名,一般大家常說的是,檔案在某種格式下,會被執行為該指令碼語言的檔案。 檔案上傳漏洞通常與Web容器的解析漏洞配合利用 常見Web容器有IIS、Nginx、Apache、Tomcat等 好了正文開始彙總了,反正都轉載貼的,我自己也忘了在哪裡看到的了,就

htaccess檔案解析漏洞和利用Tamper繞過防注入程式碼

(一)htaccess檔案解析漏洞   Apache中當上傳到檔案全部被解析為,jpg的字尾時。可以嘗試一下字尾為htaccess的檔案,程式碼如下   AppType    application/x-httpd-php     .jpg 程式碼的含義 是 將上傳的檔案字

Apache httpd 解析漏洞

Apache HTTPD 換行解析漏洞(CVE-2017-15715) apache通過mod_php來執行指令碼,其2.4.0-2.4.29中存在apache換行解析漏洞,在解析php時xxx.php\x0A將被按照PHP字尾進行解析,導致繞過一些伺服器的安全策略。 docker-

技術總結:XML檔案解析

近期整理了以前的程式碼,將XML檔案的解析程式碼程式設計了一個工具。通過Document類得到一個NodeList,遍歷其得到標籤,通過標籤得到XML檔案的內容。利用抽象方法提供給使用者處理檔案的介面。程式碼如下: /* * @auther yc * 2018/10/1

webpack構建工具學習總結(二)webpack.config.js配置檔案解析

1、新建webpack.config.js檔案配置webpack資訊,新建src資料夾存放原始檔,新建dist資料夾存放打包後的檔案 2、在開始配置之前需要理解四個核心概念:入口(entry)、輸出(output)、loader、外掛(plugins)   1.

檔案包含漏洞的原理總結及例題

什麼是檔案包含漏洞: PHP檔案包含漏洞的產生原因: 在通過PHP的函式引入檔案時,由於傳入的檔名沒有經過合理的校驗,從而操作了預想之外的檔案,就可能導致意外的檔案洩露甚至惡意的程式碼注入。最常見的就屬於本地檔案包含(Local File Inclusion)漏洞了。

檔案上傳漏洞總結

1.檔案上傳漏洞    檔案上傳漏洞是指使用者上傳了一個可執行的指令碼檔案,並通過此指令碼檔案獲得了執行伺服器端的命令。2.Apache檔案解析問題    在Apache 1.x 2.x 中,對檔名的解析就存在一下特徵。    Apache對於檔名的解析是從後往前解析的,直到

51. 檔案上傳篇——IIS解析漏洞原理

目錄解析當建立“*asp、*asa”格式的資料夾時,其目錄下的任意檔案都將會被IIS當做ASP檔案來解析。例如:建立資料夾parsing.asp,在parsing.asp資料夾下新建一個文字檔案test.txt,其內容為<%=now()%>,然後在瀏覽器中訪問,會

漏洞復現——Apache HTTPD多後綴解析漏洞

src 就是 查看 nbsp pac apache inf png 多個 漏洞原理:Apache Httpd支持一個文件擁有多個後綴,不同的後綴執行不同的命令,也就是說當我們上傳的文件中只要後綴名含有php,該文件就可以被解析成php文件,利用Apache Httpd這個特

上傳檔案漏洞&解析漏洞

本文致力於探索利用網站漏洞來上傳非法檔案的方法。 基本技術 下面是一些繞過檔案上傳限制的基本技術。其中的漏洞與網站使用的後臺無關,而是由於網頁的編寫者沒有進行完全和有效的限制才產生的漏洞。 型別1:前端驗證 某些網站採用前端驗證的方式限制使用者上

57. 檔案包含篇——檔案包含漏洞原理解析

定義:在通過PHP的函式引入檔案時,由於傳入的檔名沒有經過合理的校驗,從而操作了預想之外的檔案,導致意外的檔案洩露甚至惡意的程式碼注入。程式開發人員通常會把可重複使用的函式寫到單個檔案中,在使用某些函式時,直接呼叫此檔案,而無須再次編寫,這種呼叫檔案的過程一般被稱為包含。程式