1. 程式人生 > 程式設計 >案例講解WEB 漏洞-檔案操作之檔案下載讀取

案例講解WEB 漏洞-檔案操作之檔案下載讀取

目錄
  • 原理
  • 漏洞危害
  • 利用方式
  • 系統檔案
    • window
  • 常見敏感檔案參考
    • 任意檔案讀取
      • 任意檔案下載
        • Google search
          • 漏洞利用程式碼
            • 漏洞挖掘
              • 漏洞驗證
                • 漏洞防範
                  • 案例
                    • pikuchu靶場-檔案下載測試
                    • 小米路由器-檔案讀取真實測試-漏洞
                    • RoarCTF2019-檔案讀取真題復現
                    • 百度杯2017二月-Zone真題復現

                  原理

                  產生:任意語言程式碼下載函式
                  檔案下載(一些由於業務需求,往往需要提供檔案檢視或檔案下載功能,但若對使用者檢視或下載的檔案不做限制,則惡意使用者就能夠檢視或下載任意敏感檔案,這就是檔案檢視與下載漏洞。)

                  檔案下載功能在很多web系統上都會出現,一般我們當點選下載連結,便會向後臺傳送一個下載請求,一般這個請求會包含一個需要下載的檔名稱,後臺在收到請求後 會開始執行下載程式碼,將該檔名對應的檔案response給瀏覽器,從而完成下載。 如果後臺在收到請求的檔名後,將其直接拼進下載檔案的路徑中而不對其進行安全判斷的話,則可能會引發不安全的檔案下載漏洞。此時如果 攻擊者提交的不是一個程式預期的的檔名,而是一個精心構造的路徑(比如../../../etc/passwd),則很有可能會直接將該指定的檔案下載下來。 從而導致後臺敏感資訊(密碼檔案、原始碼等)被下載。

                  所以,在設計檔案下載功能時,如果下載的目標檔案是由前端傳進來的,則一定要對傳進來的檔案進行安全考慮。

                  漏洞危害

                  下載伺服器任意檔案,如指令碼程式碼、服務及系統配置檔案等
                  可用得到的程式碼進一步程式碼審計,得到更多可利用漏洞

                  利用方式

                  淺談任意檔案下載漏洞的利用
                  資訊收集資訊→猜路徑→下載配置檔案/程式碼檔案→利用伺服器軟體漏洞→shell→提權

                  首先收集系統資訊,包括系統版本,中介軟體,版本,伺服器用途,伺服器使用者資訊,埠,web路徑等,然後根據收集到的資訊,下載配置檔案,如weblogic,ftp,ssh等, 根據下載到的配置檔案進行滲透。

                  1. 讀取程式原始碼(如密碼配置檔案)
                  2. 讀取程式配置檔案(如連線檔案)

                  如weblogic,ssh,ftp,資料庫配置檔案等, 當解出密碼後,進行登陸,getshell
                  3. 讀取關鍵檔案(如/etc/sadow,/ root/.bash_history等檔案)
                  4. 讀取運維配置檔案(redis/rsync/ftp/ssh客 戶端資料等)
                  5. 讀取中介軟體配置檔案(weblogic/tomcat等 密碼檔案,apache的httpd.conf檔案)
                  6. 下載web日誌檔案(獲取網站後臺/上傳檔案 等)
                  下載日誌檔案,找到登入/上傳/後臺/ 操作,找到登入入口 可以爆破,測試預設口令,弱口令, 找到檔案上傳點則測試檔案上傳漏洞,找到後臺操作試試有沒有未授權訪問
                  7. 結合SSRF獲取內網機器檔案
                  8. 可以利用../返回到上級目錄下載敏感檔案

                  系統檔案

                  window

                  C:\boot.ini //檢視系統版本
                  C:\Windows\System32\inetsrv\MetaBase. xml //IIS配置檔案
                  C:\Windows\repair\sam //儲存系統初次安裝的密碼
                  C:\Program Files\\my.ini //Mysql配置
                  C:\Program Files\mysql\data\mysql\user. MYD //Mysql root
                  C:\Windows\.ini //php配置資訊
                  C:\Windows\my.ini //Mysql配置資訊

                  Linux

                  .bash_history` # 歷史中可能帶著使用者的密碼 ( 遇到過現實案例,是輸錯的情況下引數的,比如沒 輸入 su 卻以為自己輸了 su)
                  /etc/passwd # 使用者情況
                  /etc/shadow # 直接 John the Ripper
                  /etc/hosts # 主機資訊,通常配置了一些內網 域名
                  /root/.bash_history //root的bash歷史記錄
                  /root/.ssh/authorized_keys /root/.mysql_history //mysql的bash歷史記錄
                  /root/.wget-hsts /opt/nginx/conf/nginx.conf //nginx的配置http://www.cppcns.com檔案
                  /var/www/html/index.html /etc/my.cnf /etc/httpd/conf/httpd.conf //httpd的配置檔案
                  /proc/self/fd/fd[0-9]*(檔案識別符號)
                  /proc/mounts /porc/config.gz /proc/sched_debug // 提供cpu上正在執行的程序資訊,可以獲得程序的pid號,可以配合後面需要pid的利用
                  /proc/mounts // 掛載的檔案系統列表
                  /proc/net/arp //arp表,可以獲得內網其他機器的地址
                  /proc/net/route //路由表資訊
                  /proc/net/tcp and /proc/net/udp // 活動連線的資訊
                  /proc/net/fib_trie // 路由快取
                  /proc/version // 核心版本
                  /proc/[PID]/cmdline // 可能包含有用的路徑資訊
                  /proc/[PID]/environ // 程式執行的環境變數資訊,可以用來包含getshell
                  /proc/[PID]/cwd // 當前程序的工作目錄
                  /proc/[PID]/fd/[#] // 訪問file descriptors, 某寫情況可以讀取到程序正在使用的檔案,比如 access.log /root/.ssh/id_rsa /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys /etc/ssh/sshd_config /var/log/secure /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/syscomfig/network-scripts/ifcfg-eth1
                  /usr/local/tomcat/conf/tomcat-users. xml # tomcat 使用者配置檔案
                  /root/.bashrc # 環境變數
                  /root/.bash_history # 還有root外的其他使用者
                  /root/.viminfo # vim 資訊
                  /root/.ssh/id_rsa # 拿私鑰直接ssh
                  /proc/xxxx/cmdline # 程序狀態列舉 xxxx 可以為0000-9999 使用burpsuite 資料庫 config 檔案 web 日誌 access.log,error.log /var/lib/php/sess_PHPSESSID # 非常規問題 session 檔案
                  /proc/net/arp /proc/net/tcp /proc/net/udp /proc/net/dev

                  常見指令碼敏感檔案參考

                  PHP: inc/config. php獲得資料庫連線字串中的口令資訊
                  asp: inc/conn.awww.cppcns.comsp檔案,獲得資料庫連線字串,得到資料庫口令。
                  aspx: web.config網站根目錄檔案,獲得資料庫連線資訊。
                  P: conf/ tomcat-user.xml檔案,獲得tomcat管理介面的口令資訊
                  WEB- INF /Web. xml檔案,獲得資料庫連線字串中的口令資訊。

                  任意檔案讀取

                  <?php
                      $filename = "test.txt";
                      readfile($filename);
                  ?>
                  
                  <?php
                      $filename = "test.txt";
                      $fp = fopen($filename,"r") or die("Unable to open file!");
                      $data = fread($fp,filesize($filename));
                      fclose($fp);
                      echo $data;
                  ?>
                  
                  <?php
                      $filename = "test.txt";
                      echo file_get_contents($filename);
                  ?>
                  

                  任意檔案下載

                  直接下載:

                  <a href="http://www.xx.com/a.zip" rel="external nofollow" >Download</a>
                  

                  用header()下載:

                  <?php
                      $filename = "uploads/201607141437284653.jpg";
                      header('Content-Type: imgage/jpeg');
                      header('Content-Disposition: attachment; filename='.$filename);
                      header('Content-Lengh: '.filesize($filename));
                  ?>
                  

                  Google search

                  inurl:"readfile.php?file="
                  inurl:"read.php?filename="
                  inurl:"download.php?file="
                  inurl:"down.php?file="
                  等等...
                  

                  漏洞利用程式碼

                  readfile.php?file=/etc/passwd
                  readfile.php?file=../../../../../../../../etc/passwd
                  readfile.php?file=../../../../../../../../etc/passwd%00
                  

                  1.檔案被解析,則是檔案包含漏洞
                  2.顯示原始碼,則是檔案讀取漏洞
                  3.提示檔案下載,則是檔案下載漏洞

                  漏洞挖掘

                  可以用Google hacking或Web漏洞掃描器
                  從連結上看,形如:
                      • readfile.php?file=***.txt
                      • download.php?file=***.rar
                  從引數名看,形如:
                      • &RealPath= 
                      • &FilePath= 
                      • &filepath= 
                      • &Path= 
                      • &path= 
                      • &inputFile= 
                      • &url= 
                      • &urls= 
                      • &Lang= 
                      • &dis= 
                      • &data= 
                      • &amp;readfile= 
                      • &filep= 
                      • &src= 
                      • &menu= 
                      • META-INF 
                      • WEB-INF
                  目錄符號等
                  ../ ..\ .\ ./等
                  %00 ? %23 %20 .等
                  

                  漏洞驗證

                  • index.php?f=../../../../../../etc/passwd 
                  &#eUZjO8226; index.php?f=../index.php 
                  • index.php?f=file:///etc/passwd
                  注:當引數f的引數值為php檔案時,若是檔案被解析則是檔案包含漏洞,
                      若顯示原始碼或提示下載則是檔案檢視與下載漏洞
                  

                  漏洞防範

                  任意檔案下載漏洞的簡單防護措施
                  1、過濾“.”符號,使使用者在url中無法回溯到上級目錄。
                  2、使用正則表示式嚴格判斷使用者輸入引數的格式。
                  3、php.ini配置檔案中對於open_basedir進行配置,限定使用者的檔案訪問範圍。
                  4、固定目錄

                  案例

                  pikuchu靶場-檔案下載測試

                  1、判斷是否為檔案上傳漏洞

                  在這裡插入圖片描述

                  點選任意圖片,發現下載了圖片,複製圖片下載連結檢視

                  http://127.0.0.1/xscj/pikachu-master/vul/unsafedownload/execdownload.php?filename=kb.png

                  檢視引數名為filename,檢視引數後面的值也與下載的檔名一樣
                  初步判定為檔案上傳漏洞

                  2、判斷下載路徑
                  filename的檔名是單純的檔名,可判斷是前面加了路徑名,也可能是與網站在同一個目錄下
                  通過URL判斷檔案是通過跳轉到execdownload.php頁面下載的,我們試試看可不可以直接下載到execdownload.php這個原始碼

                  http://127.0.0.1/xscj/pikachu-master/vul/unsafedownload/execdownload.php?filename=execdownload.php

                  在這裡插入圖片描述

                  發現顯示無法下載,說明該execdownload.php與檔案不在同一個路徑下,我們嘗試下到上一級路徑

                  http://127.0.0.1/xscj/pikachu-master/vul/unsafedownload/execdownload.php?filename=../execdownload.php

                  在這裡插入圖片描述

                  成功下載,開啟原始碼發現是在download資料夾下

                  在這裡插入圖片描述

                  說明檔案下載路徑的資料夾與down_nba.php是同一級路徑
                  3、嘗試下載敏感檔案(以下路徑均通過掃描路徑得到)
                  pikachu-master/inc/config.inc.php
                  當前下載路徑:
                  pikachu-master/vul/unsafedownload/download/xxx.xxx
                  與vul相差3個父目錄,所以加3個…/
                  完整url:
                  http://127.0.0.1/xscj/pikachu-master/vul/unsafedownload/execdownload.php?filename=…/…/…/inc/config.inc.php
                  下載成功,打開發現裡面存在資料庫相關的配置檔案

                  在這裡插入圖片描述

                  小米路由器-檔案讀取真實測試-漏洞

                  復現

                  RoarCTF2019-檔案讀取真題復現

                  wp
                  首先看到一個頁面,點選下help看看啥情況。
                  在這裡插入圖片描述

                  發現輸出一串

                  .io.FileNotFoundException:{help.docx}
                  

                  是檔案無法找到的異常資訊

                  在這裡插入圖片描述

                  查詢資料發現:
                  WEB-INF/web.xml洩露
                  WEB-INF是Java的WEB應用的安全目錄。如果想在頁面中直接訪問其中的檔案,必須通過web.xml檔案對要訪問的檔案進行相應對映才能訪問。WEB-INF主要包含一下檔案或目錄:
                  /WEB-INF/web.xml:Web應用程式配置檔案,描述了 servlet 和其他的應用元件配置及命名規則。
                  /WEB-INF/classes/:含了站點所有用的 class 檔案,包括 servlet class 和非servlet class,他們不能包含在 .jar檔案中
                  /WEB-INF/lib/:存放web應用需要的各種JAR檔案,放置僅在這個應用中要求使用的jar檔案,如資料庫驅動jar檔案
                  /WEB-INF/src/:原始碼目錄,按照包名結構放置各個java檔案。
                  /WEB-INF/database.properties:資料庫配置檔案

                  漏洞成因:
                  通常一些web應用我們會使用多個web伺服器搭配使用,解決其中的一個web伺服器的效能缺陷以及做均衡負載的優點和完成一些分層結構的安全策略等。在使用這種架構的時候,由於對靜態資源的目錄或檔案的對映配置不當,可能會引發一些的安全問題,導致web.xml等檔案能夠被讀取。漏洞檢測以及利用方法:通過找到web.xml檔案,推斷class檔案的路徑,最後直接class檔案,在通過反編譯class檔案,得到網站原始碼。一般情況,jsp引擎預設都是禁止訪問WEB-INF目錄的,Nginx 配合Tomcat做均衡負載或叢集等情況時,問題原因其實很簡單,Nginx不會去考慮配置其他型別引擎(Nginx不是jsp引擎)導致的安全問題而引入到自身的安全規範中來(這樣耦合性太高了),修改Nginx配置檔案禁止訪問WEB-INF目錄就好了: location ~ ^/WEB-INF/* { deny all; } 或者return 404; 或者其他!

                  根據上文,我們先找一下WEB-INF/web.xml,POST傳值

                  在這裡插入圖片描述

                  得到WEB-INF/web.xml檔案,開啟

                  <?xml version="1.0" encoding="UTF-8"?>
                  <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
                           version="4.0">
                  
                      <welcome-file-list>
                          <welcome-file>Index</welcome-file>
                      </welcome-file-list>
                  
                      <servlet>
                          <servlet-name>IndexController</servlet-name>
                          <servlet-class>com.wm.ctf.IndexController</servlet-class>
                      </servlet>
                      <servlet-mapping>
                          <servlet-name>IndexController</servlet-name>
                          <url-pattern>/Index</url-pattern>
                      </servlet-mapping>
                  
                      <servlet>
                          <servlet-name>LoginController</servlet-name>
                          <servlet-class>com.wm.ctf.LoginController</servlet-class>
                      </servlet>
                      <servlet-mapping>
                          <servlet-name>LoginController</servlet-name>
                          <url-pattern>/Login</url-pattern>
                      </servlet-mapping>
                  
                      <servlet>
                          <servlet-name>DownloadController</servlet-name>
                          <servlet-class>com.wm.ctf.DownloadController</servlet-class>
                      </servlet>
                      <servlet-mapping>
                          <servlet-name>DownloadController</servlet-name>
                          <url-pattern>/Download</url-pattern>
                      </servlet-mapping>
                  
                      <servlet>
                          <servlet-name>FlagController</servlet-name>
                          <servlet-class>com.wm.ctf.FlagController</servlet-class>
                      </servlet>
                      <servlet-mapping>
                          <servlet-name>FlagController</servlet-name>
                          <url-pattern>/Flag</url-pattern>
                      </servlet-mapping>
                  
                  </web-app>
                  

                  我們可以看到com.wm.FlagController,

                      <servlet>
                          <servlet-name>FlagController</servlet-name>
                          <servlet-class>com.wm.ctf.FlagController</servlet-class>
                      </servlet>
                  

                  servlet-class裡面的.代表的是路徑/
                  然後下載FlagController.class檔案試一試

                  filename=WEB-INF/classes/com/wm/ctf/FlagController.class
                  

                  開啟檔案發現一串base編碼,進行base64解密得到flag

                  在這裡插入圖片描述

                  在這裡插入圖片描述

                  資料1
                  資料2

                  在這裡插入圖片描述

                  百度杯2017二月-Zone真題復現

                  靶場
                  wp1
                  wp2

                  在這裡插入圖片描述

                  1、 嘗試burp抓包發現cookie中有個login,值為0,將0改為1後在訪問首頁,發現可以正常登入

                  在這裡插入圖片描述

                  2、單擊 “manage” (此時還是需要用burp改login的值),點選框框發現比較特殊的url;猜測可能存在檔案包含或者下載、讀取

                  在這裡插入圖片描述

                  3、測試訪問url: xxxxxx.com/manages/admin.php?module=ind…/ex&name=php 頁面可以正常訪問,猜測過濾了一遍…/再試一試繞過 url:url: xxxxxx.com/manages/admin.php?module=ind…/./ex&name=php 訪問不正常;
                  說明過濾機制只是把…/進行了一次過濾,所以我們雙寫…/即可

                  4、訪問測試任意檔案讀取判斷路徑通過不斷加…/ url:?module=…/./…/./…/.http://www.cppcns.com/etc/passwd&name
                  (使用者情況檔案)

                  在這裡插入圖片描述

                  5、檢視下伺服器是nginx。找一下它的配置檔案,根據資訊讀取配置檔案, url: manages/admin.php?module=…/./…/./…/./etc/nginx/nginx.conf 獲得關鍵檔案sites-enabled/default 並進行讀取

                  在這裡插入圖片描述

                  module=…/./…/./…/./etc/nginx/sites-enabled/default&name=獲得web檔案路徑online-movies 並訪問

                  在這裡插入圖片描述

                  6、發現可以利用的漏洞,因為有一個autoindex on也就是開啟了目錄遍歷,我們可以訪問這個/online-movies/,訪問出現如下,再點選…/發現要進行驗證,把login改為1後頁面空白,我通過百度發現要/online-movies/…才能遍歷(不清楚為什麼)

                  在這裡插入圖片描述

                  7、訪問/online-movies…/

                  在這裡插入圖片描述

                  8、地址為:online-movies…/var/www/html/flag.php構造url下載到flag.php獲得flag

                  到此這篇關於案例講解WEB 漏洞-檔案操作之檔案下載讀取的文章就介紹到這了,更多相關WEB 漏洞檔案下載讀取內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!