zoukankan      html  css  js  c++  java
  • 32:WEB漏洞文件操作之文件下载读取全解

    思维导图

    知识点

    文件下载,读取

    • 原理,检测,利用,修复等

    漏洞发现

    从文件名,参数值,目录符号等
    read.xxx?filename=
    down.xxx?filename=
    readfile.xxx?file=
    downfile.xxx?file=
    ../ ..\ .\ ./ 等
    %00 ? %23 %20 .等
    &readpath=  &filepath=  &path=  &inputfile=  &url=  &data=  &readfile=  &menu=  META-INF=  WEB-INF
    • 1.文件被解析,则是文件解析漏洞
    • 2.显示源代码,则是文件读取漏洞
    • 3.提示文件下载,则是文件下载漏洞

    漏洞利用

    • 数据库配置文件下载或者读取后续
    • 接口密钥信息文件下载或者读取后续

    对应文件

    • 配置文件(数据库,平台,各种等)
    利用:(信息收集信息>猜路径 >>下载配置文件/代码文件 >> 利用服务器软件漏洞> shell> 提权)
    
    1.任意文件下载漏洞的利用主要是为了信息收集,我们通过对服务器配置文件的下载,获取到大量的配置信息、源码,从而根据获取的信息来进一步挖掘服务器漏洞从而入侵。
    
    2.下载常规的配置文件,例如: ssh,weblogic,ftp,mysql等相关配置
    下载各种.log文件,从中寻找一些后台地址,文件上传点之类的地方,如果运气好的话会获得一些前辈们的后门。
    下载web业务文件进行白盒审计,利用漏洞进一步攻入服务器。
    
    3.平台文件
    Windows:(windows的这些路径不一定都存在)
        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配置信息
        C:\Windows\win.ini             //Windows系统的一个基本系统配置文件
    
    Linux:
        /root/.ssh/authorized_keys
        /root/.ssh/id_rsa
        /root/.ssh/id_ras.keystore
        /root/.ssh/known_hosts             //记录每个访问计算机用户的公钥
        /etc/passwd
        /etc/shadow
        /usr/local/app/php5/lib/php.ini                //PHP配置文件
        /etc/my.cnf                 //mysql配置文件
        /etc/httpd/conf/httpd.conf             //apache配置文件
        /root/.bash_history             //用户历史命令记录文件
        /root/.mysql_history             //mysql历史命令记录文件
        /proc/mounts                 //记录系统挂载设备
        /porc/config.gz                //内核配置文件
        /var/lib/mlocate/mlocate.db         //全文件路径
        /porc/self/cmdline             //当前进程的cmdline参数
    
    参考:https://www.cnblogs.com/zzhoo/p/12613815.html
    

    如何得到数据库配置文件?

    • 1.扫描工具爬行或者扫描地址
    • 2.下载好的文件代码中去分析路径和包含文件函数

    Javaweb文件下载代码

    • 参考:https://blog.csdn.net/Cheng_may/article/details/78600833
    • download.jsp:
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        <title>文件下载</title>
      </head>
      
      <body>
      	<a href="/download/DownloadServlet?filename=1.jpg">文件下载</a>
      </body>
    </html>
    • DownloadServlet:
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		
    		response.setCharacterEncoding("UTF-8");
    		//设置ContentType字段值
    		response.setContentType("text/html;charset=utf-8");
    		//获取所要下载的文件名称
    		String filename = request.getParameter("filename");
    		//下载文件所在目录
    		String folder = "/filename/";
    		//通知浏览器以下载的方式打开
    		response.addHeader("Content-type", "appllication/octet-stream");
    		response.addHeader("Content-Disposition", "attachment;filename="+filename);
    		//通知文件流读取文件
    		InputStream in = getServletContext().getResourceAsStream(folder+filename);
    		//获取response对象的输出流
    		OutputStream out = response.getOutputStream();
    		byte[] buffer = new byte[1024];
    		int len;
    		//循环取出流中的数据
    		while((len = in.read(buffer)) != -1){
    			out.write(buffer,0,len);
    		}
    		
    	}

    本课重点:

    • 案例1:pikuchu靶场-文件下载测试-参数
    • 案例2:Zdns网站文件下载真实测试-功能点
    • 案例3:小米路由器-文件读取真实测试-漏洞
    • 案例4:RoarCTF2019-文件读取真题复现
    • 案例5:百度杯2017二月-Zone真题复现-比赛拓展

    案例1:pikuchu靶场-文件下载测试-参数

    <1>打开显示如下,点击人名可以下载对应图片。

    <2>抓包得到对应下载地址如下:

    http://127.0.0.1:8080/pikachu/vul/unsafedownload/execdownload.php?filename=ai.png

    <3>修改filename参数值如下,成功下载execdownload.php文件,说明存在文件下载漏洞。 

    <4>可以使用扫描工具爬行或扫描地址,直接找到配置文件,或者通过下载代码文件分析其中包含的文件路径等,找到配置文件等敏感文件。 

    <5>分析配置文件路径,构造filename参数值,使其指向配置文件地址,下载。

     

    <6>在配置文件中可以找到数据库用户名密码等敏感信息,方便后期利用。

    案例2:Zdns网站文件下载真实测试-功能点

    <1>网站打开如下,找到下载功能点,点击下载。

    <2>抓包获取下载请求,分析如下。 

     

    <3>下载请求参数值是一个路径+文件名,猜测含有文件下载漏洞。这里我们不知道网站的代码结构,因此无法构造请求下载敏感文件。

    <4>本案例主要是告诉我们下载漏洞在哪里测?下载漏洞怎么判断存在等。 

     一般去找下载功能点测试,观察下载接口参数值是不是文件名,是不是可以改为其他文件名或文件路径。

    案例3:小米路由器-文件读取真实测试-漏洞

    地址:https://www.seebug.org/vuldb/ssvid-98122

    远程任意文件读取漏洞(CVE-2019-18371)

    小米路由器的nginx配置文件错误,导致目录穿越漏洞,实现任意文件读取(无需登录)

    nginx配置不当可导致目录穿越漏洞

    location /xxx {
    alias /abc/;
    }
    

    可通过访问http://domain.cn/xxx../etc/passwd实现目录穿越访问上级目录及其子目录文件。

    在小米路由器的文件/etc/sysapihttpd/sysapihttpd.conf中,存在

    location /api-third-party/download/extdisks {
    alias /extdisks/;
    }
    

    故可以任意文件读取根目录下的所有文件,而且是root权限,如访问http://192.168.31.1/api-third-party/download/extdisks../etc/shadow

    在fofa上搜索“小米路由器”,找到真实地址访问测试,成功下载文件。

     

    案例4:RoarCTF2019-文件读取真题复现-比赛

    地址:https://buuoj.cn/challenges#%5BRoarCTF%202019%5DEasy%20Java 

    思路:

    • 爬虫扫描地址-分析参数名参数值-文件操作安全-对应脚本
    • 修改提交方式测试-读取WEB配置文件WEB-INF/web.xnl
    • 访问读取对应地址-访问读取flag对应class文件-(WEB-INF/classes/com/wm/ctf/FlagController.class)

    案例演示

    <1>打开首页是一个登录框

    <2> 点击help会触发一个文件下载请求:http://xx.cn/Download?filename=help.docx

    <3>直接get该请求,报错,原因是java代码设置了post请求方式

    <4>改为post请求,成功下载help文件。

    <5>help文件内容如下,说明flag并不在这里。但是通过分析请求参数,猜测这里有文件下载读取漏洞

    <6>将filename值改为java的配置文件,成功读取到配置文件并在配置文件中找到了flag对应地址

    <7>尝试访问flag文件路径,报错,但是报错信息暴露了一个文件地址(该地址在配置文件中也有)

    <8>下载该文件 ,成功拿到flag。

    案例5:百度杯2017二月-Zone真题复现-比赛拓展

    地址:https://www.ichunqiu.com/battalion?t=1&r=57475

    <1>首页是一个登录页面

    <2>首页抓包,将cookie中的login=0改为login=1,成功登录。

    <3>点击manage,继续抓包,将cookie中的login=0改为login=1

    <4>抓到下一个请求接口,这个接口很关键,有module=index&name=php参数,意思是访问index.php文件。

    <5>尝试修改参数值,实现对指定文件的读取。.../.绕过了../过滤

    GET /manages/admin.php?module=..././..././..././etc/nginx/nginx.conf&name= HTTP/1.1
    
    

    参考:https://blog.csdn.net/kostart123/article/details/81223189

  • 相关阅读:
    C语言 · 最小公倍数
    SSH实战 · SSH项目开发环境搭建
    C语言 · 回文数
    C语言 · 特殊回文数
    C语言 · 查找整数
    SSH实战 · SSH项目中怎么玩验证码
    SSH实战 · JAVA发送邮件相关
    SSH实战 · AJAX异步校验
    C语言 · 打印1-200之间的素数
    Jenkins权限设计错误解决办法
  • 原文地址:https://www.cnblogs.com/zhengna/p/15639099.html
Copyright © 2011-2022 走看看