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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

這一特性會帶來什麼問題呢?網站往往有上傳檔案的功能,但一定不想讓使用者上傳程式,因為這很可能會危害網站安全,故而會檢查上傳檔案的字尾名,若是.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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

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

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

然後重啟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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

還記得正則表示式”.+\.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>
  • 1
  • 2
  • 3

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

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

  │
  ├── htaccess_test/
  │   ├── .htaccess
  │   ├── shell.jpg
  │   ├── type.xxx
  │   └── test/
  │       ├── shell.jpg
  │       └── type.xxx
  ├── shell.jpg
  └── type.xxx
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

  AddType application/x-httpd-php xxx

  <FilesMatch "shell.jpg">
  SetHandler application/x-httpd-php
  </FilesMatch>
  • 1
  • 2
  • 3
  • 4
  • 5

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

  <?php echo 'HELLO WORLD'; ?>

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

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

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

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

相關推薦

Apache檔案解析漏洞

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

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

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

檔案解析漏洞總結-Apache

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

檔案解析漏洞小結

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

Apache httpd 解析漏洞

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

IIS 6檔案解析漏洞

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

檔案解析漏洞總結

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

檔案解析漏洞彙總

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

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

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

apache無法解析php檔案,顯示php原始碼或直接下載檔案

我百度了一下午,根本原因是漏了一個php擴充套件:mod_php 安裝完重啟apache就好了。 yum install mod_php 其他解決辦法 羅列一下百度搜到的一些其他解決辦法,本人嘗試無用。   1.找到: AddType application/x

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

apache無法解析php檔案顯示原始碼

在httpd.conf中新增以下程式碼即可,     AddHandler  php5-script     php     AddType     application/x-httpd-php        .php .php5     AddType     appl

Linux下Apache無法解析.php檔案

    解決辦法:     修改Apache的配置檔案:httpd.conf 通過增加引數模組,讓 Apache 將副檔名 .php 解析成 PHP。為了避免潛在的危險,例如上傳或者建立類似exploit.php.jpg的檔案並被當做 PHP 執行,我們不再使用 Apach

Apache tika -- 解析多種型別(word、pdf、txt 等)檔案

http://cloudera.iteye.com/blog/737629 apache 是個偉大的組織。 在lucene 檢索 如火如荼時, apache不忘繼續努力,近期提供了對各種格式檔案進行解析的解決方案 -- apache旗下的tika. 雖然還沒有1.0版  , 但已經很好用: Jav

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

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

java實現Excel檔案解析---apache POI以及把漢字轉化為拼音

package com.haha.utils; import java.util.Arrays; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType