案例讲解WEB 漏洞-文件操作之文件下载读取

目录
  • 原理
  • 漏洞危害
  • 利用方式
  • 系统文件
    • window
    • Linux
  • 常见脚本敏感文件参考
  • 任意文件读取
  • 任意文件下载
  • Google search
  • 漏洞利用代码
  • 漏洞挖掘
  • 漏洞验证
  • 漏洞防范
  • 案例
    • pikuchu靶场-文件下载测试
    • 小米路由器-文件读取真实测试-漏洞
    • RoarCTF2019-文件读取真题复现
    • 百度杯2017二月-Zone真题复现

原理

产生:任意语言代码下载函数
文件下载(一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是文件查看与下载漏洞。)

文件下载功能在很多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 漏洞文件下载读取内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python脚本实现Web漏洞扫描工具

    这是去年毕设做的一个Web漏洞扫描小工具,主要针对简单的SQL注入漏洞.SQL盲注和XSS漏洞,代码是看过github外国大神(听说是SMAP的编写者之一)的两个小工具源码,根据里面的思路自己写的.以下是使用说明和源代码. 一.使用说明: 1.运行环境: Linux命令行界面+Python2.7 2.程序源码: Vim scanner//建立一个名为scanner的文件 Chmod a+xscanner//修改文件权限为可执行的 3.运行程序: Python scanner//运行文件 若没有携

  • 案例讲解WEB 漏洞-文件操作之文件下载读取

    目录 原理 漏洞危害 利用方式 系统文件 window Linux 常见脚本敏感文件参考 任意文件读取 任意文件下载 Google search 漏洞利用代码 漏洞挖掘 漏洞验证 漏洞防范 案例 pikuchu靶场-文件下载测试 小米路由器-文件读取真实测试-漏洞 RoarCTF2019-文件读取真题复现 百度杯2017二月-Zone真题复现 原理 产生:任意语言代码下载函数 文件下载(一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够

  • python文件操作seek()偏移量,读取指正到指定位置操作

    python 文件操作seek() 和 telll() 自我解释 file.seek()方法格式: seek(offset,whence=0) 移动文件读取指针到制定位置 offset:开始的偏移量,也就是代表需要移动偏移的字节数. whence: 给offset参数一个定义,表示要从哪个位置开始偏移:0代表从文件开头算起,1代表开始从当前位置开始算起,2代表从文件末尾开始算起.当有换行时,会被换行截断. seek()无返回值,故值为None tell() : 文科文件的当前位置,即tell是获

  • Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)

    复制代码 代码如下: using System; using System.IO; using System.Text; using System.Data; using System.Web.UI; using System.Web.UI.WebControls; namespace ec { /// <summary> /// 文件操作类 /// </summary> public class FileObj : IDisposable { private bool _alre

  • java文件操作练习代码 读取某个盘符下的文件

    复制代码 代码如下: import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.io.InputStream;import java.io.Reader; public class IORea

  • R语言对CSV文件操作实例讲解

    在 R 语言中,我们可以从存储在 R 语言环境外的文件中读取数据. 我们还可以将数据写入将被操作系统存储和访问的文件. R 语言可以读取和写入各种文件格式,如​csv​,​excel​,​xml​等. 在本章中,我们将学习从​csv​文件读取数据,然后将数据写入​csv​文件. 该文件应该存在于当前工作目录中,以便 R 语言可以读取它. 当然我们也可以设置我们自己的目录并从那里读取文件. 获取和设置工作目录 您可以使用​getwd()​函数检查R语言工作区指向的目录. 您还可以使用​setwd(

  • Java对文件进行基本操作案例讲解

    File文件类 java.io.File是文件和目录的重要类(JDK6及以前是唯一) 目录也使用File类进行表示 File类与操作系统无关,但会受到操作系统的权限限制 常用方法 createNewFile , delete , exists , getAbsolutePath , getName , getParent , getPath isDirectory , isFile , length , listFiles , mkdir , mkdirs File不涉及到具体的文件内容.只会涉

  • Scala文件操作示例代码讲解

    目录 1. 读取数据 1.1 按行读取 1.2 按字符读取 Scala使用source.buffered方法按字符读取文件 一个示例 1.3 读取词法单元和数字 1.4 从URL或者其他源读取数据 1.5 读取二进制文件 2. 写入文件 2.1 使用java.io.PrintWriter类 2.2 使用java.io.FileWriter类 2.3 使用java.io.FileOutputStream类 2.4 几种写入的区别 2.5 使用第三方库 3. Scala序列化和反序列化 3.1 什么

  • 基于node.js的fs核心模块读写文件操作(实例讲解)

    node.js 里fs模块 常用的功能 实现文件的读写 目录的操作 - 同步和异步共存 ,有异步不用同步 - fs.readFile 都不能读取比运行内存大的文件,如果文件偏大也不会使用readFile方法 - 文件大分流读取,stream - 引入fs模块 - let fs=require('fs') 同步读取文件 -fs.readFileSync('路径',utf8); let result=fs.readFileSync('./1.txt','utf8'); 异步读取文件,用参数err捕获

  • PHP实现的文件操作类及文件下载功能示例

    本文实例讲述了PHP实现的文件操作类及文件下载功能.分享给大家供大家参考,具体如下: 文件操作类: <?php // Copyright 2005, Lee Babin (lee@thecodeshoppe.com) // This code may be used and redistributed without charge // under the terms of the GNU General Public // License version 2.0 or later -- www

  • Java操作数据库连接池案例讲解

    数据库连接池 概念:其实就是一个容器(集合),存放数据库连接的容器. 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器. 好处: 节约资源 用户访问高效 实现: 标准接口:DataSource javax.sql包下的 方法: 获取连接:getConnection() 归还连接:Connection.close().如果连接对象Connection是从

随机推荐