【第十七天 - 文件读取漏洞】

Q1. 什麽是文件读取漏洞?

  • 骇客可以透过一些手段读取无授权的档案,时常作为资讯收集的一种手段,例如服务器的配置、密钥、服务器资讯等
  • 工程师开发时,若文件读取的参数会从使用者的输入动态生成,此时又没有对输入进行充分的检查、将所有意外情况考虑清楚,便很容易产生文件读取漏洞

Q2. 文件读取漏洞常见的触发点

  1. Web 语言

    1. PHP:许多函数都可能造成

      1. 函数
        1. file_get_contents()
        2. file()
        3. fopen()
        4. fread()
        5. fgets()
        6. include()
        7. require()
        8. include_once()
        9. require_once()
        10. system()
        11. exec()
        12. highlight_file()
        13. readfile()
        14. fgetss()
        15. parse_ini_file()
        16. show_source()
      2. 常见的情况
        1. 文件路径前面可控制,後面不可控:
          • 开头可以改为其他协定 (e.g. file://http:// )
          • 尾部不可控的部分可以使用 \x00 截断,对应 URL 编码是 %00
        2. 文件路径前面不可控制,後面可控:
          • 开头不可控,此时就无法使用其他协议 (e.g. file://http:// )
          • 可以使用 ../ 相对路径来取上层档案
        3. 文件路径前後皆不可控制,中间可控:
          • 开头不可控,此时就无法使用其他协议 (e.g. file://http:// )
          • 尾部可以使用 \x00 截断,对应 URL 编码是 %00
    2. Python

      • os.path.join 的参数若有根目录,会直接将前面的路径覆盖,例如 join("/var/www/html", "/etc") 会得到 /etc
    3. Java

      • 一些模组读取文件时如同 PHP 一样,支援 file:// 协定,若可以控制读取路径,便可能造成任意文件读取漏洞。
    4. Ruby

      • ROR
        • CVE-2018-3760
        • CVE-2019-5418
    5. Node

      • express
        • CVE-2017-14849
  2. Server 端

    1. Nginx 错误配置

      现代网页框架时常会将网页的进入点限缩在一个 static 或是 public 资料夹,因此部署时需要将网页服务器的根目录设置为此资料夹,而主要的程序码都在该资料夹之外,藉此降低泄漏原始码的可能性。

      然而,设置网页服务器时,若未能正确设定,也可能导致攻击者能逃出该资料夹的限制。

      例如:

      location /public {
      	alias /var/www/html/laravel/;
      }
      

      若攻击者连上 /public../ ,便相当於存取 /var/www/html/laravel/../

      参考资料: https://www.acunetix.com/vulnerabilities/web/path-traversal-via-misconfigured-nginx-alias/

    2. Database

      MySQL 可以用 LOAD_FILE 函数读取档案内容,转为字串;又或者 LOAD DATA LOCAL INFILE 语法读取档案,将资料存於 Table。

      参考资料:

    3. 软连结

      软连结就如同 Windows 上的捷径,会纪录连结指向的真实路径,攻击者若有机会上传软连结,并可以存取该档案,便能够使软连结指向任意路径,达成任意文件读取。

    4. FFmpeg

      ffmpeg 是强大的开源影音转档工具,许多线上转档网页背後可能便是使用 ffmpeg,经由 ffmpeg 的漏洞可以达成任意文件读取。

      参考资料:https://www.freebuf.com/articles/web/258320.html

    5. Docker-API

      Docker 使用者一般来说会使用指令 docker 来进行操作,但实际上他是 client-server 架构的应用程序,通常是使用 unix domain socket 沟通,但 docker server 也支援使用 http 的 API 进行操控。

      当我们能够 SSRF 时,可以尝试使用 docker API,将 docker 外的文件复制到 container 中。

  3. Client 端

    1. 浏览器/Flash XSS

      • 早期网页中还盛行嵌入 flash 时,时常会有任意文件读取的漏洞被发现与开采。
      • 而现在 JavaScript 一般来说基於 Same Origin Policy,不会允许直接读取本地档案,但仍有机会因浏览器的漏洞而被绕过。
    2. MarkDown 语法解析器 XSS

      MarkDown 的渲染引擎有机会支援 JavaScript,但又没有浏览器那麽健全的保护机制,从而能利用类似 XSS 的方式,将恶意 JS 植入,并藉此读取文件。

  • 简而言之,只要有文件读取、下载的地方,都有可能有文件读取漏洞

参考资料:https://www.bilibili.com/read/cv10661099

Q3. 文件读取漏洞常见的路径

  1. Linux

    1. 相对路径 (flag 名称)
      1. 可以使用 fuzz flag 名称就可以得到答案
      2. 例如:
        1. 副档名可能有 .txt | .php | .pyc | .py
        2. 路径:../../../[已知路径|etc|tmp|root|home|home+已知路径]/flag
    2. 服务器资讯 (绝对路径)
      1. /etc:Unix 及 Unix-like 作业系统中,用来存放各种设定档的目录,包括系统设定与应用程序设定,因此是文件漏洞读取的首要目标

      2. /etc/passwd:储存 user 资讯与 user工作目录的文件,可以得知系统有哪些 user、属於哪一个 group,此文件所有 user 皆可读,一般被用作是否有文件读取漏洞存在的基准
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592yJWa3yaZTa.png

      3. /etc/shadow:Linux 系统保存 user 资讯 及 密码 hash 的文件(可能存在),只有 root 可读写、shadow group 可读,一般情况下,网页服务器无法读取此文件
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592BF9JoBRcbM.png

      4. /etc/apache2/*:Apache 的配置文件,可以知道 Web 目录,服务 port 等

      5. /etc/nginx/*:是 Nginx 配置文件(nginx 功能与 apache 相似),可以知道 Web 目录,服务 port 等

      6. /etc/apparmor(.d)/*: Apparmor 配置文件,可以知道各种应用系统调用的白名单、黑名单。例如可以透过文件得知 MySQL 是否禁止系统调用、是否可以使用 user 自定义的 function 来执行系统命令

      7. /etc/cron.d/*/etc/crontab: 里面放定时任务文件
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592ib9s5peoTJ.png

      8. /etc/environment:是环境变量配置文件之一,可能存在大量目录资讯的泄漏,甚至出现 secret key 泄漏的情况
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592p5mpRS3C6Z.png

      9. /etc/hostname:表示主机名
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592KIb4fkn7q5.png

      10. /etc/hosts:是主机名查询静态表,包含指定域名解析 IP 的成对资讯,通过这个文件可以探测网卡资讯和内网 IP 或域名
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592xkpVVxWKQy.png

      11. /etc/issue:指明系统版本
        https://ithelp.ithome.com.tw/upload/images/20211001/20140592GYaP4eF8zE.png

      12. /etc/mysql/*:是 MySQL 配置文件

      13. /etc/php/*:是 PHP 配置文件

      14. /proc:通常储存着 process 动态运行的各种资讯,本质是一种虚拟目录,如果查看当前 process 的资讯,只需 /proc/self/
        https://ithelp.ithome.com.tw/upload/images/20211001/201405922exn4UwI1T.png

        1. /proc/[pid]/cmdline (指向 process 对应的 cmd 命令)
        2. /proc/[pid]/cwd (指向 process 的运行目录)
        3. /proc/[pid]/environ (指向 process 运行的环境变量)
      15. 其他目录

        1. /usr/local/nginx/conf
        2. /var/log/*: 放置系统日志的地方,也可尝试读取 /var/log/apache2/access.log
        3. /var/www/html/: Apache 默认的网页根目录
        4. /var/lib/php/sessions/: user 的 session
        5. [已知家目录]/.bash_history:可以看到历史执行命令
        6. [已知家目录]/.bashrc:部分环境变数
        7. [已知家目录]/.ssh/*
          1. /authorized_keys
          2. /id_rsa(.pub|keystore):ssh 的公私钥
          3. /known_hosts
        8. [已知家目录]/.viminfo:vim 使用纪录

    参考资料:https://www.freebuf.com/articles/web/229648.html

  2. Windows

    • C:\boot.ini (查看系统版本)
    • C:\Program Files\mysql\my.ini (Mysql配置)
    • C:\Program Files\mysql\data\mysql\user.MYD (Mysql root)
    • C:\Windows\System32\inetsrv\MetaBase.xml (iis配置文件)
    • C:\Windows\repair\sam (储存系统初次安装的密码)
    • C:\Windows\php.ini (php配置信息)
    • C:\Windows\my.ini (Mysql配置信息)
    • C:\Windows\win.ini (Windows的基本系统配置文件)

参考文章:https://www.bilibili.com/read/cv10661099


<<:  [经典回顾]硬碟装满资料会变重吗?

>>:  【在厨房想30天的演算法】Day 16 演算法 : 排序 sort III 希尔、摇晃、基数

帮服务建置布署流程至 EC2

有了建置 Image 的流程,和前後端分离的机制,接着我们就可以设定 CICD 的流水线来进行服务自...

Eloquent ORM - 编辑资料

编辑单一资料 如果用 Route::resource 建立 API 的话,编辑单一资料的路由会是 请...

[Day - 21] - 规律的一天从Spring Scheduled 开始

Abstract 大家每天都是新的开始,都有24H小时给你规划,系统跟人类一样都是有自己的周期性计画...

范例(二)预测心血管疾病的可能性

第二个范例将以心血管疾病的Dataset进行说明如何执行training、tracking与serv...

Day 13 : 优化 Zettelkasten 卡片盒笔记法,试试Evergreen Note (长青笔记)

前言 在 上一篇文章 中讲完了 Zettelkasten 笔记法,这篇文章来讲它的优化版本 - An...